Captura de páginas com Nokogiri

VN:RO [1.9.11_1134]
terça-feira, 29 d junho d 2010
Por Rafael Barbolo, Coop10. Siga no Twitter

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 --system


2. 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 nokogiri


3. 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!



VN:F [1.9.11_1134]
Rating: 4.5/5 (2 votes cast)
Captura de páginas com Nokogiri, 4.5 out of 5 based on 2 ratings
Related Posts with Thumbnails

Rafael Barbolo
Rafael Barbolo

Engenheiro de Computação e administrador do Bit a Bit. Empreendedor desde 2007. É sócio e cofundador do Kauplus, plataforma de e-commerce que oferece inovadoras experiências de compras online.

Tags: , , , , , , , , , , , ,

9 Comentários para “Captura de páginas com Nokogiri”

  1. Muito bom Barbolex!

    VA:F [1.9.11_1134]
    Rating: 0 (from 0 votes)
    #196
  2. Bruno Toshyaki Maeda

    Muito bom Barbolex! [2]

    VA:F [1.9.11_1134]
    Rating: 0 (from 0 votes)
    #197
  3. Marcio Nunes

    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

    VA:F [1.9.11_1134]
    Rating: 0 (from 0 votes)
    #198
  4. Everson

    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?

    VA:F [1.9.11_1134]
    Rating: 0 (from 0 votes)
    #428
  5. Voce poderia me ajudar ocorreu o seguinte erro:

    undefined method `inner_html’ for nil:NilClass (NoMethodError)

    Obrigado

    VA:F [1.9.11_1134]
    Rating: 0 (from 0 votes)
    #437
    • 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!

      VN:F [1.9.11_1134]
      Rating: 0 (from 0 votes)
      #438
  6. Washington Luiz Rocha

    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

    VA:F [1.9.11_1134]
    Rating: 0 (from 0 votes)
    #508

Deixe um Comentário

Spam Protection by WP-SpamFree

Get Adobe Flash playerPlugin by wpburn.com wordpress themes