Este projeto contém um script em Python que faz download de dados do Portal da Transparência, filtrando por um estado específico (por padrão, RJ) e por uma faixa de anos (2019 a 2024).
Para cada ano, salva em um arquivo CSV local, convertendo campos (por exemplo, o valor) e extraindo algumas informações adicionais (como o idMunicipio).
-
Python 3.7+ instalado (recomendado Python 3.9 ou superior).
-
As seguintes bibliotecas:
requests(para requisições HTTP)undetected-chromedrivereselenium(para simular um navegador e contornar proteção anti-bot)csv,re,time, etc. (já inclusas na biblioteca padrão do Python, excetotimeereque são nativas)- Além de outras que podem estar listadas no
requirements.txt.
Em algumas versões mais recentes do Python, o módulo distutils não está mais incluído por padrão, o que pode gerar erros ao instalar undetected-chromedriver. Se isso ocorrer, tente:
pip install --upgrade setuptools wheelou instalar python3-distutils via gerenciador de pacotes (em Linux).
-
Clonar este repositório (ou baixar os arquivos).
-
Entrar na pasta do projeto via terminal:
cd bolsafamilia_scraper -
Criar (opcional, mas recomendado) um ambiente virtual no Python:
python -m venv venv source venv/bin/activate # Linux/Mac # ou venv\Scripts\activate no Windows
-
Instalar as dependências necessárias:
pip install -r requirements.txt
Caso não possua o arquivo requirements.txt, instale manualmente (exemplo):
pip install requests selenium undetected-chromedriverNo terminal, dentro da pasta do projeto (com o ambiente virtual ativado se estiver usando), rode:
python baixar_beneficios.pyOnde baixar_beneficios.py é o nome do script principal. Ajuste caso seu arquivo tenha outro nome.
-
Baixa dados paginados de um endpoint do Portal da Transparência (benefícios sociais).
-
Filtra por um estado definido no código (por padrão,
RJ). -
Itera sobre uma faixa de anos (padrão 2019 até 2024).
-
Para cada ano, cria (ou sobrescreve) um arquivo CSV na pasta
downloads/, contendo os registros daquele ano. O nome do arquivo segue o padrão:bolsafamilia_<ANO>_<UF>.csvExemplos:
bolsafamilia_2019_RJ.csv,bolsafamilia_2020_RJ.csvetc. -
Converte o campo
valor(por exemplo,"2.250,00") para um número decimal (2250.00). -
Extrai do campo
linkDetalhamentooidMunicipio(via expressão regular) e inclui no CSV (no campoidMunicipio). -
Omite campos como
filtroselinkDetalhamentono CSV final, ficando apenas com colunas definidas no script.
Durante o processo, o script:
- Usa Selenium com
undetected-chromedriverpara visitar a página principal e obter cookies (necessários para contornar o WAF/Cloudflare). - Renova esses cookies periodicamente (a cada 1 minuto, por exemplo) para não ser bloqueado.
- Faz um loop paginado (
offset += 20000por padrão), salvando cada lote de registros.
Cada arquivo CSV contém colunas como:
uf(ex.:"RJ")municipio(ex.:"DUQUE DE CAXIAS")ano(ex.:2025)valor(float, ex.:1800.0)skBeneficiario(ex.:18410691)nomeBeneficiario(ex.:"ACARMELUCIA DA SILVA ROCHA")nisBeneficio(ex.:"2.383.451.058-7")cpfBeneficiario(ex.:"***.247.707-**")linguagemCidada(ex.:"Novo Bolsa Família")idMunicipio(extraído dolinkDetalhamento, ex.:"21835")
Cada linha corresponde a um beneficiário/registro retornado pela API do Portal da Transparência.
-
ModuleNotFoundError: No module named 'distutils'-
Tente atualizar
setuptoolsewheel:pip install --upgrade setuptools wheel
-
Em alguns Linux, instale via pacote
python3-distutils.
-
-
HTTP 202, 403, 405, 429 ao fazer requisições
- Indica bloqueio ou limitação do servidor (Cloudflare/WAF). O script tenta contornar renovando cookies e dormindo entre requisições. Ajuste intervalos se persistir.
-
ReadTimeout/ConnectionError- Ocorre quando o servidor demora ou a conexão falha. O script faz até 3 tentativas (
MAX_ATTEMPTS), reabrindo cookies no Chrome se preciso.
- Ocorre quando o servidor demora ou a conexão falha. O script faz até 3 tentativas (
-
“OSError: [WinError 6] Identificador inválido” ao encerrar
- Uma mensagem inofensiva que às vezes aparece na finalização do
undetected-chromedriverno Windows. Geralmente não impede o funcionamento.
- Uma mensagem inofensiva que às vezes aparece na finalização do
-
CSV vazio (só cabeçalho)
- Pode acontecer se não houver dados para aquele ano ou se ocorreu bloqueio inicial. Verifique se a API realmente possui dados para o período e se não houve erro de cookies.
O Portal da Transparência (assim como muitos sites) utiliza Cloudflare ou outro WAF que:
- Injeta JavaScript para validar se o cliente é um navegador real.
- Pode limitar requisições (HTTP 202, 403, 429 etc.) para tráfegos suspeitos.
Para superar isso, o script:
-
Selenium + undetected-chromedriver
- Abre um Chrome real (em modo automatizado), executa o JS do WAF e pega cookies válidos.
- Assim, o servidor vê um “navegador” de verdade, liberando o acesso.
-
Renovação de cookies
- A cada 60 segundos (valor ajustável), reabre o navegador e gera novos cookies.
- Evita que a mesma sessão seja bloqueada se fizer muitas requisições.
-
Intervalos e tentativas
- A cada página, o script aguarda (por padrão,
REQUEST_INTERVAL = 1segundo ou mais) para não parecer um bot muito rápido. - Se receber 202 ou 403, tenta novamente até
MAX_ATTEMPTS, reabrindo cookies caso necessário.
- A cada página, o script aguarda (por padrão,
-
Retry com re-challenge
- Em caso de exceções de rede (timeout) ou bloqueios, faz nova obtenção de cookies com
undetected-chromedrivere repete a requisição do mesmooffset.
- Em caso de exceções de rede (timeout) ou bloqueios, faz nova obtenção de cookies com
Estas estratégias reduzem a chance de bloqueio, mas não garantem 100% — se o portal tiver um limite muito estrito, pode ainda ocorrer. Nesse caso, aumentar ainda mais pausas, reduzir TAMANHO_PAGINA ou agendar extrações em horários diferentes.
Fim. Com essas informações, você pode:
- Instalar e executar o script.
- Entender como ele baixa dados e armazena em CSV.
- Ajustar a tolerância a bloqueios (intervalos, número de tentativas, etc.).
- Mitigar problemas de rate limit e WAF anti-bot.
Bom uso!