Web Scraping & OSINT Techniques
Como extrair dados de um site sem DOM mas com embedded API/JSON, hidden endpoints e JavaScript-rendered components?
#01 Introdução
Recentemente, precisei coletar indicadores de monitoramento de desinformação disponibilizados pelo projeto Radar Aos Fatos. O objetivo era simples: gerar um relatório semanal contendo algumas métricas específicas para análise posterior de outro projeto pessoal.
Em um primeiro instante cogitei utilizar web scraping pelo simples fato do conteúdo estar disponível em uma página web aberta ao público. No entanto, após investigar a estrutura da mesma, percebi que teria de ter outra abordagem.
#02 O Problema
A página disponibiliza diferentes abas contendo informações provenientes de:
- Web
- YouTube
- Telegram
Em cada um deles há o cálculo de uma média analisando a qualidade do conteúdo proveniente de grupos, páginas e seu respectivo conteúdo. Tais métricas estão disponibilizadas em uma mesma estrutura relativamente simples, mas os dados não são carregados pelo carregador e disponibilizados diretamente no HTML. Esse comportamento é característico de aplicações modernas as quais utilizam frameworks em JavaScript e comumente chamamos de componentes dinâmicos.
Mas o diferencial dessa estrutura, dessa página em específico, é a inexistência de DOM (Direct Object Model), pois até mesmo ele é um componente renderizado por javascript - parabéns aos programadores!
#03 Investigando o Tráfego de Rede
De uma coisa eu sei: se o navegador consegue exibir os dados, então ele também precisa recebê-los de alguma fonte.
A partir dessa premissa mudei minha estratégia, ao invés de tentar extrair elementos da interface, utilizei as ferramentas de desenvolvedor do navegador para localizar de onde essas informações estavam sendo carregadas.
3.1. Abrir o DevTools
Inspecione a página (botão direito, F12 ou CTRL + I).
3.2. Acessar a aba Network
Na aba Network, filtre as requisições por:
Fetch/XHR
3.3 Navegar entre as abas do sistema
Ao alternar entre WhatsApp, Web, YouTube e Telegram, novas requisições começaram a aparecer sendo possível encontrar os hidden endpoints responsáveis pelo fornecimento dos dados.
#04 Descobrindo a API
Os dados eram disponibilizados através de endpoints REST diferentes à URL da página:
https://radar-api.aosfatos.org/api/panorama/whatsapp/
Cada aba possuí um URL próprio:
/api/panorama/web/
/api/panorama/youtube/
/api/panorama/telegram/
#05 Entendendo o JSON
Ao acessar um dos endpoints foi possível obter a seguinte estrutura:
{
"count": 920,
"next": "...",
"results": [...],
"average_grade": 3.3,
"count_messages": 14059,
"count_groups": 153,
"count_bad_messages": 1355
}
Os indicadores que eu precisava eram:
- average_grade
- count_messages
- count_groups
Como esses campos estavam na raiz do JSON, poderiam ser acessados diretamente.
Exemplo usando JSONPath:
$.average_grade
$.count_messages
$.count_groups
#06 Automatizando com Python
Primeiro, criamos um dicionário contendo as URLs de cada canal:
URLS = {
"WhatsApp": "...",
"Web": "...",
"YouTube": "...",
"Telegram": "..."
}
Em seguida, realizamos as requisições:
import requests
response = requests.get(url)
dados = response.json()
Extraímos os indicadores desejados:
{
"Canal": canal,
"Average Grade": dados["average_grade"],
"Count Messages": dados["count_messages"],
"Count Groups": dados["count_groups"]
}
#07 Gerando um Relatório
Utilizando Pandas:
import pandas as pd
df = pd.DataFrame(relatorio)
#08 Agendando a Execução Semanal
Com o script pronto, o próximo passo foi automatizar sua execução.
Algumas opções incluem:
- Agendador de Tarefas do Windows
- Cron no Linux
- GitHub Actions
- Serviços de automação como n8n
Dessa forma, o relatório pode ser gerado automaticamente todos os domingos, sem intervenção manual.
#09 Lições Aprendidas
Durante esse processo, algumas lições ficaram claras:
9.1. Nem todo problema exige web scraping
Muitas aplicações modernas consomem APIs públicas ou semipúblicas. Antes de construir um scraper complexo, vale a pena investigar as requisições realizadas pelo navegador.
9.2. DevTools é uma ferramenta poderosa
Muitas vezes, a resposta está na aba Network. Entender como inspecionar requisições pode economizar horas de desenvolvimento.
9.3. APIs tornam a automação mais robusta
Consumir diretamente a fonte dos dados costuma ser:
- Mais rápido
- Mais estável
- Mais simples de manter
#10 Conclusão
Ao investigar o funcionamento da aplicação, foi possível substituir uma estratégia de scraping por uma solução baseada em APIs REST. Além de simplificar a implementação, isso permitiu criar uma automação semanal capaz de gerar relatórios estruturados para análise futura. Esse tipo de abordagem pode ser aplicado em diversos projetos de monitoramento, Business Intelligence, ciência de dados e automação de processos.



