Monitorar a publicação de artigos em portais de notícias em tempo real é um requisito comum para inteligência de mercado, análise de sentimento e modelos de linguagem. No entanto, criar um script de coleta que opere ininterruptamente traz desafios técnicos consideráveis: layouts dinâmicos, mudanças frequentes no DOM, bloqueios de taxa de requisições (rate limiting) e a necessidade de separar o corpo editorial de anúncios, menus e rodapés.
Neste artigo, você entenderá como arquitetar um pipeline de crawling contínuo em Python, focado em alta disponibilidade, baixo consumo de recursos e precisão na extração de texto.
1. A Estratégia de Descoberta: RSS, Sitemaps e Crawling Profundo
Tentar varrer páginas iniciais inteiras a cada poucos minutos é ineficiente e aumenta drasticamente o risco de bloqueio de IP. A abordagem mais eficiente envolve uma estratégia híbrida:
- Feeds RSS e Atom: A maioria dos veículos publica atualizações quase instantâneas via RSS. Essa é a camada mais leve para descobrir novas URLs.
- Sitemaps XML de Notícias: Grandes portais mantêm sitemaps específicos (geralmente atualizados a cada 48 horas) contendo as URLs publicadas recentemente.
- Varredura Recursiva Controlada: Aplicada apenas a seções específicas onde feeds não estão disponíveis, limitando a profundidade do link crawler.
2. Concorrência e Performance com Asyncio e HTTPX
Para garantir que o script processe dezenas de fontes simultaneamente sem sobrecarregar a memória, o uso de I/O assíncrono é indispensável. A biblioteca httpx combinada com asyncio permite gerenciar pools de conexões e executar requisições não bloqueantes.
Um exemplo de controle de fluxo com semáforo para evitar sobrecarga:
python
import asyncio
import httpx
SEMAPHORELIMIT = 10
semaphore = asyncio.Semaphore(SEMAPHORELIMIT)
async def fetcharticle(client: httpx.AsyncClient, url: str) -> str:
async with semaphore:
try:
response = await client.get(url, timeout=10.0, followredirects=True)
response.raiseforstatus()
return response.text
except httpx.HTTPError as exc:
# Tratar log de falha de conexão
return “”
O uso de semáforos garante que o número de requisições simultâneas permaneça estável, respeitando os limites operacionais da sua infraestrutura e dos servidores de destino.
3. Extração Estruturada sem Seletores Frágeis
Criar seletores CSS específicos (div.article-body-content-v2) para cada portal torna o sistema quebradiço. Uma alteração no layout da fonte invalida a extração.
Como especialista em IA e engenharia de dados, recomendo o uso de algoritmos baseados em densidade de texto e árvores DOM, como a biblioteca trafilatura. Ela analisa a estrutura do documento e remove automaticamente elementos de navegação, publicidade e scripts, retornando apenas o texto do artigo limpo e metadados essenciais (data de publicação, autor e título).
python
import trafilatura
def extractcleancontent(html: str) -> dict:
extracted = trafilatura.extract(
html,
includecomments=False,
includetables=True,
outputformat=”json”,
withmetadata=True
)
return extracted
4. Deduplicação e Persistência Confiável
Em um pipeline contínuo, evitar o reprocessamento de links já lidos reduz o tráfego de rede e custos de banco de dados. Uma arquitetura recomendada combina:
- Redis (Bloom Filter ou Sets): Armazena hashes SHA-256 das URLs visitadas para validação em tempo constante ($O(1)$) antes de disparar o download.
- Fila de Mensagens (RabbitMQ ou Celery): Desacopla o coletor de URLs do módulo de parsing e enriquecimento textual.
- Banco de Dados Relacional ou Document Store: Onde os textos normalizados são armazenados com índices em timestamp e domínio.
Conclusão e Próximos Passos
Construir um sistema de monitoramento de notícias robusto exige mais do que um script com requests e BeautifulSoup. Demanda controle de taxa, estratégias inteligentes de parsing e tratamento de erros de rede para operar ininterruptamente.
Se a sua empresa precisa de pipelines de extração de dados, raspagem em larga escala ou integração de dados brutos com modelos de Inteligência Artificial, entre em contato para uma consultoria técnica especializada.


