Buscando preços com o Hpricot
Publicado em Developer
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 é:
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>
Comentários
Comentários fechados.
Artigos anteriores
- Pull requests em modo raiz - sex, 22 de dezembro de 2023, 09:57:09 -0300
- Qual a idade do seu repositório? - ter, 27 de dezembro de 2022, 12:50:35 -0300
- Utilizando ctags em projetos Rails mais recentes - qui, 24 de junho de 2021, 08:23:43 -0300
- Fazendo o seu projeto brotar - seg, 15 de julho de 2019, 08:57:05 -0300
- Learn Functional Programming with Elixir - sex, 02 de março de 2018, 18:47:13 -0300
- Ambiente mínimo - Driver Driven Development - qua, 23 de agosto de 2017, 15:15:03 -0300
- Ambiente mínimo - repositórios de código - dom, 16 de abril de 2017, 13:02:14 -0300
- Ambiente mínimo - terminal e navegador - dom, 02 de abril de 2017, 21:43:29 -0300
- Utilizando muitas gems no seu projeto? - sáb, 29 de outubro de 2016, 11:57:55 -0200
- Desenvolvedores e inteligência artificial - seg, 11 de julho de 2016, 09:09:38 -0300
A hpricot é legal, mas estou me batendo pra acessar o conteudo de um frame, pois no html da página aparece algo assim:
Muito boa a sua dica, um abraço!
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
Curioso este tal de Hpricot. Já precisei fazer algo parecido e não o conhecia. Obrigado pela dica de como usá-lo.
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!
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. :-)
Por que não o Mercadolivre?