Extraindo dados com Ruby e Hpricot

Hoje em dia as informações que podem alimentar um sistema ou website, são de vários formatos e fontes diferentes, exemplo: Sistema de Suporte a Decisão e aplicações Mashup e para demonstrar como isso é simples de se fazer usando Ruby, escrevi o exemplo abaixo baseado no artigo “Scraping IMDB with Ruby and Hpricot“.

Neste exemplo, serão extraidas informações sobre Ações do site Google Finance. O exemplo tenta mostrar algumas das maneiras utilizadas para se buscar as informações nas tags das páginas.

O pré-requisito para que a classe funcione é a biblioteca Hpricote, que é um parse HTML baseado na biblioteca HTree e JQuery, porém recodificado em C. A instalação pode ser feita pelo comando:

gem install hpricot

Vamos criar a classe Finance, que ao ser instanciada recebe o endereço da Ação que desejamos extrair as informações:

class Finance
   require 'rubygems'
   require 'hpricot'
   require 'open-uri'
 
   #inicializa as variáveis ao instanciar
   #a classe Finances
   def initialize(url)
      @hp = Hpricot(open(url))
   end
end

Para obter o símbolo da Ação consultada, vamos por exemplo extrair do link conforme a tela abaixo:

Google Finance - Símbolo

Para isso vamos criar o método symbol:

def symbol
   #procura pelas tags <strong><a href="http://www.lednerd.com/">...</a></strong>,
   #extrai o conteúdo e remove os caracteres \n
   @symbol = (@hp/"b/a").inner_text.gsub(/\n/,'')
end

Para obtermos o título da Ação, vamos extrair do cabeçalho H1 conforme tela abaixo:

Google Finance - Título

Para isso vamos criar o método title:

def title
   #procura pelo tag <h1>...</h1>
   #e extrai o conteúdo
   @title = (@hp/"h1").inner_text
end

Para obtermos o índice da Ação, vamos extrair do SPAN conforme tela abaixo:

Google Finance - Índice

Para isso vamos criar o método index:

def index
   #procura pela tag <span class="pr">...</span>
   #e extrai o conteúdo
   @index = @hp.at("span[@class='pr']").inner_text
end

Para extrairmos o valor da variação da Ação, vamos extrair do SPAN conforme tela abaixo:

Google Finance - Variação

Para isso vamos criar o método change:

def change
   #procura pelas tags <strong><span class="chg">...</span></strong>
   #e extrai o conteúdo
   @change = (@hp/"b/span.chg").inner_text
end

Para extrairmos o percentual de variação da Ação, vamos extrair do SPAN conforme tela abaixo:

Google Finance - Percentual de Variação

Para isso vamos criar o método percente_change:

def percente_change
   #extrai o html do <p id="market_data_div">...</p>
   market_data = @hp.search('#market_data_div')
   #procura pelas tags <span class="chg">...</span>
 
   #e extrai o conteúdo e remove os parênteses
   @percente_change = (market_data/"td/span.chg").inner_text.gsub(/[()]/,'')
end

O resultado final será como a classe abaixo:

class Finance
  require 'rubygems'
  require 'hpricot'
  require 'open-uri'
 
  #inicializa as variáveis ao instanciar
  #a classe Finances
  def initialize(url)
    @hp = Hpricot(open(url))
  end
 
  def symbol
    #procura pelas tags <b><a href=..>...</a></b>,
    #extrai o conteúdo e remove os caracteres \n
    @symbol = (@hp/"b/a").inner_text.gsub(/\n/,'')
  end
 
  def title
    #procura pelo tag <h1>...</h1>
    #e extrai o conteúdo
    @title = (@hp/"h1").inner_text
  end
 
  def index
    #procura pela tag <span class='pr'>...</span>
    #e extrai o conteúdo
    @index = @hp.at("span[@class='pr']").inner_text
  end
 
  def change
    #procura pelas tags <b><span class='chg'>...</span></b>
    #e extrai o conteúdo
    @change = (@hp/"b/span.chg").inner_text
  end
 
  def percente_change
    #extrai o html do <div id="market_data_div">...</div>
    market_data = @hp.search('#market_data_div')
    #procura pelas tags <td><span class='chg'>...</span></td>
    #e extrai o conteúdo e remove os parênteses
    @percente_change = (market_data/"td/span.chg").inner_text.gsub(/[()]/,'')
  end
end

Para testar a classe podemos criar o script abaixo e executá-lo:

require 'finance'
 
f = Finance.new("http://finance.google.com/finance?q=RIO")
 
p f.symbol
p f.title
p f.index
p f.change
p f.percente_change

Resultado:

Finance - Resultado

O exemplo é simples, mas demonstra como poderiamos extrair informações de qualquer página e utilizá-las em nossas aplicações Web (com Ruby on Rails ;))

Outra poderosa biblioteca que faz uso do Hpricot é o scRUBYt!, mas falarei dela em uma outra oportunidade.

Este post está participando do concurso promovido pelo site Simples Idéias.



Últimos tweets

    Artigos similares

    10 Comentários para “Extraindo dados com Ruby e Hpricot”

    • Olá, gostaria de saber se o browser que você usou para mostrar estas figuras do google finance é o firefox. Se for, qual o nome da extensão para ver o HTML no rodape do firefox, que nem você fez, como da para ver nas figuras do google finance. Obrigadão!
    • Olá Hugo,

      Sim, usei o Firefox. O plugin é o Firebug. Para saber um pouco mais, veja o post Conheça o poder do Firebug.

      Abraço

    • Olá. Estou começando em Ruby e estou com um erro na classe Finance:
    • o erro é:
      in `index’: undefined method `inner_text’ for nil:NilClass [NoMethodError]

      Agradeço se puder ajduar e parabéns pelo blog.
      Abraço.

    • Opa, realmente muito bacana, existem muitos “tutoriais” por ai ensinando esse tipo de coisa, mas realmente é difícil encontrar um tão detalhado e simples como esse, é desse tipo de explicação que eu gosto, assim o conteúdo realmente entra na nossa mente!

      Valeu cara , muito bom!

    • Obrigado Rafael, abs

    Deixe uma resposta