Arquitetura — visão geral
O coletor é um pacote Python pequeno (scripts/brnews/, ~1.600 linhas) com quatro
módulos de responsabilidade única, amarrados por uma CLI
(scripts/collect_news.py).
Ciclo de vida de uma execução
- Carregar feeds —
feedlist.load_feeds("rss.txt")devolve a lista deFeeds, já sem duplicatas e com slug/grupo/seção derivados do nome. - Montar o
Fetcher— com os proxies deload_proxies(), a ordem de rotas e os limites de tempo/tentativas da CLI. - Coletar em paralelo —
Collector.run()despacha um worker por feed numThreadPoolExecutor(padrão: 8 threads). - Por feed — baixar com failover de rotas, validar ("tem notícia? não é página
de bloqueio?"), parsear (RSS, HTML ou Markdown), normalizar cada item, deduplicar
por
ide aplicar filtros (--limit-per-feed,--max-age-days,--skip-seen). - Gravar — na ordem original de
rss.txt: snapshotnews-<timestamp>Z.jsonl(nunca sobrescreve), relatório.report.jsone uma linha nova emdata/index.jsonl. - Reportar — resumo Markdown no terminal e no
$GITHUB_STEP_SUMMARY, outputs para os próximos jobs e anotações::notice/::warningno GitHub.
Decisões de projeto
- Append-only. Snapshots nunca são sobrescritos (
snapshot_pathsacrescenta-2,-3… em caso de colisão de timestamp) e o workflow de publicação só adiciona arquivos.data/index.jsonlusamerge=unionno.gitattributespara que pushes concorrentes se fundam sem conflito. - Um feed nunca derruba a coleta. Cada worker captura qualquer exceção e a
transforma em um
FeedReportcomstatus="error"; o restante segue. - Validação antes de aceitar. Uma resposta HTTP 200 não basta: o conteúdo precisa conter notícias de verdade. Isso permite failover até quando o site devolve uma página de bloqueio "bem-sucedida".
- Threads, não asyncio. O gargalo é I/O de rede simples;
requests+ um pool de threads com sessão por thread (threading.local) mantém o código legível. - Segurança no CI. O job que acessa a internet roda sem token de escrita
(
persist-credentials: false); só o job de publicação, que não acessa rede externa, recebecontents: write. Veja Coleta semanal.
Páginas desta seção
| Página | Módulo | Conteúdo |
|---|---|---|
| feedlist | scripts/brnews/feedlist.py | formato de rss.txt, Feed, slugs |
| fetcher | scripts/brnews/fetcher.py | rotas, ProxyPool, espelhos, anti-bloqueio |
| parsers | scripts/brnews/parsers.py | RSS/Atom, JSON-LD, cards, Markdown, limpeza |
| collector | scripts/brnews/collector.py | orquestração, dedupe, escrita, relatórios |