Este projeto foi concebido como parte de um desafio durante a disciplina de Web Mining & Crawler Scraping, no curso de pós-graduação em Engenharia de Dados, na Universidade de Fortaleza (Unifor).
O desafio consistia em desenvolver um scraper no site de nossa escolha, extrair e retornar os dados. Optei por raspar o histórico de taxas de juros básicas do BACEN.
Para realizar esse processo, utilizei Selenium
para a raspagem de dados, Pandas
para transformação, Pandera
para qualidade de dados e SQLAlchemy ORM
para persistência, realizando insert e update conforme necessário.
Utilizando Poetry
para gerenciamento de ambientes virtuais e dependências, e Pyenv
para o controle de versão.
3.11.9
- selenium
- pandas
- lxml
- html5lib
- pandera
- sqlalchemy
- psycopg2-binary
- pyodbc
- loguru
- flake8
- black
- isort
- ipykernel
- matplotlib
- pre-commit
Você pode instalar as dependências manualmente, ou, utilizando o Poetry ou o Pip com os seguintes comandos:
poetry install
pip install -r requirements.txt
O arquivo ./bacen-interest-rate-history/core/domain/models/rate_history.py
contém a definição da classe que representa a tabela do banco de dados, ou seja, a classe que mapeia a tabela onde os dados serão persistidos, com os campos necessários para cada registro.
Neste caso, a classe está mapeada para a tabela historico_juros_taxas
. Caso seja necessário, você pode alterar para outra tabela conforme a necessidade do projeto.
Os scripts SQL disponibilizados em ./sql/
inclui o esquema da tabela, com detalhes sobre os tipos de dados, chaves primárias e quaisquer restrições adicionais necessárias.
Nas linhas 10 e 11 do script ./bacen-interest-rate-history/bacen-interest-rate-history/core/main.py
existe a criação do objeto engine para os bancos PostgreSQL
e SQL Server
, basta configurar na ordem:
- Banco para persistência
- Consulte o arquivo
./bacen-interest-rate-history/bacen-interest-rate-history/core/utils/db_engine.py
para verificar os bancos suportados.
- Consulte o arquivo
- IP do banco
- Usuário
- Senha
- Database
Como visto anteriormente, a engine está adaptada para persistir os dados ou no Postgres ou no SQL Server, caso precise persistir em outros bancos, como MySQL, basta consultar a documentação do SQL Alchemy e adicionar uma nova opção na função create_engine
existente no arquivo ./bacen-interest-rate-history/bacen-interest-rate-history/core/utils/db_engine.py
.
Tenho preparado na pasta ./bacen-interest-rate-history/infra/docker/
um docker-compose, com um container Postgres e um container SQL Server, que cria automaticamente o banco e as tabelas, caso queira utilizar um deles, prossiga com o comando:
docker-compose up -d
Lembre-se de verificar o usuário e a senha dos bancos de dados no arquivo docker-compose.yml
.
Usando Pandera
para garantir a qualidade dos dados após a transformação. O arquivo ./bacen-interest-rate-history/core/domain/models/rate_history.py
contém a definição da classe que representa o schema de saída da transformação dos dados usando Pandas
, verificando a tipagem dos dados e garantido que estejam de acordo com o schema do banco de dados.
Após realizar essa primeira configuração, o projeto está pronto para ser executado. Ele pode facilmente persistir em qualquer banco de dados relacional, desde que a engine
esteja configurada corretamente. Isso oferece uma ampla flexibilidade para adaptar o projeto a diferentes ambientes e requisitos de armazenamento de dados.
Para executar o projeto, utilize o seguinte comando:
python ./bacen-interest-rate-history/bacen-interest-rate-history/core/main.py
- A documentação pode não estar tão detalhada, talvez seja necessário um certo nível de conhecimento para adaptar o código.
- Se tudo estiver configurado corretamente, basta executar o script e verificar a tabela no banco de dados usando o DBeaver ou outra ferramenta de sua preferencia.
- Tentei aplicar os conceitos de SOLID nesse projeto, por isso a estrutura pode parecer uma pouco confusa.
- Disponibilizei na pasta
./notebooks/
um jupyter notebook chamadodata_analysis.ipynb
, onde recupero os dados inseridos no banco de dados e faço uma análise da evolução da meta Selic ao longo do tempo.