Este documento fornece uma visão detalhada do Sistema de Raspagem de Licitações do PNCP desenvolvido em Python. O sistema é projetado para coletar e processar dados de licitações públicas a partir da API do Portal Nacional de Contratações Públicas (PNCP). Dada a grande quantidade de dados (aproximadamente 10 mil registros de licitações, itens e arquivos), o sistema é modularizado para garantir eficiência, escalabilidade e facilidade de manutenção.
O sistema inclui uma Interface de Linha de Comando (CLI) que permite aos usuários configurar parâmetros de execução, monitorar o progresso em tempo real e obter relatórios detalhados sobre o processo de raspagem.
O sistema é composto por vários módulos, cada um responsável por uma parte específica do processo de raspagem. A seguir, são descritos cada um desses módulos e como eles interagem entre si.
Objetivo: Centralizar e carregar as configurações do sistema. Essas configurações definem os parâmetros básicos das requisições à API, como URLs, tamanho das páginas, critérios de ordenação e controle de taxa para requisições simultâneas.
Funções Principais:
load_config(args): Carrega as configurações do arquivo config.ini e aplica os parâmetros fornecidos via CLI.Interação com Outros Módulos:
Objetivo: Facilitar a configuração dos parâmetros de execução do sistema diretamente pelo usuário através da linha de comando.
Funções Principais:
parse_arguments(): Define e analisa os argumentos fornecidos via CLI, permitindo ao usuário customizar o comportamento do script.Interação com Outros Módulos:
Objetivo: Gerenciar o registro detalhado das ações e erros que ocorrem durante a execução do sistema.
Funções Principais:
setup_logging(log_file): Configura o sistema de logs para registrar eventos e erros em um arquivo log (raspagem_pncp.log) e, opcionalmente, no console.Interação com Outros Módulos:
Objetivo: Garantir que os diretórios e arquivos necessários para a operação do sistema existam e estejam corretamente configurados.
Funções Principais:
setup_directories(): Verifica a existência dos diretórios e arquivos necessários (raspagem/licitacoes.csv, raspagem/itens.csv, raspagem/arquivos.csv, raspagem/raspagem_pncp.log) e os cria se não existirem.Interação com Outros Módulos:
Objetivo: Armazenar os dataframes em arquivos CSV para persistência dos dados e garantir que o sistema possa retomar o processo a partir de onde parou em execuções anteriores.
Funções Principais:
load_dataframes(paths): Carrega os dataframes existentes a partir dos arquivos CSV ou cria novos dataframes vazios se os arquivos não existirem.save_dataframes(df_licitacoes, df_itens, df_arquivos, paths): Salva os dataframes atualizados em arquivos CSV, evitando duplicidades.Interação com Outros Módulos:
Objetivo: Realizar as requisições assíncronas à API do PNCP e controlar a taxa de requisições simultâneas.
Funções Principais:
fetch_with_retry(session, url, params, config, tentativa=1): Realiza uma requisição HTTP com retentativas e backoff exponencial em caso de falhas.limited_fetch(semaphore, session, url, params, config): Controla o número máximo de conexões simultâneas utilizando um semáforo.fetch_licitacoes(tipos_documento, ordenacao, pages, config): Realiza as requisições das licitações de forma assíncrona para cada tipo de documento.fetch_detalhes(registros, data_type, config): Realiza as requisições dos detalhes (itens ou arquivos) de forma assíncrona para cada registro de licitação.Interação com Outros Módulos:
Objetivo: Estruturar e processar os dados recebidos das requisições, transformando-os em dataframes do pandas para armazenamento e análise.
Funções Principais:
process_licitacoes(respostas, df_licitacoes): Processa as respostas das licitações e atualiza o dataframe principal df_licitacoes.process_detalhes(detalhes_list, df_detalhes, data_type): Processa os detalhes (itens ou arquivos) e atualiza os dataframes correspondentes (df_itens ou df_arquivos).Interação com Outros Módulos:
Objetivo: Realizar uma verificação adicional para inspecionar o conteúdo dos arquivos compactados (.zip, .rar, .7zip) listados nas licitações.
Funções Principais:
verify_compressed_files(paths, config): Verifica arquivos compactados, extrai seus conteúdos e atualiza o DataFrame df_arquivos.
verificar_e_extrair(session, index, row): Função auxiliar para baixar e extrair arquivos compactados usando as bibliotecas zipfile, rarfile e py7zr.Interação com Outros Módulos:
df_arquivos e utiliza o Módulo de Logs para registrar eventos de verificação.Objetivo: Orquestrar o fluxo de execução entre os módulos, garantindo que o processo siga corretamente do início ao fim.
Funções Principais:
main(): Coordena a execução dos módulos, gerencia o fluxo de dados entre eles e controla o processo de raspagem.Fluxo de Execução:
A Interface de Linha de Comando (CLI) do sistema permite ao usuário configurar os parâmetros de execução diretamente no momento de inicialização, fornecendo flexibilidade para customizar o comportamento do programa. A seguir, são detalhados os principais parâmetros disponíveis na CLI e exemplos de como utilizá-los.
--pagina-inicial
--pagina-inicial 5 (começa a raspagem a partir da página 5).--tam-pagina
--tam-pagina 100 (baixa 100 registros por requisição).--ordenacao
--ordenacao data_publicacao_pncp,-data,relevancia (ordena os resultados pela data de publicação no PNCP, data descendente e relevância).data,-data,relevancia.--tipos-documento
edital, ata ou ambos.--tipos-documento edital ata (baixará documentos dos tipos edital e ata).edital,ata.--max-conexoes
--max-conexoes 5 (limita o número de conexões a 5).--tentativas-maximas
--tentativas-maximas 3 (tenta cada requisição até 3 vezes em caso de falha).--verbose
--verbose (ativa a exibição de mensagens detalhadas no console).--verbose).--help
--help. python raspagem.py
data,-data,relevancia, tipos de documento edital,ata, máximo de 10 conexões, até 5 tentativas em caso de falha e modo silencioso. python raspagem.py --pagina-inicial 10 --tam-pagina 100
python raspagem.py --ordenacao data_publicacao_pncp --tipos-documento edital
data_publicacao_pncp e baixa apenas documentos do tipo edital. python raspagem.py --max-conexoes 5 --verbose
python raspagem.py --pagina-inicial 3 --tam-pagina 200 --ordenacao data_publicacao_pncp,-data --tipos-documento edital ata --max-conexoes 8 --tentativas-maximas 4 --verbose
data_publicacao_pncp e -data, baixa documentos dos tipos edital e ata, limita conexões simultâneas a 8, permite até 4 tentativas por requisição e exibe mensagens detalhadas.O fluxo de execução do Sistema de Raspagem de Licitações do PNCP é organizado para garantir eficiência, controle e robustez durante a coleta e processamento dos dados. A seguir, é apresentado o fluxo geral do sistema:
main).df_licitacoes, df_itens, df_arquivos) são carregados a partir dos arquivos CSV.asyncio e aiohttp.--max-conexoes.detalhes_baixados e documentos_baixados) para monitorar o status de cada licitação..zip, .rar, .7zip) que ainda não foram verificados.df_arquivos.verificacao_arquivos é atualizada para True após a verificação.Este fluxo garante que o sistema execute a raspagem de forma organizada, eficiente e resiliente a falhas, permitindo uma coleta de dados robusta e confiável.
A seguir, apresenta-se um diagrama detalhado da arquitetura do sistema utilizando a linguagem Mermaid, que ilustra os módulos, suas funções principais, métodos importantes e os relacionamentos entre eles.
graph TD
A[Módulo Principal (Main)]
B[Módulo de Configuração]
C[Módulo de Interface de Linha de Comando (CLI)]
D[Módulo de Logs]
E[Módulo de Diretórios e Arquivos]
F[Módulo de Armazenamento]
G[Módulo de Requisições]
H[Módulo de Processamento de Dados]
I[Módulo de Verificação de Arquivos Compactados]
%% Relacionamentos entre Módulos
A --> B
A --> C
A --> D
A --> E
A --> F
A --> G
A --> H
A --> I
%% Detalhes dos Módulos
B --> |Carrega Configurações| B1[Função load_config]
C --> |Analisa Argumentos CLI| C1[Função parse_arguments]
D --> |Configura Logs| D1[Função setup_logging]
E --> |Configura Diretórios e Arquivos| E1[Função setup_directories]
F --> |Carrega/Sava Dataframes| F1[Funções load_dataframes e save_dataframes]
G --> |Realiza Requisições Assíncronas| G1[Funções fetch_licitacoes e fetch_detalhes]
H --> |Processa Dados JSON| H1[Funções process_licitacoes e process_detalhes]
I --> |Verifica Arquivos Compactados| I1[Função verify_compressed_files]
I1 --> |Verifica e Extrai| I2[Função auxiliar verificar_e_extrair]
%% Relações Adicionais
B -->|Fornece Configurações| G
B -->|Fornece Configurações| H
B -->|Fornece Configurações| I
E -->|Fornece Caminhos| F
E -->|Fornece Caminhos| I
G -->|Fornece Dados JSON| H
H -->|Atualiza Dataframes| F
I -->|Atualiza Dataframes| F
D -->|Registra Eventos e Erros| A
D -->|Registra Eventos e Erros| B
D -->|Registra Eventos e Erros| C
D -->|Registra Eventos e Erros| E
D -->|Registra Eventos e Erros| F
D -->|Registra Eventos e Erros| G
D -->|Registra Eventos e Erros| H
D -->|Registra Eventos e Erros| I
%% Métodos Importantes
G1 --> |Implementa Retentativas| G1a[Função fetch_with_retry]
G1 --> |Controla Conexões| G1b[Função limited_fetch]
I1 --> |Usa zipfile, rarfile, py7zr| I1a[Bibliotecas de Extração]
main: Função central que inicia e gerencia todo o processo de raspagem.load_config: Carrega as configurações do sistema a partir do arquivo config.ini e aplica os parâmetros da CLI.parse_arguments: Define e analisa os argumentos fornecidos via CLI, permitindo ao usuário customizar o comportamento do script.setup_logging: Configura o sistema de logs para registrar eventos e erros.setup_directories: Verifica a existência dos diretórios e arquivos necessários (raspagem/licitacoes.csv, raspagem/itens.csv, raspagem/arquivos.csv, raspagem/raspagem_pncp.log) e os cria se não existirem.load_dataframes: Carrega os dataframes existentes a partir dos arquivos CSV ou cria novos dataframes vazios se os arquivos não existirem.save_dataframes: Salva os dataframes atualizados em arquivos CSV, evitando duplicidades.Verificação de Registros: Garante que não haja duplicidades nos registros salvos.fetch_with_retry: Realiza uma requisição HTTP com retentativas e backoff exponencial em caso de falhas.limited_fetch: Controla o número máximo de conexões simultâneas utilizando um semáforo.fetch_licitacoes: Realiza as requisições das licitações de forma assíncrona para cada tipo de documento.fetch_detalhes: Realiza as requisições dos detalhes (itens ou arquivos) de forma assíncrona para cada registro de licitação.Backoff Strategy: Estratégia de aumento progressivo do tempo de espera entre tentativas em caso de falhas nas requisições.fetch_with_retry: Implementa retentativas com backoff exponencial.limited_fetch: Controla o número máximo de conexões simultâneas.process_licitacoes: Processa as respostas das licitações e atualiza o dataframe principal df_licitacoes.process_detalhes: Processa os detalhes (itens ou arquivos) e atualiza os dataframes correspondentes (df_itens ou df_arquivos).verify_compressed_files: Verifica arquivos compactados, extrai seus conteúdos e atualiza o DataFrame df_arquivos.verificar_e_extrair: Função auxiliar para baixar e extrair arquivos compactados usando as bibliotecas zipfile, rarfile e py7zr.Bibliotecas de Extração: Utiliza zipfile, rarfile e py7zr para manipular diferentes formatos de arquivos compactados.O Sistema de Raspagem de Licitações do PNCP é uma ferramenta robusta e eficiente para coletar e processar grandes volumes de dados de licitações públicas. Sua estrutura modularizada facilita a manutenção, escalabilidade e flexibilidade, permitindo ajustes conforme as necessidades específicas do usuário.
Através da Interface de Linha de Comando (CLI), os usuários têm controle total sobre os parâmetros de execução, garantindo que o sistema possa ser adaptado para diferentes cenários e requisitos de coleta de dados.
O diagrama em Mermaid fornece uma visão clara da arquitetura do sistema, destacando as interações entre os módulos e os métodos importantes que cada um deles possui. Isso facilita a compreensão do fluxo de dados e do funcionamento interno do sistema.
Para garantir o correto funcionamento do sistema, é essencial que todas as dependências estejam instaladas e que o ambiente de execução esteja configurado adequadamente, especialmente para o manuseio de arquivos compactados que exigem ferramentas específicas como unrar.
Em caso de dúvidas ou necessidade de suporte adicional, recomenda-se consultar os logs detalhados gerados pelo sistema, que fornecem informações valiosas sobre o progresso e possíveis erros durante a execução do processo de raspagem.
graph TD
A[Módulo Principal (Main)]
B[Módulo de Configuração]
C[Módulo de Interface de Linha de Comando (CLI)]
D[Módulo de Logs]
E[Módulo de Diretórios e Arquivos]
F[Módulo de Armazenamento]
G[Módulo de Requisições]
H[Módulo de Processamento de Dados]
I[Módulo de Verificação de Arquivos Compactados]
%% Relacionamentos entre Módulos
A --> B
A --> C
A --> D
A --> E
A --> F
A --> G
A --> H
A --> I
%% Detalhes dos Módulos
B --> |Carrega Configurações| B1[Função load_config]
C --> |Analisa Argumentos CLI| C1[Função parse_arguments]
D --> |Configura Logs| D1[Função setup_logging]
E --> |Configura Diretórios e Arquivos| E1[Função setup_directories]
F --> |Carrega/Sava Dataframes| F1[Funções load_dataframes e save_dataframes]
G --> |Realiza Requisições Assíncronas| G1[Funções fetch_licitacoes e fetch_detalhes]
H --> |Processa Dados JSON| H1[Funções process_licitacoes e process_detalhes]
I --> |Verifica Arquivos Compactados| I1[Função verify_compressed_files]
I1 --> |Verifica e Extrai| I2[Função auxiliar verificar_e_extrair]
%% Relações Adicionais
B -->|Fornece Configurações| G
B -->|Fornece Configurações| H
B -->|Fornece Configurações| I
E -->|Fornece Caminhos| F
E -->|Fornece Caminhos| I
G -->|Fornece Dados JSON| H
H -->|Atualiza Dataframes| F
I -->|Atualiza Dataframes| F
D -->|Registra Eventos e Erros| A
D -->|Registra Eventos e Erros| B
D -->|Registra Eventos e Erros| C
D -->|Registra Eventos e Erros| E
D -->|Registra Eventos e Erros| F
D -->|Registra Eventos e Erros| G
D -->|Registra Eventos e Erros| H
D -->|Registra Eventos e Erros| I
%% Métodos Importantes
G1 --> |Implementa Retentativas| G1a[Função fetch_with_retry]
G1 --> |Controla Conexões| G1b[Função limited_fetch]
I1 --> |Usa zipfile, rarfile, py7zr| I1a[Bibliotecas de Extração]
main: Função central que inicia e gerencia todo o processo de raspagem.load_config: Carrega as configurações do sistema a partir do arquivo config.ini e aplica os parâmetros da CLI.parse_arguments: Define e analisa os argumentos fornecidos via CLI, permitindo ao usuário customizar o comportamento do script.setup_logging: Configura o sistema de logs para registrar eventos e erros.setup_directories: Verifica a existência dos diretórios e arquivos necessários (raspagem/licitacoes.csv, raspagem/itens.csv, raspagem/arquivos.csv, raspagem/raspagem_pncp.log) e os cria se não existirem.load_dataframes: Carrega os dataframes existentes a partir dos arquivos CSV ou cria novos dataframes vazios se os arquivos não existirem.save_dataframes: Salva os dataframes atualizados em arquivos CSV, evitando duplicidades.Verificação de Registros: Garante que não haja duplicidades nos registros salvos.fetch_with_retry: Realiza uma requisição HTTP com retentativas e backoff exponencial em caso de falhas.limited_fetch: Controla o número máximo de conexões simultâneas utilizando um semáforo.fetch_licitacoes: Realiza as requisições das licitações de forma assíncrona para cada tipo de documento.fetch_detalhes: Realiza as requisições dos detalhes (itens ou arquivos) de forma assíncrona para cada registro de licitação.Backoff Strategy: Estratégia de aumento progressivo do tempo de espera entre tentativas em caso de falhas nas requisições.fetch_with_retry: Implementa retentativas com backoff exponencial.limited_fetch: Controla o número máximo de conexões simultâneas.process_licitacoes: Processa as respostas das licitações e atualiza o dataframe principal df_licitacoes.process_detalhes: Processa os detalhes (itens ou arquivos) e atualiza os dataframes correspondentes (df_itens ou df_arquivos).verify_compressed_files: Verifica arquivos compactados, extrai seus conteúdos e atualiza o DataFrame df_arquivos.verificar_e_extrair: Função auxiliar para baixar e extrair arquivos compactados usando as bibliotecas zipfile, rarfile e py7zr.Bibliotecas de Extração: Utiliza zipfile, rarfile e py7zr para manipular diferentes formatos de arquivos compactados.O Sistema de Raspagem de Licitações do PNCP é uma ferramenta robusta e eficiente para coletar e processar grandes volumes de dados de licitações públicas. Sua estrutura modularizada facilita a manutenção, escalabilidade e flexibilidade, permitindo ajustes conforme as necessidades específicas do usuário.
Através da Interface de Linha de Comando (CLI), os usuários têm controle total sobre os parâmetros de execução, garantindo que o sistema possa ser adaptado para diferentes cenários e requisitos de coleta de dados.
O diagrama em Mermaid fornece uma visão clara da arquitetura do sistema, destacando as interações entre os módulos e os métodos importantes que cada um deles possui. Isso facilita a compreensão do fluxo de dados e do funcionamento interno do sistema.
Para garantir o correto funcionamento do sistema, é essencial que todas as dependências estejam instaladas e que o ambiente de execução esteja configurado adequadamente, especialmente para o manuseio de arquivos compactados que exigem ferramentas específicas como unrar.
Em caso de dúvidas ou necessidade de suporte adicional, recomenda-se consultar os logs detalhados gerados pelo sistema, que fornecem informações valiosas sobre o progresso e possíveis erros durante a execução do processo de raspagem.
graph TD
A[Módulo Principal (Main)]
B[Módulo de Configuração]
C[Módulo de Interface de Linha de Comando (CLI)]
D[Módulo de Logs]
E[Módulo de Diretórios e Arquivos]
F[Módulo de Armazenamento]
G[Módulo de Requisições]
H[Módulo de Processamento de Dados]
I[Módulo de Verificação de Arquivos Compactados]
%% Relacionamentos entre Módulos
A --> B
A --> C
A --> D
A --> E
A --> F
A --> G
A --> H
A --> I
%% Detalhes dos Módulos
B --> |Carrega Configurações| B1[Função load_config]
C --> |Analisa Argumentos CLI| C1[Função parse_arguments]
D --> |Configura Logs| D1[Função setup_logging]
E --> |Configura Diretórios e Arquivos| E1[Função setup_directories]
F --> |Carrega/Sava Dataframes| F1[Funções load_dataframes e save_dataframes]
G --> |Realiza Requisições Assíncronas| G1[Funções fetch_licitacoes e fetch_detalhes]
H --> |Processa Dados JSON| H1[Funções process_licitacoes e process_detalhes]
I --> |Verifica Arquivos Compactados| I1[Função verify_compressed_files]
I1 --> |Verifica e Extrai| I2[Função auxiliar verificar_e_extrair]
%% Relações Adicionais
B -->|Fornece Configurações| G
B -->|Fornece Configurações| H
B -->|Fornece Configurações| I
E -->|Fornece Caminhos| F
E -->|Fornece Caminhos| I
G -->|Fornece Dados JSON| H
H -->|Atualiza Dataframes| F
I -->|Atualiza Dataframes| F
D -->|Registra Eventos e Erros| A
D -->|Registra Eventos e Erros| B
D -->|Registra Eventos e Erros| C
D -->|Registra Eventos e Erros| E
D -->|Registra Eventos e Erros| F
D -->|Registra Eventos e Erros| G
D -->|Registra Eventos e Erros| H
D -->|Registra Eventos e Erros| I
%% Métodos Importantes
G1 --> |Implementa Retentativas| G1a[Função fetch_with_retry]
G1 --> |Controla Conexões| G1b[Função limited_fetch]
I1 --> |Usa zipfile, rarfile, py7zr| I1a[Bibliotecas de Extração]
main: Função central que inicia e gerencia todo o processo de raspagem.load_config: Carrega as configurações do sistema a partir do arquivo config.ini e aplica os parâmetros da CLI.parse_arguments: Define e analisa os argumentos fornecidos via CLI, permitindo ao usuário customizar o comportamento do script.setup_logging: Configura o sistema de logs para registrar eventos e erros.setup_directories: Verifica a existência dos diretórios e arquivos necessários (raspagem/licitacoes.csv, raspagem/itens.csv, raspagem/arquivos.csv, raspagem/raspagem_pncp.log) e os cria se não existirem.load_dataframes: Carrega os dataframes existentes a partir dos arquivos CSV ou cria novos dataframes vazios se os arquivos não existirem.save_dataframes: Salva os dataframes atualizados em arquivos CSV, evitando duplicidades.Verificação de Registros: Garante que não haja duplicidades nos registros salvos.fetch_with_retry: Realiza uma requisição HTTP com retentativas e backoff exponencial em caso de falhas.limited_fetch: Controla o número máximo de conexões simultâneas utilizando um semáforo.fetch_licitacoes: Realiza as requisições das licitações de forma assíncrona para cada tipo de documento.fetch_detalhes: Realiza as requisições dos detalhes (itens ou arquivos) de forma assíncrona para cada registro de licitação.Backoff Strategy: Estratégia de aumento progressivo do tempo de espera entre tentativas em caso de falhas nas requisições.fetch_with_retry: Implementa retentativas com backoff exponencial.limited_fetch: Controla o número máximo de conexões simultâneas.process_licitacoes: Processa as respostas das licitações e atualiza o dataframe principal df_licitacoes.process_detalhes: Processa os detalhes (itens ou arquivos) e atualiza os dataframes correspondentes (df_itens ou df_arquivos).verify_compressed_files: Verifica arquivos compactados, extrai seus conteúdos e atualiza o DataFrame df_arquivos.verificar_e_extrair: Função auxiliar para baixar e extrair arquivos compactados usando as bibliotecas zipfile, rarfile e py7zr.Bibliotecas de Extração: Utiliza zipfile, rarfile e py7zr para manipular diferentes formatos de arquivos compactados.Este diagrama e as descrições dos módulos oferecem uma visão abrangente do funcionamento e da estrutura do sistema de raspagem. O usuário pode usar a CLI para customizar o processo, e cada módulo desempenha uma função específica para garantir a execução eficiente e modular do sistema.
Este manual detalha a estrutura, funcionamento e uso do Sistema de Raspagem de Licitações do PNCP. A modularização do sistema, combinada com uma Interface de Linha de Comando (CLI) flexível e um robusto sistema de logs, assegura uma coleta de dados eficiente, escalável e fácil de manter. O diagrama em Mermaid complementa o entendimento da arquitetura do sistema, destacando as interações entre os módulos e os métodos críticos que garantem o funcionamento adequado do processo de raspagem.
Para garantir o correto funcionamento do sistema, assegure-se de que todas as dependências estão instaladas e que o ambiente de execução está devidamente configurado, especialmente para o manuseio de arquivos compactados que requerem ferramentas específicas como unrar.
Em caso de dúvidas ou necessidade de suporte adicional, consulte os logs detalhados gerados pelo sistema, que fornecem informações valiosas sobre o progresso e possíveis erros durante a execução do processo de raspagem.