O projeto Desafio Crawler foi desenvolvido com o objetivo de extrair dados de um site específico por meio de web scraping e disponibilizá-los em formatos estruturados (CSV). O principal propósito é automatizar a coleta de citações de um site e permitir que o usuário escolha como deseja receber essas citações.
- Realizar a busca por dados de forma automatizada (por meio de um script de linha de comando ou interface clicável)
- Padronizar os retornos estruturados (json/csv)
- Implementar um sistema de registro para acompanhar a execução
- Fornecer prova da consulta (captura de tela)
- Extras:
- Armazenar os resultados em um banco de dados relacional ou não-relacional
- Criar um dataframe para visualizar os resultados usando o pandas
- Capturar resultados dinamicamente sem fixar os caminhos xpath
- Dockerizar a aplicação
- Agendar a execução para uma data e horário específicos.
Você pode executar este projeto dentro de um contêiner Docker, eliminando a necessidade de instalar dependências no ambiente local. Siga as etapas abaixo:
Certifique-se de ter o Docker instalado em seu sistema.
- Clone este repositório em seu computador.
- Execute o comando de build do Docker para criar a imagem do contêiner:
docker build -t nome-da-imagem .- Agora, você pode executar o contêiner Docker criado com o seguinte comando:
docker-compose up -d
- Para acessar o terminal do contêiner:
docker run -it desafio_crawler /bin/bash
Este projeto utiliza um Makefile para simplificar tarefas comuns de desenvolvimento, como formatação e verificação de código. A seguir, estão os comandos disponíveis no Makefile:
Para executar os comandos, abra um terminal no diretório raiz do projeto e execute o seguinte comando:
make format
Esse comando aplicará a formatação ao código Python no diretório atual e em subdiretórios, seguindo as convenções de estilo do black. É uma boa prática executar este comando antes de enviar seu código para revisão ou quando desejar manter uma formatação consistente.
make play-crawler
Esse comando iniciará a execução do projeto, que deve estar configurado no arquivo main.py.
As citações serão salvas em arquivos CSV, screenshots em formato PNG serão capturadas e salvas na pasta "output". Além disso, os dataframes pandas serão salvos no banco de dados e os screenshots também serão salvos no banco, ambos em formato binário, para facilitar consultas futuras.
A janela de interação do Desafio Crawler permite ao usuário escolher como deseja receber as citações. As opções disponíveis são:
- Ver citações por autor: O usuário pode buscar citações específicas de um autor selecionado.
- Ver citações por tag: O usuário pode buscar citações relacionadas a uma tag específica.
- Ver todas as citações: O usuário pode visualizar todas as citações disponíveis.
- Ver logs: O usuário pode acessar e analisar os registros do processo de execução, caso ocorra uma falha ou para fins de análise.
- Sair: O usuário pode sair do Desafio Crawler.
Essas interações permitem ao usuário personalizar a forma como ele recebe as citações e explorar diferentes aspectos do conteúdo disponível.
|-- desafio_crawler
| |-- logger
| | |-- log_script.py
| | |-- log_file.txt
| |-- output
| | |-- csv_files
| | | |-- search_results.csv
| | |-- screenshot
| | | |-- screenshot.png
| |-- chromedriver
| |-- utils
| | |-- job.py
| | |-- scheduler.py
| | |-- name_generator.py
| | |-- logger.py
| | |-- requirements.txt
| | |-- start.sh
| |-- main.py
| |-- quote.py
| |-- core_db.py
| |-- makefile
|-- Dockerfile
|-- .env_sample
|-- .gitignore
|-- docker-compose.yml
|-- readme.md
A pasta "logger" contém um arquivo de script chamado script.py para exibir os logs do projeto, assim como um arquivo que pode ser lido para hospedar esses logs.
A pasta "output" armazena os arquivos CSV das buscas e o arquivo de captura de tela (screenshot).
O arquivo chromedriver é utilizado para abrir o Google.
Na pasta "utils", encontramos os seguintes arquivos:
job.pyque será utilizado para executar o cronjob futuramente.scheduler.pyque é um script de interação onde o usuário pode escrever quando deseja agendar o cronjob.name_generator.pypara criar nomes para o screenshot e os arquivos CSV das consultas.logger.pyque carrega todos os scripts necessários para a biblioteca de log criar logs.
Na raiz da pasta "desafio_crawler", encontramos:
main.pyque é o script responsável por iniciar a interação com o usuário.quote.pyonde está a classe responsável pelo web scraping.core_db.pyque cuida da criação do banco de dados com SQLite e a inserção dos dados nele.
A seguir, são apresentadas as melhorias sugeridas para o projeto Desafio Crawler, que serão documentadas formalmente:
- Conclusão do cronjob.
- Aperfeiçoamento do código para reduzir a dependência excessiva de xpath.
- Aprimoramento da arquitetura do projeto.
- Aumento do desempenho, considerando a utilização de paralelismo, threads e limitando-as.
- Armazenamento de imagens e arquivos em um bucket da AWS.
- Criação de testes, tanto de ponta a ponta quanto unitários.
- Melhoria do Dockerfile, utilizando uma imagem mais oficial.
- Adicionar uma biblioteca de tracing para acompanhar todo o processo e armazená-lo no banco de dados.
Essas melhorias contribuirão para aprimorar a funcionalidade, a eficiência e a confiabilidade do projeto Desafio Crawler.