Você está na página 1de 9

Extração e carga de dados abertos da Receita Federal do Brasil

Eli Coelho Medeiros1

RESUMO: Este artigo, por meio de revisão bibliográfica, apresenta uma programa
que extrair dados abertos de pessoas jurídicas do site da Receita Federal. Os dados
serão extraídos por meio de web scraping com bibliotecas Python. Ao final obtemos
diversos arquivos em formato CSV que podem ser utilizados como Data Frame.

PALAVRAS-CHAVE: extração, dados, abertos, pessoa, jurídica, cnpj, python.

1. Introdução
Diante do fenômeno da globalização e do surgimento de novas tecnologias, o
processo produtivo vem evoluindo e o mercado tem se tornado cada vez mais
competitivo. Neste cenário, as empresas precisam otimizar a utilização de seus
recursos, ter informações confiáveis. A informação é um dos principais recursos as
empresa precisam utiliza para sustentar-se no mercado.
Em muitos casos, a informação não está contida dentro da própria entidade
empresarial, é preciso extraí-la de diversas fontes externas como redes sociais,
catálogos, documentos e mídias espalhadas em sites da internet. Esta técnica de
extração de informação da internet é comumente referenciada como web scraping,
scrape data, extract data ou extração de dados na web. Pode ser executada com
diversas tecnologias. Este artigo opta pela linguagem de programação Python por
sua simplicidade, leveza e robustez. Em artigos futuros, há pretensão de aplicar
outras técnicas de ciências de dados sobre os dados obtidos. Esta decisão alinha-se
com a orientação de Grus2:
Há um sólido debate sobre qual a melhor linguagem para aprender data
science. Muitos acreditam que é a linguagem de programação estatística R
(achamos que essas pessoas estão erradas). Poucos sugerem Java ou
Scala. Contudo, Python é a escolha evidente.

1Graduação em Ciências da Computação pela Instituição Centro Universitário Unifacvest. Currículo


Lattes <http://lattes.cnpq.br/5852883674991535>. E-mail do autor: eli.medeiros@hotmail.com.
Orientador: Márcio José Sembay
2GRUS, Joel. Data Science do Zero. Rio de Janeiro: Alta Books, 2016. 336 p. Disponível em

<https://edisciplinas.usp.br/pluginfile.php/5742167/mod_resource/content/1/Data%20Science%20do%
20zero%20-%20Primeiras%20regras.pdf>. Acesso em 21 Jan. 2024.
2

Python possui diversos recursos que o tornam mais adequado para o


aprendizado (e prática) de data science:
- É gratuito.
- É relativamente simples de codificar (e, o principal, de entender).
- Possui muitas bibliotecas úteis relacionadas ao data science.

Este artigo utiliza como fonte o banco de dados da Receita Federal do Brasil3,
que armazena informações cadastrais das pessoas jurídicas e outras entidades de
interesse das administrações tributárias da União, dos Estados, do Distrito Federal e
dos Municípios. Este banco de dados é relevante pois possui informações
atualizadas mensalmente sobre empresas de diversos ramos de atividade pelo país.
Estas podem ter grande relevância para diversos fins. Tem-se como exemplo
serviços bancários, comércio atacadista, agências de publicidade, etc. Os arquivos
estão ancoradas no endereço <https://dadosabertos.rfb.gov.br/CNPJ/> em dezenas
de documentos com milhares de registros, tornando a extração manual da
informação onerosa e insuportável por arquivos tradicionais como Excel. O escopo
deste artigo é desenvolver um programa para extrair e carregar os dados abertos de
pessoas jurídicas e prepara-los para posterior utilização.
A metodologia utilizada é revisão bibliográfica. O tema é amplamente
abordado por diversos autores. Existe farta literatura e inclusive projetos
compartilhados na plataforma GitHub sobre o tema.

2. Pessoas Jurídicas e Receita Federal


Antes de explorar o banco de dados, vale a pena tecer algumas definições e
explicações sobre as informações e seu contexto para evitar interpretações
equivocadas sobre os dados obtidos.
Inicialmente, vale a pena entender o que vem a ser pessoas jurídicas. Refere-
se à entidade fictícia que surge para diversos fins (comerciais, assistenciais,
prestação de serviço) que limita a responsabilidade patrimonial dos sócios. Os tipos
de empresas mais comuns no dia a dia são os comércios, entidades de propriedade
particular de um indivíduo que comercializam bens ou serviços, mas também podem
ser de direito público como hospitais, órgãos, escolas geridas pelo governo. Não
filtraremos os tipos de pessoas jurídicas por atividade ou tipo, pois mesmo as de

3BRASIL. Receita Federal. Cadastro Nacional de Pessoa Jurídica – CNPJ. Disponível em:
https://dados.gov.br/dados/conjuntos-dados/cadastro-nacional-da-pessoa-juridica---cnpj. Acesso em:
21 Jan. 2024
3

direito público podem ter algum significado comercial ao adquirirem produtos ou


serviços por meio de licitações. Gonçalves4 conceitua personalidade jurídica:
Consiste num conjunto de pessoas ou de bens dotado de personalidade
jurídica própria e constituído na forma da lei para a consecução de fins
comuns. Pode-se afirmar, pois, que pessoas jurídicas são entidades a que a
lei confere personalidade, capacitando-as a serem sujeitos de direitos e
obrigações.

O Código Civil5 prevê a existência de várias formas de pessoas jurídicas. As


que envolver entidades públicas interno podem ser União, Estado, Distrito Federal,
Municípios, Autarquias, Associações Públicas e demais atividades permitidas por lei.
Os entes de direito público interno, contudo não exercem as atividades da
administração pública, para tanto, criam-se os órgãos, como exemplo a Receita
Federal do Brasil (órgão responsável pela administração tributária e previdenciária
da União). As entidades de direito público externo são Estados estrangeiros. As
pessoas jurídicas de direito privado podem assumir a forma de associações,
sociedades, fundações, organizações religiosas e partidos políticos.
Conforme a Instrução Normativa nº 1.863 da RFB6, todas as entidades
domiciliadas no Brasil, inclusive as pessoas jurídicas equiparadas pela legislação do
Imposto sobre a Renda, estão obrigadas a se inscrever no Cadastro Nacional de
Pessoa Jurídica - CNPJ e a cada um de seus estabelecimentos localizados no Brasil
ou no exterior, antes do início de suas atividades. A administração do CNPJ é de
competência da Secretaria da Receita Federal do Brasil (RFB). Atendendo ao
princípio da publicidade, a Receita Federal disponibiliza acesso a diversos
documentos contendo dados abertos sobre os CNPJs em seu site7.
O decreto de nº 8.777/168 institui a Política de dados abertos do Governo
Federal. Descreve que dados abertos são dados acessíveis ao público,
representados em meio digital, estruturados em formato aberto, processáveis por

4 GONCALVES, Carlos Roberto. Direito Civil Esquematizado. São Paulo: Saraiva, 2011. Pag. 179
5 BRASIL. Lei nº 10.406, de 10 de janeiro de 2002. Código Civil. Brasília. Disponível em: <
https://www.planalto.gov.br/ccivil_03/leis/2002/l10406compilada.htm >. Acesso em: 29 Jan 2024.
6 BRASIL. Instrução Normativa RFB nº 1.863, de 27 de Dezembro de 2018. Institui o Cadastro

Nacional de Pessoa Jurídica. Brasília. Disponível em: <


http://normas.receita.fazenda.gov.br/sijut2consulta/link.action?idAto=97729&visao=original> Acesso
em: 29/01/2024.
7 BRASIL. Cadastro Nacional da Pessoa Jurídica – CNPJ. Disponível em: <

https://dados.gov.br/dados/conjuntos-dados/cadastro-nacional-da-pessoa-juridica---cnpj>. Acesso em
29 Jan 2024.
8 BRASIL. Decreto nº 8.777, de 11 de Maio de 2016. Institui a Política de Dados Abertos. Disponível

em: <https://www.planalto.gov.br/ccivil_03/_ato2015-2018/2016/decreto/D8777.htm>. Acesso em 29


Jan 2024.
4

máquina, referenciados na internet e disponibilizados sob licença aberta que permita


sua livre utilização, consumo ou cruzamento, limitando-se a creditar a autoria ou a
fonte. O mesmo diploma concede permissão irrestrita de reuso das bases de dados
publicadas.
O banco de dados da Receita Federal, objeto deste artigo, disponibiliza dados
abertos com informações de grande relevância sobre pessoas jurídicas como:
endereço, e-mail e até telefone. Os dados são estruturados, foram construídos de
forma regrada e organizado em diversas tabelas. Na aba Recursos, a página
disponibiliza um dicionário de dados que facilita o entendimento das tabelas
descrevendo o conteúdo dos arquivos Empresas, Estabelecimentos, Dados do
Simples, Sócios, Países, Municípios, Qualificação de sócios, Naturezas jurídicas e
CNAEs. Esta aba traz ainda algumas observações sobre os dados como a indicação
de que o símbolo ponto e vírgula “;” é utilizado como separador de atributos.

3. Extração de dados da web


A extração de dados será realizada no Google Colaboratory, plataforma
gratuita, com boa quantidade de memória computacional, em um Notebook Jupyter
e na linguagem Python 3.10.12 (com o comando “!python -V” é possível identificar a
versão). O programa desenvolvido utilizou como base a obra de Mitchell9 e projeto
de Rictom10.
Para importar as bibliotecas e ferramentas necessárias na plataforma Colab é
necessário executar a seguinte linha de comando:
!pip install wget
from bs4 import BeautifulSoup
import requests, wget, os, sys, time, glob, zipfile, chardet
import pandas as pd

As variáveis declaradas indicam o endereço URL onde os arquivos estão


armazenados na Receita Federal, a pasta onde os arquivos baixados serão
armazenadas e o local destino dos arquivos descompactados:
url = 'https://dadosabertos.rfb.gov.br/CNPJ/' #página onde os arquivos estão
armazenados
pasta_compactados = r"dados-publicos-zip" #local onde os arquivos serão
armazenados
pasta_saida = r"dados-publicos" #local destino
dataReferencia = '29/01/2024' #indicação manul da data em que foi executado)

9MITCHELL, Ryan. Web Scraping with Python. Editora O’Reilly. 2015, DOI 978-1-491-91029-0.
10RICTOM. Cnpj-sqlite. Disponível em <https://github.com/rictom/cnpj-sqlite> Acesso em 29 Jan 2024
5

Obtemos o conteúdo HTML da URL informada por meio do “requests”. Esta


biblioteca permite realizar requisições HTTP em uma aplicação. Ela simplifica o
processo de enviar solicitações HTTP para servidores web e manipular as respostas
recebidas. O comando utilizado é:
page = requests.get(url)
data = page.text

O conteúdo HTML pode ser manipulado com “BeaufifullSoup”, biblioteca


popularmente utilizada em python para extração de dados na web. Permite analisar
e extrair dados de documentos HTML ou XML em diferentes codificações e
caracteres Unicode. A extração dos links é feita por meio do comando e armazenada
na variável “list”:
soup = BeautifulSoup(data)
list = []
print('Relação de Arquivos em ' + url)
for link in soup.find_all('a'):
if str(link.get('href')).endswith('.zip'):
cam = link.get('href')
# if cam.startswith('http://http'):
# cam = 'http://' + cam[len('http://http//'):]
if not cam.startswith('http'):
print(url+cam)
list.append(url+cam)
else:
print(cam)
list.append(cam)

Para acompanhar o processo de baixar os arquivos, utilizamos o “sys” e


“time”. Esta primeira biblioteca permite acessar algumas variáveis e funções
específicas do interpretador Python e do ambiente em que o código está sendo
executado. A segunda biblioteca fornece várias funções relacionadas ao tempo,
permitindo medir o tempo de execução de um programa, fazer pausas e outras
operações relacionadas ao tempo. O seguinte código exibe no terminal o progresso
do download:

def bar_progress(current, total, width=80):


if total>=2**20:
tbytes='Megabytes'
unidade = 2**20
else:
tbytes='kbytes'
unidade = 2**10
progress_message = f"Baixando: %d%% [%d / %d] {tbytes}" % (current / total *
100, current//unidade, total//unidade)
6

sys.stdout.write("\r" + progress_message)
sys.stdout.flush()
print('\n\n'+ time.asctime() + f' Finalizou!!! Baixou {len(list)} arquivos.')

O download é realizado e armazenado na pasta destino utilizando “wget” e


“os”. A primeira não é uma biblioteca de Python, mas sim uma ferramenta
amplamente usada para baixar arquivos da web. Ela é executada no terminal ou
prompt de comando e é especialmente útil para baixar arquivos sem a necessidade
de um navegador web. A segunda é uma biblioteca e fornece uma maneira de
mapear como o sistema operacional ao Python está sendo executado como
manipulação de arquivos, diretórios, variáveis de ambiente, execução de comandos
do sistema, entre outras. Segue código que faz o downlaod:

for k, url in enumerate(list):


print('\n' + time.asctime() + f' - item {k}: ' + url)
wget.download(url, out=os.path.join(pasta_compactados, os.path.split(url)[1]),
bar=bar_progress)

Os arquivos obtidos na fase anterior estão compactador e serão


descompactados por meio da utilização de “zipfile” e “glob”. A primeira biblioteca
oferece uma maneira de trabalhar com arquivos ZIP, permitindo a criação, leitura,
extração e modificação de arquivos ZIP. A segunda uma maneira simples de
encontrar arquivos e diretórios que correspondem a um padrão especificado. O
comando que efetua esta tarefa é:
print('Início:', time.asctime())
arquivos_zip = list(glob.glob(os.path.join(pasta_compactados,r'*.zip')))

for arq in arquivos_zip:


print(time.asctime(), 'descompactando ' + arq)
with zipfile.ZipFile(arq, 'r') as zip_ref:
zip_ref.extractall(pasta_saida)

Os nomes dos arquivos descompactados surgem com alguns caracteres que


podem confundir. É possível tratá-los com as bibliotecas “os:
#corrige os nomes arquivos CSV
for nome_arquivo in os.listdir('/content/dados-publicos'):
caminho_completo = os.path.join(pasta, nome_arquivo)
# Verifica se é um arquivo (não um diretório)
if os.path.isfile(caminho_completo):
contador = 1
# Remove as substrings mencionadas
novo_nome = nome_arquivo.replace('F.K03200$Z.D40113.',
'').replace('K3241.K03200Y0.D40113.', '').replace('F.K03200$W.',
'').replace('K3241.K03200Y', '').replace(r'D40113', '').replace(r'..', '')
# Adiciona o número sequencial e a extensão .CSV
contador = 1
7

novo_nome = f"{novo_nome}{contador}.CSV"
novo_caminho = os.path.join(pasta, novo_nome)
os.rename(caminho_completo, novo_caminho)
print(f"Arquivo renomeado de '{nome_arquivo}' para '{novo_nome}'.")
contador += 1

É possível identificar o formato de codificação dos arquivos por meio da


biblioteca “chardet”:
#conslulta codificação, tem como resultado ISO-8859-1
with open('/content/dados-publicos/PAIS1.CSV', 'rb') as f:
encoding = chardet.detect(f.read())['encoding']
print (encoding)

KOTU e DESHPANDE11 explicam que para ser possível aplicar algoritmos de


Ciências de Dados é imprescindível que os dados estejam estruturados em um
formato tabular com registros em linhas e atributos em colunas. Alguns autores
chamam este arranjo de dataset ou data frame. Felizmente, os dados da Receita
Federal armazenados nos arquivos CSB são estruturados, bastando sua conversão
em data frame. Para esta tarefa utilizamos “pandas”, biblioteca muito utilizada para
manipulação e análise de dados, que fornece estruturas de dados de alto
desempenho e fáceis de usar, bem como ferramentas para trabalhar com essas
estruturas de dados. A leitura dos dados como DataFrame pode ser realizada com o
seguinte código:

#TRANSFORMA EM DATAFRAME
df = pd.read_csv('/content/dados-publicos/PAIS1.CSV', delimiter=';',
encoding='latin1')
print (df)

Embora não seja o caso dos dados disponíveis na Receita Federal, quando
fala-se sobre extração de dados na web, vale apena lembra que existem diversas
formas de um site impedir ou dificuldade o web scraping. Tais barreiras exigem
abordagens distintas conforme o caso. Zhao12, explica:
A web application may adopt one of the following measures to stop or
interfere with a web scrapping tool that collects data from the given website.
Those measures may identify whether an operation was conducted by a
human being or a bot. Some of the major measures include the following:
HTML “fingerprinting” that investigates the HTML headers to identify whether
a visitor is malicious or safe (Acar et al. 2013); IP reputation determination,

11
KOPTU, Vijay; DASHPANDE, Bala. Data Science: Concepts and Practice. United States: Elsevier, 2019. Pag 23,
25.
12ZHAO, Bo. Web Scraping. Oregon State University. Disponível em:

<https://www.researchgate.net/profile/Bo-Zhao-
3/publication/317177787_Web_Scraping/links/5c293f85a6fdccfc7073192f/Web-Scraping.pdf>. Acesso
em 29 Jan 2024
8

where IP addresses with a recorded history of use in website assaults that


Web Scraping will be treated with suspicion and are more likely to be heavily
scrutinized (Sadan and Schwartz 2012); behavior analysis for revealing
abnormal behavioral patterns, such as placing a suspiciously high rate of
requests and adhering to anomalous browsing patterns; and progressive
challenges that filter out bots with a set of tasks, such as cookie support,
JavaScript execution, and CAPTCHA (Doran and Gokhale 2011).

Outro ponto interessante é que, caso estivéssemos falando sobre Big Data, o
processo de carregar os dados demandaria a utilização de outras tecnologias.
Grande volume de dados variados que crescem com velocidade excede a
capacidade de softwares comuns de processamento de dados. Dentro os principais
softwares dedicados a tratar grandes volumes destacam-se: o Hadoop que em 2006
permitiu o escalonamento horizontal de um problema em vários computadores; em
2009 o Hive surge como alternativa que permitia trabalhar com menos conhecimento
em programação; Spark surge em 2011 para otimizar a velocidade de
processamento em tempo real; o Datablickets surge em 2015 para facilitar as
consultas do apache Spark.

4. Conclusão

O uso de bibliotecas Python oferece uma abordagem eficiente e flexível para


a extração de dados da internet. Através de ferramentas como BeautifulSoup,
Requests e Wget é possível desenvolver um conjunto diversificado de recursos para
navegar em páginas da web, coletar informações estruturadas e automatizar tarefas.
Com uma compreensão sólida das técnicas e práticas recomendadas, o web
scraping pode ser uma ferramenta valiosa para obter insights e alimentar análises
em uma variedade de aplicações, desde a pesquisa acadêmica até a tomada de
decisões empresariais.

5. Referências Bibliográficas
BRASIL. Cadastro Nacional da Pessoa Jurídica – CNPJ. Disponível em: <
https://dados.gov.br/dados/conjuntos-dados/cadastro-nacional-da-pessoa-juridica---
cnpj>. Acesso em 29 Jan 2024.

BRASIL. Decreto nº 8.777, de 11 de Maio de 2016. Institui a Política de Dados


Abertos. Disponível em: <https://www.planalto.gov.br/ccivil_03/_ato2015-
2018/2016/decreto/D8777.htm>. Acesso em 29 Jan 2024.
9

BRASIL. Instrução Normativa RFB nº 1.863, de 27 de Dezembro de 2018. Institui o


Cadastro Nacional de Pessoa Jurídica. Brasília. Disponível em: <
http://normas.receita.fazenda.gov.br/sijut2consulta/link.action?idAto=97729&visao=or
iginal> Acesso em: 29/01/2024.

BRASIL. Lei nº 10.406, de 10 de janeiro de 2002. Código Civil. Brasília. Disponível


em: < https://www.planalto.gov.br/ccivil_03/leis/2002/l10406compilada.htm >. Acesso
em: 29 Jan 2024.

BRASIL. Receita Federal. Cadastro Nacional de Pessoa Jurídica – CNPJ.


Disponível em: https://dados.gov.br/dados/conjuntos-dados/cadastro-nacional-da-
pessoa-juridica---cnpj. Acesso em: 21 Jan. 2024

GONCALVES, Carlos Roberto. Direito Civil Esquematizado. São Paulo: Saraiva,


2011. Pag. 179

GRUS, Joel. Data Science do Zero. Rio de Janeiro: Alta Books, 2016. 336 p.
Disponível em
<https://edisciplinas.usp.br/pluginfile.php/5742167/mod_resource/content/1/Data%20
Science%20do%20zero%20-%20Primeiras%20regras.pdf>. Acesso em 21 Jan.
2024.

KOPTU, Vijay; DASHPANDE, Bala. Data Science: Concepts and Practice. United
States: Elsevier, 2019. Pag 23, 25.

MITCHELL, Ryan. Web Scraping with Python. Editora O’Reilly. 2015, DOI 978-1-
491-91029-0.

RICTOM. Cnpj-sqlite. Disponível em <https://github.com/rictom/cnpj-sqlite> Acesso


em 29 Jan 2024

Você também pode gostar