gasolina: raspagem e processamento dos preços dos combustíveis disponibilizados pelo PROCON de Joinville/SC
O PROCON de Joinville/SC, disponibiliza, por meio do seu site, o preço dos combustíveis em todos os postos de gasolina do município.
Assim, o objetivo deste projeto é coletar esses dados e alimentar um banco de dados, a partir do qual é gerado um dashboard e tabelas nas quais é possível fazer a filtragem por bairro.
O back-end do projeto é estruturado em três módulos:
- scraper: faz a raspagem do site do PROCON e determina o arquivo PDF a ser baixado.
- parser: processa o arquivo PDF, carregando os valores dele no banco de dados.
- api: disponibiliza os dados coletados para o front-end.
- Para o scraper:
- Python 3.11 ou mais recente;
- requests;
- BeautifulSoup.
- Para o parser:
- pymupdf (foi o que funcionou melhor para este layout de PDF nos meus testes);
- TODO: continuar a parte de processamento do PDF
- TODO: ver o uso de um ORM, substituindo o uso de SQL puro.
- TODO: definir como será feita a API.
- TODO: definir como será feito o front-end.
-
Para rodar o scraper dentro de um container:
- Construir o container - usei o podman, mas é igual para o Docker - a partir da raiz:
podman build -t docker-scraper -f scraper/Dockerfile .
- Como o scraper escreve para um diretório, é preciso executar o container indicando onde gravar os dados.
podman run -d -v [local onde gravar os dados]:/app/data docker-scraper:latest
- Construir o container - usei o podman, mas é igual para o Docker - a partir da raiz:
-
Para rodar o parser:
- No diretório
parser
, rodar o scriptrun_parser.sh
, fornecendo um arquivo adequado como parâmetro.
- No diretório
-
TODO: a estrutura dos PDFs mudou conforme o tempo, então preciso ver como fazer. Provavelmente vou fazer data wrangling na mão e fornecer um CSV.
-
TODO: integrar os testes com o container.
-
TODO: escrever Dockerfiles para o resto
-
TODO: configurar Actions para rodar os testes automaticamente
-
TODO: automatizar o deploy
-
TODO: ver se há alguma forma mais inteligente, evitando raspagem de PDF ou ao menos tornando ela mais resistenta a mudanças no layout do PDF.
- A tabela fornecida pela prefeitura é inconsistente, com postos repetidos ou que mudaram de nome.
Licenciado sob a licença MIT; ver o arquivo LICENSE para mais detalhes.