Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/renanbirck/gasolina
Raspagem/coleta dos preços de combustíveis em Joinville/SC
https://github.com/renanbirck/gasolina
pdf python scraping
Last synced: about 1 month ago
JSON representation
Raspagem/coleta dos preços de combustíveis em Joinville/SC
- Host: GitHub
- URL: https://github.com/renanbirck/gasolina
- Owner: renanbirck
- License: mit
- Created: 2023-10-28T20:22:17.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2024-11-02T23:37:43.000Z (about 2 months ago)
- Last Synced: 2024-11-03T00:20:23.831Z (about 2 months ago)
- Topics: pdf, python, scraping
- Language: Python
- Homepage:
- Size: 597 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# gasolina: raspagem e processamento dos preços dos combustíveis disponibilizados pelo PROCON de Joinville/SC
## Introdução
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](https://www.joinville.sc.gov.br/publicacoes/pesquisas-de-precos-combustiveis-2024/).
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](https://streamlit.io), para apoio ao desenvolvimento
* **api**: uma API utilizando o fastapi## Requisitos
* Para o *scraper*:
* Python 3.11 ou mais recente;
* requests;
* BeautifulSoup.
* Para o parser:
* [pymupdf](https://github.com/pymupdf/PyMuPDF/issues/) (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.## Execução
* 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.* Para rodar o _parser_:
* No diretório `parser`, rodar o _script_ `run_parser.sh`, fornecendo um arquivo adequado como parâmetro.* Para rodar a _api_:
* No diretório `api`, rodar `fastapi dev main.py`.## Coisas a fazer:
* 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## Problemas encontrados
* A tabela fornecida pela prefeitura é inconsistente, com postos repetidos ou que mudaram de nome. Isso irá influenciar na estrutura do BD.
## Licença
Licenciado sob a licença MIT; ver o arquivo LICENSE para mais detalhes.