Рубрики
Без рубрики

COMENDO DADOS DE CNPJ’S COM API MINHA CETETITA

Dados de Cnpj’s Podem Ser Uma Rica Fonte de Informações Para Tiversoss Tipos de Análises. Entretanto, … Теги с Python, PostgreSQL.

Dados de Cnpj’s Podem Ser Uma Rica Fonte de Informações Para Tiversoss Tipos de Análises. Entretanto, часто посещаемый Só Temos Acesso Ao Número dum Cnpj, NãO Conhecendo Informações вакал COMO SUA ATIVEDADE COMO CADASTRAL, SITUACHãA CADASTRAL, SOCIOS DA EMPRESA OU столичный социальный, Por Emplo. Felizmente, PodeMos Obter Essas E Autorras Informações Através Da API MINHA CEATITA UMA INICIATIVA DA SISIEDADE ГРАЖДАНСКАЯ КС РОПОСИБИЛИЗА, DE FORMA GRATUITA E ACESSIVEL, DADOS DA CEATITA Федерации.

Neste Projeto, Utilizaremos Python Para Fazer Requisições à API Minha Ceitita E Ambazenar Informações Sobre + 46 Mil CNPJ’s Отказ Veremos:

  1. Como realizar conexão com postgresql para que o Python Tash Acessar o Conteúdo dum Banco de Dados;
  2. COMO Fazer Requisições Para Para API Minha Ceitita E Obter Informações AssociaDas A UM CNPJ Segundo Cheatita Federal;
  3. COMO Armazenar A Resposta Da API EM Banco de Dados PostgreSQL.

Conexão Com PostgreSQL

NOSSO objetivo é fazer requisições à API Minha Ceatita Para Obter Dados de + 46 Mil CNPJ’s. Rsse cnpj’s Estão Armazenados EMMA Tabela PostgreSQL, Пор Иссы, Premiro Precisamos Realizar Conexão Com O Banco de Dados E Fazer Com Que o Python Tenha Acesso à lista de cnpj’s.

Para Fazer Essa Conexão, Estamos Usando Biblioteca Psycopg Que Premate Que o Python conecte-se um banco de dados postgresql. Фунчано sql_conection () Realiza Conexão E SERA UTILIZADA EM TODOS OS MOMBOLOS EM TODOS EMON EMON для BeautaRio Interagir Com O Banco de Dados.

import psycopg2
def sql_connection():
    # Realiza a conexão com o banco de dados PostgreSQL e retorna a variável que será utilizada para interagir com o banco
    database = ''
    user = ''
    password = ''
    host = ''
    port = ''
    con = psycopg2.connect(database=database,
                           user=user,
                           password=password,
                           host=host,
                           port=port)
    return con

Nosso Banco de Dados Contém UMA Tabela Com Vários Dados, Entre Os Quais Está O CNPJ. Vamos Fazer UMA Query Para Essa Tabela E Amazenar OS CNPJ’s únicos em dataframe.

import pandas as pd
import pandas.io.sql as sqlio
def query_to_df(query):
    # Dada uma query PostgreSQL, realiza a query no banco de dados e armazena o resultado em um dataframe
    con = sql_connection()
    data_set = sqlio.read_sql_query(query, con)
    return data_set


query = 'select distinct(cnpj) from table_name'
df_cnpj = query_to_df(query)

Fazendo Requisições Para A API Minha Ceatitita

No Meu Caso, O Código Acima Retorna UM DataFrame COM 46.911 CNPJ’s, MAS, POR Enquanto, NãO Temos Nenhuma Informação Addicional Sobre Eles. Felizmente, PodeMos Fazer Requisições à API Minha Ceitita E Obter Informações da Cebitita Federal Sobre Cada UM Desses CNPJ’s.

Фунчано get_cnpj_data (cnpj) Утилиза Библиотека Запросы Para Realizar UMA Requisição à API, Procurando POR UM CNPJ, E Retorna OS Dados Encontrados.

import requests
def get_cnpj_data(cnpj):
    # Dado um CNPJ, faz uma requisição para a API Minha Receita. Caso a requisição seja bem sucedida, retorna o conteúdo da requisição em formato json
    minha_receita_api_url = 'https://minhareceita.org/'
    r = requests.post(minha_receita_api_url, data=cnpj, timeout=None)
    if r.status_code == 200:
        return json.loads(r.content)

PARA NOS Compalizarmos Com A REPSOSTA DA API, Vamos Fazer UMA Requisição de Exemplo E Utilizar A jpriint () Para Gerar UMA Visualização Amigável Do Objeto Json Retornado Pela API.

import json
def jprint(obj):
    # Cria visualização amigável de um objeto json
    text = json.dumps(obj, sort_keys=True, indent=4, ensure_ascii=False)
    print(text)


cnpj_example = {'cnpj': 19131243000197}
response_example = get_cnpj_data(cnpj_example)
jprint(response_example)

O Código Acima Deve Retornar Algo Semelhante A:

{
    "bairro": "BELA VISTA",
    "capital_social": 0,
    "cep": "01311902",
    "cnae_fiscal": 9430800,
    "cnae_fiscal_descricao": "Atividades de associações de defesa de direitos sociais",
    "cnaes_secundarias": [
        {
            "codigo": 9493600,
            "descricao": "Atividades de organizações associativas ligadas à cultura e à arte"
        },
        {
            "codigo": 9499500,
            "descricao": "Atividades associativas não especificadas anteriormente"
        },
        {
            "codigo": 8599699,
            "descricao": "Outras atividades de ensino não especificadas anteriormente"
        },
        {
            "codigo": 8230001,
            "descricao": "Serviços de organização de feiras, congressos, exposições e festas"
        },
        {
            "codigo": 6204000,
            "descricao": "Consultoria em tecnologia da informação"
        }
    ],
    "cnpj": "19131243000197",
    "codigo_municipio": 7107,
    "codigo_natureza_juridica": 3999,
    "complemento": "ANDAR 4",
    "data_exclusao_do_simples": null,
    "data_inicio_atividade": "2013-10-03",
    "data_opcao_pelo_simples": null,
    "data_situacao_cadastral": "2013-10-03",
    "data_situacao_especial": null,
    "ddd_fax": "",
    "ddd_telefone_1": "11  23851939",
    "ddd_telefone_2": "",
    "descricao_matriz_filial": "Matriz",
    "descricao_porte": "Demais",
    "descricao_situacao_cadastral": "Ativa",
    "descricao_tipo_logradouro": "AVENIDA",
    "identificador_matriz_filial": 1,
    "logradouro": "PAULISTA 37",
    "motivo_situacao_cadastral": 0,
    "municipio": "SAO PAULO",
    "nome_cidade_exterior": "",
    "nome_fantasia": "REDE PELO CONHECIMENTO LIVRE",
    "numero": "37",
    "opcao_pelo_mei": false,
    "opcao_pelo_simples": false,
    "porte": 5,
    "qsa": [
        {
            "cnpj": "19131243000197",
            "cnpj_cpf_do_socio": "",
            "codigo_qualificacao_representante_legal": 0,
            "codigo_qualificacao_socio": 16,
            "cpf_representante_legal": "",
            "data_entrada_sociedade": "2019-10-25",
            "identificador_de_socio": 2,
            "nome_representante_legal": "",
            "nome_socio": "FERNANDA CAMPAGNUCCI PEREIRA",
            "percentual_capital_social": 0
        }
    ],
    "qualificacao_do_responsavel": 16,
    "razao_social": "OPEN KNOWLEDGE BRASIL",
    "situacao_cadastral": 2,
    "situacao_especial": "",
    "uf": "SP"
}

Обтурдо Dados de + 46 Mil CNPJ’s

AGORA Que Fizemos UMA Requisição de Exemplo E Estamos Commitizados Com A API API, PodeMos Segoir Para Parte Divertida e Fingermente Obter OS DADOS DA CHEENTITA Федеральная Sobre OS 46.911 Nos Quais estamos Intersessados.

Primeiro, Vamos Crar Uma Tabela PostgreSQL PARA AMAZENAR NOSSOS DADOS. Entre todas как informações que recornam da API, escolhemos apenas algumas variáveis transhais, que são mais inter intersentes para в качестве Anlises Futuras.

Utilizamos o Método Connection.cursor () Que Premate Que o Python Execute Comandos Em Banco de Dados PostgreSQL. Repare que, Após Executar o Comando, é Nebsário Utilizar Também O Método Connection.comMit () PARA GARANTIR que que que as mudanças no banco de dados sejam feitas.

def create_sql_table():
    # Cria uma tabela PostgreSQL para armazenar os dados dos CNPJ's
    con = sql_connection()
    with con.cursor() as cur:
        create_table_command = 'create table if not exists cnpj_data('\
            'cnpj varchar(100),'\
            'razao_social varchar(250),'\
            'nome_fantasia varchar(250),'\
            'atividade_principal_codigo varchar(50),'\
            'atividade_principal_descricao varchar(1000),'\
            'situacao_cadastral varchar(50),'\
            'capital_social float,'\
            'porte varchar(50),'\
            'codigo_natureza_juridica int,'\
            'data_abertura date,'\
            'cep varchar(50),'\
            'municipio varchar(100),'\
            'uf varchar(2)'\
            ')'
        cur.execute(create_table_command)
        con.commit()
create_sql_table()

Ума Вез Криада А Tabela, PodeMos Começar A Alimenta-La Com OS Dados Dos Cnpj’s. Para Isso, Vamos Generar A Roodação Da Documentação do PostgreSQL de que a que a melhor forma de alimentar uma tabela é usando o comando copy. UMA Desmakação Sobre o Melhor Desempenho сделать копию с EM Relação AutoDos Pode Code Ser Contrtrada Nesta Análise , que avalia performance diferentes formas de mormentar dados de umma fonte remota para uma tabela postgresql.

Assim, Para Alimentar Nossa Tabela, Seguiremos o Seguinte Fluco:

Vamos Começar Speciondo Как Funções que Utilizaremos Para Amazenar OS Dados da Resposta da API EM UM DataFrame. Репр que, na função cnpj_data_to_df () , CASO O CNPJ NãO SEJA ENCONTRADO REPOSTA DA API VOLTE COM VALOR NULO, IREMOS ADICIONA O CNPJ AO dataframe. Mesmo Assim, Porém Com Valores Nulos Nas Colunas de Informações. ISSO NOS Ajudará a Ter Controle Sobre Quais CNPJ’s Foram Encontrados E Quais Não Foram.

def clean_text(full_text):
    # Limpa um texto, retirando quebras de linha e ponto-e-vírgulas
    clean_text = full_text.replace("\n", " ")
    clean_text = full_text.replace(";", " ")
    return clean_text


def cnpj_data_to_df(df_cnpj):
    # Recebe um dataframe contendo os CNPJ's e, a partir das requisições à API Minha Receita, estrutura um dataframe contendo os dados do CNPJ
    data_set = pd.DataFrame(columns=[
        'cnpj',
        'razao_social',
        'nome_fantasia',
        'atividade_principal_codigo',
        'atividade_principal_descricao',
        'situacao_cadastral',
        'capital_social',
        'porte',
        'codigo_natureza_juridica',
        'data_abertura',
        'cep',
        'municipio',
        'uf'
    ])
    for cnpj in df_cnpj['cpf_cnpj']:
        cnpj_data = get_cnpj_data({'cnpj': cnpj})
        if cnpj_data != None:
            new_row = {
                'cnpj': cnpj,
                'razao_social': cnpj_data['razao_social'],
                'nome_fantasia': cnpj_data['nome_fantasia'],
                'atividade_principal_codigo': cnpj_data['cnae_fiscal'],
                'atividade_principal_descricao': clean_text(cnpj_data['cnae_fiscal_descricao']),
                'situacao_cadastral': cnpj_data['descricao_situacao_cadastral'],
                'capital_social': float(cnpj_data['capital_social']),
                'porte': cnpj_data['descricao_porte'],
                'codigo_natureza_juridica': int(cnpj_data['codigo_natureza_juridica']),
                'data_abertura': cnpj_data['data_inicio_atividade'],
                'cep': cnpj_data['cep'],
                'municipio': cnpj_data['municipio'],
                'uf': cnpj_data['uf'],
            }
        else:
            new_row = {'cnpj': cnpj}
        data_set = data_set.append(new_row, ignore_index=True)
    return data_set

Agora PodeMos Defire Função df_to_csv () Que Exporta o DataFrame PARA UM CSV DREMARIO, E FUNCHãO csv_to_sql_table () Que Utiliza O Copy из Para Alimentar A Tabela PostgreSQL.

def df_to_csv(csv_path, data_set):
    # Exporta um dataframe para um arquivo csv
    data_set.to_csv(csv_path, header=False, index=False, sep=';',
                    encoding='utf-8', quoting=csv.QUOTE_MINIMAL)


def csv_to_sql_table(csv_path):
    # Alimenta a tabela PostgreSQL com os dados dos CNPJ's
    con = sql_connection()
    with con.cursor() as cur:
        cur.execute('copy cnpj_data from %s delimiter %s csv', [csv_path, ';'])
        con.commit()

COM TODAS как Funções Funções, Podemos Agora Iterar Sobre O DataFrame df_cnpj Que Contém OS CNPJ’s, E Fazer Requisições à API Minha Ceatita. Vamos Armazenar As Repostas Na Tabela PostgreSQL EM LOTES DE 1000 CNPJ’s Para Garantir Que, Caso Ocorra Ur Erro Enquento O Código Roda, NãO PerdereMos О.С. Дадо Дас Реквизисçс Джо Реализадас.

csv_path = r'\temp_cnpj_data.csv'
df_cnpj_data = pd.DataFrame()
for i in range(0, len(df_cnpj), 1000):
    new_batch = cnpj_data_to_df(df_cnpj[i:i+1000])
    df_to_csv(csv_path, new_batch)
    csv_to_sql_table(csv_path)
    df_cnpj_data = df_cnpj_data.append(new_batch, ignore_index=True)
    print(i)

Para Finalizar, Vamos Checar Quantos CNPJ’s Foram Encontrados E Quantos Não Foram.

query = 'select * from cnpj_data'
df_cnpj_data = query_to_df(query)

empty_columns = ['razao_social',
                 'nome_fantasia',
                 'atividade_principal_codigo',
                 'atividade_principal_descricao',
                 'situacao_cadastral',
                 'capital_social',
                 'porte',
                 'codigo_natureza_juridica',
                 'data_abertura',
                 'cep',
                 'municipio',
                 'uf'
                 ]

df_found_cnpj = df_cnpj_data.dropna(axis=0, how='all', subset=empty_columns)
percentage_not_found_cnpj = 100*(1 - (len(df_found_cnpj)/len(df_cnpj_data)))
print('De', len(df_cnpj_data), 'CNPJs, foram encontrados', len(df_found_cnpj))
print('Não foram encontrados', round(percentage_not_found_cnpj, 2), '% dos CNPJs buscados.')
De 46911 CNPJs, foram encontrados 46851
Não foram encontrados 0.13 % dos CNPJs buscados.

Вывод

Neste Projeto, Utilizamos Python Para Acessar E Manipular Bancos de Dados PostgreSQL. Conseguimos Obter Informações de + 46 Mil CNPJ’s, com apenas 0,13% dos dados não encontrados. Para Isso, API Minha Ceitita Foi Em Recurso Essencial, Já Que Ela Disponibiliza OS DADOS DA CETETITA Федеральный DE Forma Gratuita E Acessível.

COM ESTE Учебник, Espero Ter Para Para Desvendar Возможность Dúvidas Sobre Como Utilizar A Biblioteca Psycopg Para Conectar o Python A UM Banco de Dados PostgreSQL E A A A A A A A A A A A A PARA Realizar API API.

Espero Também Que o Projeto Para Para Que Mais Pessoas Conheçam e Utilizem A API Minha Ceatitita.

O meu repositório no github com o botebook do projeto está dosponível Neste Link. .

Оригинал: “https://dev.to/camilacrdoso/obtendo-dados-de-cnpj-s-com-a-api-minha-receita-2hcd”