Skip to content

O presente projeto foi desenvolvido utilizando Docker, adotando como linguagem de programação o Ruby on Rails, com o banco de dados PostgreSQL. Para os background jobs foram utilizados o Redis e Sidekiq.

Notifications You must be signed in to change notification settings

thiagohrcosta/crawler-app

Repository files navigation

Crawler APP

enter image description here

Tecnologias utilizadas

Docker Ruby Rails Postgres Redis

O presente projeto foi desenvolvido utilizando Docker, adotando como linguagem de programação o Ruby on Rails, com o banco de dados PostgreSQL. Para os background jobs foram utilizados o Redis e Sidekiq. O objetivo final foi criar um MVP, ou seja, um produto minimamente viável que execute uma determinada tarefa pré-definida como prova de conceito. Foram gastas cerca de oito horas de trabalho no projeto.

Gems utilizadas que merecem destaque

Pry: Para depurar a aplicação. RSpec: Para a realização de testes Shoulda-Matchers: Para integrar nos testes com RSpec Simple Form For: Geração de formulários mais intuitivos. Nokogiri: Utilizado para ler os documentos anexados, realizando o scraping dos dados relevantes.

Arquivo base

O objetivo do presente projeto é ser capaz de ler um arquivo .eml anexado, ler seu conteúdo filtrando por informações relevantes. O modelo utilizado como base para o código deste projeto foi:

>> email.eml

From: "[email protected]" <[email protected]>
Subject: Meu carro
To: "[email protected]" <[email protected]>
Cc: 
Bcc: 
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="--_=_NextPart5809_c2918dba-0af9-492b-bce0-190936b46673"

This is a multi-part message in MIME format.

----_=_NextPart5809_c2918dba-0af9-492b-bce0-190936b46673
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

phone: (31) 3003-4040

name: John Doe

vehicle: BMW 320i

price: 100.000

year: 2022

link: https://mg.olx.com.br/belo-horizonte-e-regiao/autos-e-pecas/carros-vans-e-utilitarios/bmw-320i-2013-2-0-16v-turbo-1171849286?lis=listing_2020

Estou procurando uma BMW 320i na faixa dos 100 a 200 mil.


----_=_NextPart5809_c2918dba-0af9-492b-bce0-190936b46673
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf-8"><p=
>phone: (31) 3003-4040</p><p>name: John Doe</p><p>vehicle: BMW 320i</p>=
<p>price: 100.000</p><p>year: 2022</p><p>link: https://mg.olx.com.br/belo-horizonte-e-regiao/autos-e-pecas/carros-vans-e-utilitarios/bmw-320i-2013-2-0-16v-turbo-1171849286?lis=listing_2020</p><p>Estou procurando uma BMW 320i na faixa dos 100 a 200 mil.</p><p><br></p>
----_=_NextPart5809_c2918dba-0af9-492b-bce0-190936b46673--

Como funciona o sistema?

Uma vez que um arquivo .eml no formato acima tenha sido anexado na plataforma, o sistema chamará o leads_controller.rb que será responsável por receber o arquivo anexado fazendo sua primeira leitura e armazenando seu conteúdo em uma variável.

Com a variável contendo os dados crus do arquivo anexado o job LeadGenerator.job é chamado, sendo responsável pelo tratamento dos dados em background. Neste job, um Lead será criado e os dados serão raspados pela primeira vez, com o objetivo de se buscar o telefone, nome, veículo, preço, ano e link de um anúncio recebido e armazenado no arquivo anexado.

Tendo sido criado o leads_controller.rbretornará com os dados e agora verificará os Leads existentes e se este possui um veículo vinculado a ele, não existindo o VehicleGeneratorJob é chamado, iniciando um segundo trabalho em background que receberá o link armazenado na etapa de scraping do Lead, e então acessará a página web em busca das informações necessárias.

No caso em tela, foi utilizado um link do OLX escolhido aleatoriamente e disponível na data de 13 de abril de 2023.

Clique aqui para abrir o link do OLX (obs: o link poderá ficar indisponível). Abaixo é possível ver os dados que foram buscados da referida página web.
enter image description here

Ao realizar o scraping da página acima, os dados como modelo, marca, quilometragem e os itens opcionais são recebidos pelo VehicleGeneratorJob que fica responsável por instanciar um novo veículo vinculado a um Lead já cadastrado cujo link foi objetivo em seu scraping, bem como instancia seus itens opcionais.

Interface

Não foi utilizada nenhum recurso para a criação de interfaces complexas dado a simplicidade do frontend, resumindo ao desenvolvimento básico com CSS.

Foi desenvolvida duas telas simples, a primeira e definida como "root" do projeto permite o upload de um arquivo ".eml". Uma vez anexado e tendo os dados sidos extraídos, o usuário é enviado para o dashboard onde pode ver os últimos resultados obtidos. enter image description here

Não foi implementada a funcionalidade de login com Devise tampouco "policies" de autorização com Pundit, uma vez que o objetivo era realizar o processo de obtenção de dados de arquivos e páginas web. A implementação de autenticação pode ser visto em projetos como Real State API e autorização no Restaurants With Pundit

.Env keys

Para a execução correta do projeto, será necessário adicionar um arquivo .env com as seguintes chaves:

REDIS_URL_SIDEKIQ=redis://redis:6379/1
REDIS_HOST=redis

Lembre-se de adicionar no .gitignore o arquivo .env.

Como rodar o projeto?

Este projeto roda com Docker. O arquivo docker-compose.yml, contém todas as informações dos containers que irão subir com a aplicação, neste caso:

Banco de dados PostgreSQL
Redis
Sidekiq
Web (a aplicação)

Faça o clone do projeto , acesse a pasta e rode o comando docker-compose build para que sejam rodados todos os comandos necessários tais como bundle install, yarn install, entre outros. Ao final, concluído o comando anterior rode o comando docker-compose up para subir a aplicação.

Caso decida efetuar testes ("debugar") em tempo real na aplicação com o pry, suba a aplicação com o comando docker-compose run --service-ports web.

Comandos importantes com Docker

Acessar o terminal do rails: docker-compose run web rails c
Listar rotas: docker-compose run web rails routes -c "nome do controller"
Iniciar o projeto e containers: docker-compose build
Subir a aplicação: docker-compose up

Referências em meus repositórios no Github

BackgroundJobs
Sidekiq-background: Pequeno projeto testando e implementando background jobs.

Scraping
Viaggiare-Italia-API: Neste projeto foi realizado um scraping de dados públicos de cidades italianas e de repositórios de fotos no Unsplash. Clique aqui para visualizar. Scraper Ruby: Pequeno projeto para testar o Nokogiri.

Mailing
Ruby Mailing: Projeto desenvolvido para testar a utilização do sistema de mailing com RoR.

Testes
E-Commerce-API: Aplicação desenvolvida com mais de 200 testes, inclusive de requests.

Frontend
Coffee Delivery: Aplicação de delivery desenvolvido com Styled Components.

About

O presente projeto foi desenvolvido utilizando Docker, adotando como linguagem de programação o Ruby on Rails, com o banco de dados PostgreSQL. Para os background jobs foram utilizados o Redis e Sidekiq.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages