Screen Scraping, Web Scraper, Screen Scraper, Data Scraping, Website Scraping é a arte de extrair informações de páginas web, de forma automágica. As possibilidades são infinitas: comparar preços, monitorar websites, importar um website, pesquisar na web, integrar dados, enfim, vai da necessidade e da criatividade.

Como você faz uma pesquisa no Google? Pressiona ctrl+k no firefox, digita o que quer e pronto? Certo. Digamos que você precise filtrar de resultados relevantes a Confeitaria apenas no Brasil, então, o Google possui a opção de pesquisa avançada, que nos permite esta pesquisa mais seletiva. Os passos para realizar esta busca seriam:

  1. Acessar o www.google.com.br
  2. Ao lado do campo de busca temos o link Pesquisa avançada
  3. No campo com todas as palavras faremos a nossa busca por confeitaria
  4. No campo Pesquisar páginas localizadas em: selecionamos o Brasil como país
  5. No campo de resultados, selecionamos para exibir 100 resultados por vez

É simples, certo? E para fazer isto de uma forma automágica? Já falei para vocês que Ruby é uma linguagem fantástica, Windows, Linux e MacOS, etc. Então, para realizar este trabalho, precisamos:

  • é impossível fazer isto sem o Firebug, extensão do Firefox. Na realidade, é possível, mas daria mais trabalho…
  • Ruby devidamente instalada, com as gems Mechanize e Nokogiri

No seu editor de texto preferido, iniciamos o script:

#!/usr/bin/env ruby
 
require "rubygems"
require "nokogiri"
require "mechanize"

Definimos a nossa busca, que estará na variável query:

query = "confeitaria"

Instanciamos o Mechanize, configurando seu UserAgent – para ficar com menos jeito de bot, né? – e também o nosso parser de html:

agent = WWW::Mechanize.new do |agent|
  agent.user_agent_alias = 'Mac Mozilla'
  agent.html_parser = Nokogiri::HTML
end

Acessamos o Google:

page = agent.get "http://www.google.com.br/"

Agora vamos para a página de Pesquisa avançada:

adv_search_page = agent.click page.link_with :href => "/advanced_search?hl=pt-BR"

Preenchemos e enviamos o formulário:

search_page = adv_search_page.form_with :name => 'f' do |form|
  form.as_q = query
  form.field_with(:name => 'num').options.last.select
  form.field_with(:name => 'cr').options[31].select
end.submit

É aqui que o Firebug ajuda muito e economiza tempo na hora de encotrar o nome do formulário e campos que devemos preencher, que opção devemos selecionar e por aí vai.

Em search_page já temos o resultado da pesquisa. Então vamos pegar os resultados (links), que é a parte que nos interessa:

until search_page.search('table#nav td').last.content == "" do
  next_page = search_page.search('table#nav td a').last.attributes['href'].to_s
 
  search_page.search('a.l').each do |link|
    print link.attribute('href').to_s + "\n"
  end
 
  sleep 10
 
  search_page = agent.click(search_page.link_with(:href => next_page))
end

Explicando: quando você faz uma pesquisa no Google, no fim da página temos o Gooooooooooooooooooooooogle e uma seta com um link (Mais) para o próximo resultado. A diferença entre a primeira, a segunda, a enésima página e a última, é que na última não temos este link (Mais). Ou seja, vamos pesquisando até que a última coluna da tabela com id nav não tenha nada. E enquanto isto não ocorre, a próxima página é o link que temos na última coluna da tabela com id nav. E o que queremos, que são os links da pesquisa, estão nos links com classe l. Jogamos os links na tela, dormimos por 10 segundos e vamos para a próxima página.

A máxima sobre a necessidade vale por aqui. Sua criatividade é o limite e as iterações são feitas de uma forma bem simples. Qualquer dúvida, entre em contato. Até :)

Posts relacionados:

  1. Traduções e mais traduções…

No comments yet

Deixe Seu Comentário