Blog

LISTAR TODOS OS POSTS - Assine os feeds dos posts e comentários

Buscando preços com o Hpricot

Publicado/atualizado em 18/04/2007 04:33

Hpricot

Continuando na minha dúvida cruel sobre o próximo gadget que eu vou comprar, resolvi fazer programinha para me alertar sobre os preços do Tungsten TX, consultando direto no Buscapé (consultei até 2 páginas de resultados mas esse limite pode ser aumentado facilmente), assim poderia ficar de olho nos preços e ver quando aparece algum interessante. Tá bom, o Buscapé tem até um email para avisar sobre isso, mas sabe como é, a gente gosta de escovar bits, então ... ;-)

Para fazer o parsing do resultado do site, utilizei o Hpricot, do Why. Segundo ele, o Hpricot é:

A Fast, Enjoyable HTML Parser for Ruby

Hpricot is a very flexible HTML parser, based on Tanaka Akira's HTree and John Resig's JQuery, but with the scanner recoded in C (using Ragel for scanning.) I've borrowed what I believe to be the best ideas from these wares to make Hpricot heaps of fun to use.

Para isso eu criei esse programa, que roda no eu usa o Kdialog para me avisar quando tiver alguma coisa interessante. Olhem só:

#!/usr/local/bin/ruby
require 'rubygems'
require 'hpricot'
require 'open-uri'

precos      = []
limite      = 1000

# verifica duas páginas
1.upto(2) do |pagina|
   puts "Verificando a página #{pagina}"
   doc      = open("http://compare.buscape.com.br/prod_unico?idu=43847&pagina=
#{pagina}&kw=palm+tx") {|stream| Hpricot(stream)} doc.search("//a[@class='xl']").collect do |preco| precos << preco.inner_text.match(/[\d.]+/).to_s.sub('.','').to_i end end # será que encontramos alguma coisa? precos = precos.select {|valor| valor < limite} return if precos.size < 1 # se sim, me avise por favor! mensagem = precos.sort.uniq.collect {|preco| "R$ "+preco.to_s}.join(", ") `kdialog --title "Preços do TX" --msgbox "#{mensagem}"`

O resultado pelo menos agora é:

Resultado da busca com o Hpricot

Aqui vocês podem encontrar a documentação do Hpricot. Realmente é um parser leve, eficiente, e fácil de usar.

Atualizado: Apesar de estar claro ali, acho que eu esqueci uma explicação da coisa, mas não tem segredo:

  • O open do open-uri abre a URL e pega o seu fonte
  • O fonte é convertido em um objeto com Hpricot(stream)
  • search("//a[@class='xl']") procura todos os elementos a que tenham a class igual xl, o que no caso do site em questão, indica os links para os resultados da busca
  • inner_text retorna o texto do link, ou seja, o que está entre <a> e </a>

Permalink: http://eustaquiorangel.com/posts/401

salvar no del.icio.ussalvar no diggsalvar no rec6 Veja o que estão dizendo sobre isso.

Comente

Linhas em branco viram saltos de linha. Se você quiser mostrar algum código, por favor use o pastebin e informe a URL.

*

*

Responda: Qual é o meu sobrenome?  
Clique aqui se não souber essa resposta!

* campos obrigatórios

Comentários

1 - Cristiano Dias disse em 17/04/2007 15:38

Por que não o Mercadolivre?


2 - TaQ disse em 17/04/2007 17:14

Cris,

Dá também uai. É só colocar umas URLzinhas a mais ali. :-)

E os preços lá estão quase iguais aos das grandes lojas, com a vantagem que essas parcelam em bastante vezes sem juros.

Mas o X da coisa foi mostrar o Hpricot, ele é muito prático. :-)


3 - Walter Cruz disse em 17/04/2007 19:24

Bacana! Há uns dias atrás eu precisei fazer algo semelhante e usei o Beautiful Soup do Python (Existe o Rubyful Soup, mas o mais utilizado é o hipcrot mesmo).

No trabalho as vezes pedimos comida por telefone. Como o cardápio de onde pedimos muda diariamente, tou tentado a fazer qualquer coisa assim pra mandar o cardápio do dia pra galera, diariamente :)

Nada melhor que um programador bem motivado!


4 - Carlos Brando disse em 18/04/2007 04:03

Curioso este tal de Hpricot. Já precisei fazer algo parecido e não o conhecia. Obrigado pela dica de como usá-lo.


5 - Terramel disse em 18/04/2007 18:07

Hmm, interessante esse negócio! Assim que eu tiver um tempo vou ver se baixo e ponho com seu código pra fazer umas comparações de preço (e ai vou ver se adapto tirando o kdialog e fazendo aparecer no terminal mesmo ou em algum desklet tipo o torsmo ou adesklets pra ficar legal no meu fluxbox ;D)

Abraços


6 - Misso disse em 16/09/2007 05:26

A hpricot é legal, mas estou me batendo pra acessar o conteudo de um frame, pois no html da página aparece algo assim:

<frame name="left" src="Status.cgi" marginwidth="50%" marginheight="2"></frame>

Muito boa a sua dica, um abraço!


Anterior Próximo Últimos Índice