📘 English version available here → README.en.md
Para uma apresentação em vídeo deste projeto, acesse: CNPJ Data Extractor - Video Tutorial
O CNPJ Data Extractor é um projeto de código aberto que automatiza o processo de download, extração e transformação de conjuntos de dados do CNPJ (Cadastro Nacional da Pessoa Jurídica) a partir de fontes públicas disponíveis. O projeto é dividido em duas partes:
- Extração de Dados: Baixar e extrair automaticamente os conjuntos de dados do CNPJ particionados.
- Unificação de Dados: Combinar as tabelas particionadas em conjuntos de dados consolidados para processamento ou análise posterior.
- Download Automático de Dados: Download multithreaded dos conjuntos de dados com verificação de tamanho dos arquivos remotos, evitando downloads redundantes.
- Processamento Eficiente de Dados: Lida com grandes volumes de dados particionados e os consolida em uma única saída.
- Formatos de Exportação Flexíveis: Suporte a CSV e Parquet.
- Configuração Modular: Caminhos, logs e opções de exportação são facilmente ajustáveis por meio de um arquivo de configuração (
config.yaml
).
.
├── config
│ └── config.yaml # Arquivo de configuração para caminhos, formatos e tipos de dados
├── data_incoming # Pasta para arquivos ZIP de dados recebidos
├── data_outgoing # Pasta para os dados processados de saída
├── logs # Pasta para arquivos de log
├── scripts # Pasta para scripts em Python
│ ├── cnpj_extractor.py # Script para extração de dados (parte 1)
│ └── cnpj_merger.py # Script para unificação das tabelas particionadas (parte 2)
├── README.md # Documentação do projeto
└── execute_model.bat # Exemplo de script batch para executar o projeto completo (configure o ambiente antes)
- Python 3.12+
git clone https://github.com/jmfeck/cnpj-data-extractor.git
cd cnpj-data-extractor
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
Antes de executar os scripts, certifique-se de que o arquivo config.yaml
esteja configurado corretamente. Esse arquivo contém a URL base, parâmetros de leitura de CSV, tipo de exportação e os tipos de dados esperados para cada tabela.
Exemplo de config.yaml:
# URL base para o conjunto de dados do CNPJ
base_url: 'https://arquivos.receitafederal.gov.br/dados/cnpj/dados_abertos_cnpj'
# Configurações de CSV
csv_sep: ';'
csv_dec: ','
csv_quote: '"'
csv_enc: 'latin1'
# Formato de exportação: 'csv' ou 'parquet'
export_format: 'parquet'
# Definições de tipo de dado para cada tabela
dtypes:
empresa:
cnpj_basico: "str"
razao_social: "str"
natureza_juridica: "str"
qualificacao_responsavel: "str"
capital_social: "float"
porte_empresa: "str"
ente_federativo_responsavel: "str"
Para iniciar o processo de extração, execute o script cnpj_extractor.py
.
Esse script irá:
- Acessar a URL base definida no
config.yaml
- Identificar a pasta mais recente com base no padrão
AAAA-MM
- Listar todos os arquivos
.zip
disponíveis nessa pasta - Verificar se cada arquivo já foi baixado anteriormente (com base no tamanho)
- Fazer o download apenas dos arquivos necessários, utilizando múltiplos threads para acelerar o processo
- Salvar todos os arquivos na pasta
data_incoming/
Execute com:
python cnpj_extractor.py
Após o download dos arquivos, execute cnpj_merger.py
para realizar o processamento dos dados.
Esse script irá:
- Localizar todos os arquivos
.zip
na pastadata_incoming/
- Identificar o tipo de cada arquivo com base no prefixo (por exemplo,
empresa
,estabelecimento
, etc.) - Extrair o conteúdo de cada
.zip
(espera-se que contenha apenas um.csv
) - Ler os dados aplicando os tipos definidos no
config.yaml
- Unificar os dados de cada tipo em um único arquivo
- Exportar os dados consolidados para a pasta
data_outgoing/
, no formato especificado (csv
ouparquet
)
Execute o script com:
python cnpj_merger.py
Atualmente, os formatos de exportação disponíveis são:
csv
parquet
Outros formatos como JSON ou Feather podem ser adicionados no futuro.
Os arquivos de log são gerados automaticamente na pasta logs/
, permitindo acompanhar erros, tempo de execução e progresso geral.
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues ou enviar pull requests.
Este projeto está licenciado sob a Licença MIT.