Criando um agregador de notícias (Com agendamento de eventos – Whenever)

Um agregador de notícias é um site que reúne notícias de vários outros sites, no nosso caso nós vamos “baixar” as noticias do Google News e exibí-las.
Baixar o Html de um site e parsear as informações é um processo um pouco demorado e fazer isso toda vez que um usuário quiser ver as notícias é um problema por aumentar o tempo de carregamento da página e por nos obrigar a fazer uma chamada ao Google News a cada requisição, então nós vamos usar uma Gem que agenda eventos de tempos em tempos para “Baixar” as noticias de N em N minutos ao invés de fazer isso a cada requisição.

Caso queira acessar o projeto completo no GitHub clique aqui.

O que vamos aprender
  1. Como baixar informações de outros sites
  2. Como e porque agendar eventos dentro do Rails
Objetivos
  1. Criar um sistema que exiba as notícias que estão no banco de dados para o usuário.
  2. Baixar com sucesso as notícias da primeira página do Google News e inserir no banco de dados.
  3. Agendar o “download” dessas notícias de N em N minutos para economizar requisições e acelerar a resposta da página.
Ingredientes
  1. Ruby 2.3.1
  2. Rails 5
  3. Sqlite3
  4. rest-client (Gem)
  5. nokogiri (Gem)
  6. whenever (Gem)
Mãos à Obra
Parte 1:  Criar um sistema que exiba as notícias que estão no banco de dados para o usuário.

1- Para criar o projeto rode:

2- Coloque essas Gems no seu Gemfile

3- Instale as Gems:

4- Gere o model para guardar notícias, rodando:

5- Rode as migrations:

6- Gere um Controller com index:

7- Cole esse conteúdo no seu controller (NewsController) para que ele devolva as notícias:

8- Cole esse conteúdo na view do index (/app/views/news/index.html.erb) para mostrar as notícias:

9 – Para colocar o  método no root do projeto adicione ao routes:

10 – Vamos adicionar ao banco de dados um coluna de teste:

  • Primeiro rode no console:
  • Agora dentro do console, rode:
  • Para finalizar, saia do console rodando:

11- Vamos ver se funcionou até aqui, rode o projeto e vá até o browser em http://localhost:3000 para ver:

img-mershan-email-01

Parte 2:  Baixar com sucesso as notícias da primeira página do Google News e inserir no banco de dados.

Agora vamos baixar as noticias do site e inserir no banco de dados

12- Vamos criar um método no model news chamado refresh, no seu model, cole esse método:

13- Vamos chamar ele no nosso controller, substitua o conteúdo do seu NewsController por:

14- Agora rode o servidor e acesse http://localhost:3000 no seu browser para ver uma página com notícias como esta:

rest client nokogiri

15- Nossa página apareceu, maravilha \o/

16- Você pode ter notado que a requisição demora um pouco, ainda mais se a sua internet for lenta. Agora vamos criar um evento para baixar as noticias de 1 em 1 minuto ao invés de carregar todas as vezes que alguém chamar. Dessa forma vamos economizar muitas chamadas e acelerar a resposta.

Parte 3:  Agendar o “download” dessas notícias de N em N minutos para economizar requisições e acelerar a resposta da página.

17- Para gerar o arquivo de eventos, rode no console:

18- Agora no arquivo que foi gerado (/config/schedule.rb), cole o seguinte código:

19- No NewsController comente a seguinte linha:

20- Agora vamos limpar os dados já baixados, no console rode:

  • Primeiro, rode no console:
  • Depois  rode esse comando:

21- Agora rode o projeto:

22- Você deve ver no browser que agora obtivemos uma resposta vazia porque o nosso controller parou de chamar o método refresh

23- Para ativar o seu arquivo que baixa as notícias de 1 em 1 minuto (ou n em n você que escolhe 🙂 ), rode no console:

24- Pronto, agora rode o projeto de novo:

25- Agora quando o Whenever rodar seu método ele vai automaticamente preencher o seu banco de dados com as novas notícias e você vai conseguir ver na tela.  Perceba que a resposta agora é quase instantânea e as noticias estão lá.

\o/ Parabéns você conseguiu criar um método que baixa notícias de tempos em tempos para devolver para seus clientes.

Extra: Mais opções do Whenever
O whenever possui três tipos de comandos:
  • runner: Esse é o método que usamos e ele roda comandos do rails e pode acessar os Models e etc
    Exemplo:
  • command: Usando o command você pode realizar qualquer comando do seu console:
    Exemplo:
  • rake: Este comando roda tarefas do rake, exatamente como você faz quando roda as migrations e etc:
    Exemplo:
O whenever permite vários tipos de agendamento, alguns exemplos são:
  • Roda uma vez por dia as 4:30 da manhã um comando expecifico do Rails:
  • Roda no sábado a meia noite o comando do console:
  • Ele também permite usar a notação de agendamento do CronTab:
Conclusão

Usando o Whenever você consegue realizar processamentos de tempos em tempos e evita reprocessar dados a cada nova requisição. Com ele você consegue fazer coisas bem interessantes como executar comandos no linux, comandos do Rails e tarefas do Rake.

Sempre que você for criar um novo aplicativo você deve imaginar a melhor maneira de organizá-lo para que os dados fluam de maneira fácil, sempre evitando realizar tarefas repetitivas que não agreguem valor como no nosso caso requisições ao Google News a cada nova requisição ao App.

Se você ficou com alguma dúvida, comenta aí em baixo ou me adiciona no Facebook clicando aqui.

Gostou do Post? Ajude o Blog compartilhando esse e outros Posts que já saíram por aqui com seus amigos, isso faz uma grande diferença. 🙂

Muito Obrigado,
Sua atenção é uma honra para mim.

Leonardo Scorza[:]

outubro 29, 2016
Feito com s2 por OneBitCode
%d blogueiros gostam disto: