Captura de páginas com Nokogiri
Neste artigo, vou explicar de forma prática como utilizar a biblioteca Nokogiri com a linguagem de programação Ruby para extrair informações de páginas na Internet.
O exemplo que vai guiar este artigo é a criação de um aplicativo que extrai o preço de um produto qualquer do site da Fast Shop. Ele será usado para encontrarmos o preço do MacBook White.
1. Instalando Ruby + RubyGems
Se você usa Windows, baixe e instale a última versão estável do interpretador Ruby clicando aqui.
Se você usa Mac OS X, Solaris ou uma distro linux popular, seu sistema já vem com Ruby instalado.
RubyGems é um gerenciador de pacotes (programas e bibliotecas) para Ruby. Para instalá-lo, baixe a última versão do aplicativo clicando aqui e execute o comando abaixo no diretório com o arquivo descompactado:
ruby setup.rb
gem update --system2. Instalando Nokogiri
Mac OS X
sudo port install libxml2 libxslt sudo gem install nokogiri
Ubuntu/Debian
# pacotes de desenvolvimento ruby sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 sudo apt-get install libreadline-ruby1.8 libruby1.8 libopenssl-ruby # requisitos do nokogiri sudo apt-get install libxslt-dev libxml2-dev sudo gem install nokogiri # requisitos do nokogiri para Hardy (8.04) ou uma versão mais atual sudo apt-get install libxslt1-dev libxml2-dev
Windows
gem install nokogiri3. Baixando a página do produto
O trecho de código que baixa a página do MacBook se encontra abaixo:
1 2 3 4 5 6 7 8 | # url do produto url = 'http://www.fastshop.com.br/MACBOOK-WHITE-COM-INTEL-CORE-2-DUO--2GB--HD-250GB--TELA-133--PLACA-GRAFICA-NVIDIA-GEFORCE-320M-COM-256MB--SISTEMA-OPERACIONAL-MAC-OS-X-LEOPARD---APPLE---MC516BZA,product,AEMC516BZA,3.aspx' # html da página html = Net::HTTP.get URI.parse(url) # html analisado pelo nokogiri doc = Nokogiri::HTML(html) |
4. Extraindo o preço do produto
Para extrair o preço do produto a partir do HTML baixado, vamos utilizar o plugin Firebug para analisar a estrutura do HTML. Ele permitirá que encontremos o XPath (XML Path Language) do elemento que contém o preço do produto.
Na captura de tela abaixo, podemos ver como isso é feito:
Verificamos que a seguinte estrutura de nós de HTML guarda o preço do produto:
<div id="boxInfosPagamento"> <p class="preco"> <span>PRECO DO PRODUTO</span> </p> </div>
Podemos traduzir essa estrutura para o seguinte XPath:
"//div[@id='boxInfosPagamento']/p[@class='preco']/span"5. Aplicativo final
O aplicativo final que imprime o preço do produto pode ser visto abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # importando bibliotecas necessárias: require "rubygems" require "nokogiri" require "net/http" # url do produto url = 'http://www.fastshop.com.br/MACBOOK-WHITE-COM-INTEL-CORE-2-DUO--2GB--HD-250GB--TELA-133--PLACA-GRAFICA-NVIDIA-GEFORCE-320M-COM-256MB--SISTEMA-OPERACIONAL-MAC-OS-X-LEOPARD---APPLE---MC516BZA,product,AEMC516BZA,3.aspx' # html da página html = Net::HTTP.get URI.parse(url) # html analisado pelo nokogiri doc = Nokogiri::HTML(html) doc.encoding = 'utf-8' # preço do produto puts doc.xpath("//div[@id='boxInfosPagamento']/p[@class='preco']/span")[0].inner_html |
A captura de tela abaixo mostra a execução do aplicativo:
6. Conclusões
Nokogiri é uma biblioteca muito robusta que suporta seleção de elementos com XPath ou seletor CSS3 de forma simples e eficiente. Sempre que precisar analisar XML ou HTML, considere usá-la em seu projeto.
Em artigos futuros vou falar mais sobre extração e análise de informações da Internet. Se tiver alguma dúvida ou sugestão de tema, deixe seu comentário!





Muito bom Barbolex!
Muito bom Barbolex! [2]
Valeu Rafael que atendendo meu pedido e, acredito, de muitos outros curiosos no assunto, escreveu um rapido e interessante artigo.
Agora é arregaçar as mangas e botar a imaginação pra funcionar.
Obrigado
Caro Rafael,
Estava pesquisando sobre automatização de buscas e análise de conteúdo quando me deparei com vosso artigo.
Não tenho experiência com programação em Ruby e por isso sofri algumas dificuldades que o google generosamente desfez, contudo, ainda tenho um problema.
Na execução no NetBeans tive o seguinte retorno:
/Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require’: no such file to load — nokogiri (LoadError)
from /Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require’
from /Users/eversonprobst/NetBeansProjects/RubyApplication1/lib/main.rb:3
Posso ter cometido inúmero erros até aqui, pois como mal conheço a linguagem, apenas segui os procedimentos de instalação das libs etc, e em seguinda cole seu código e executei.
Pode me dar uma ajuda?
Everson,
Parece que houve um erro com a instalação da gem nokogiri. Você a instalou?
Se quiser verificar como instalar essa gem no windows com mais detalhes, olhe este link: http://nokogiri.org/tutorials/installing_nokogiri.html.
Boa sorte!
Voce poderia me ajudar ocorreu o seguinte erro:
undefined method `inner_html’ for nil:NilClass (NoMethodError)
Obrigado
Leandro,
A tradução do erro é “método ‘inner_html’ não definido para objeto nulo”.
Acredito que o que ocorreu é que você executou a seleção de um nó do HTML que falhou, por isso esse nó é um nulo e você não conseguiu executar o método inner_html para ele.
Se ainda não conseguiu resolver seu problema e quiser postar mais detalhes do seu código, posso te ajudar mais.
Abraços e boa sorte!
ola Rafael, estava procurando solução a uma questão e deparei com tuas sugestões, porem sou leigo em programação, eu gostaria de uma forma de copiar do site da internet http://www.mte.gov.br/sistemas/caepi/PesquisarCAInternetXSL.asp ( so funciona no explorer)
neste local voce indica um numero de c.a. exemplo 12222, e o sistema apresenta logo abaixo uma barra com a uma pesquisa do c.a. estes numeros são simples e vão de 00000 a 99999 depois é só clicar sobre a barra que aparece o c.a. nesta folha clicando com o botao direito e selecionando visualizar impressão reduzindo para 85% se forma o documento inteiro daí copiamos numa impressara pdf (ex doro pdf) denominando o documento como 12222/2012 (2012 é o ano de tirado da data de validade no documento), a ideia é uma rotina que gere os numeros de 00000 a 99999 colete os c.a. e armazene nomeados em pdf, e para os documentos inexistentes que gera arquivo de tamanho menor seja apagado, se esta rotina fosse rodadda em cada período teriamos um arquivo dos C;A. emitido que serviria como fonte de pesquisa didática já que o mte após certo tempo retira do ar a informação de c.a. ja vencidos a um certo tempo. e e posteriormente analisar os documentos apagando aqueles que apresentam volume pequeno pois são resultado de c.a. inexistente e gravando cada documento como o numero de c.a.
será que o que voce estava sugerindo é capaz de fazer esta operação, tu conhece algum soft que faz esta função? operando em windows7?
obrigado
Washington
Veja a infosimples, é o que você procura: http://www.infosimples.com.br/
Boa sorte!