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:
- 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.
- data-explorer: um front-end simples usando a bibloteca streamlit, para apoio ao desenvolvimento
- api: uma API utilizando o fastapi
- 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
- Para a API:
- FastAPI
- TODO: ver o uso de um ORM, substituindo o uso de SQL puro.
- 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
É ideal que o local seja um caminho absoluto, para evitar ambiguidades.
- 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
-
Para rodar a api:
- No diretório
api
, rodarfastapi dev main.py
.
- No diretório
- 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.
- Verificar se vale a pena fazer a raspagem de forma assíncrona
- Integrar os testes com o container.
- Escrever Dockerfiles para o resto
- Configurar Actions para rodar os testes automaticamente
- Automatizar o deploy
- Fazer a raspagem comunicar via API em vez de chamadas SQL diretamente no BD.
- Usar TypeScript e algum framework, como React ou vue, no front-end
- A tabela fornecida pela prefeitura é inconsistente, com postos repetidos ou que mudaram de nome. Isso irá influenciar na estrutura do BD.
Licenciado sob a licença MIT; ver o arquivo LICENSE para mais detalhes.