Blog do Urubatan
msgbartop
Desenvolvedor, Arquiteto, Palestrante, Coordenador do RSJUG, Patinador e Blogger
msgbarbottom

19 Aug 07 No ruby parece tudo fácil, até screen scrapping … (E não estou falando do rails agora)

Lembro de um Code Contest no blog do Diego Plentz a algum tempo, a idéia era mostrar a forma mais fácil em cada linguagem de fazer uma pesquisa no google e exibir o primeiro resultado encontrado …

Todas as linguagens utilizadas, entre elas na epoca o ruby também, utilizaram Expressões Regulares e outros recursos de ocultismo para mostrar como poderiam fazer isto.

Eu também postei um exemplo utilizando java na epoca, e tive que contornar uma coisa chata que o google estva bloqueando o user agent do Java …

O exemplo era mais ou menos este:

import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;
public class HTTPSample {

public static void main(String[] args) throws Exception {

URLConnection con = new URL("http://www.google.com/search?q=java").openConnection();

con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");

Scanner sc = new Scanner(con.getInputStream());

System.out.println(sc.findWithinHorizon("<a>.*?</a>", 0).replaceAll("<a>(.*?)</a>", "$2=$1").replaceAll("", ""));

}

}

Este exemplo poderia ser modificado fácilmente para buscar todos os resultados da primeira página, mas precisaria de mais trabalho braçal para poder buscar por exemplo, os resultados das duas primeiras páginas.

Para resolver este problema de pegar os resultados das X primeiras páginas ou qualquer coisa parecida, eu encontrei hoje uma biblioteca para Ruby de nome scRUBYt! muito fácil de utilizar, e o código fica extremamente legível …

Deem uma olhada neste exemplo:

require ‘rubygems’
require ’scrubyt’
google_data = Scrubyt::Extractor.define do
#Perform the action(s)
fetch ‘http://www.google.com/ncr’
fill_textfield ‘q’, ‘ruby’
submit

#Construct the wrapper
link "Ruby Programming Language" do
	url "href", :type => :attribute
end

next_page "Next", :limit => 2
end

puts google_data.to_xml

O que me chamou atenção foi que este é um dos exemplos de screen scrapping mais simples e legiveis que eu ja encontrei!

Claro que pode ser adaptado fácilmente para outros sites, com comandos simples como:

  1. fetch - para indicar o endereço
  2. fill_textfield - para informar o valor de um campo
  3. submit - para enviar um formulário
  4. next_page - para o link que informa a próxima página, e utilizando o texto do link como flag!

Bom, fica a dica, se precisarem implementar algum tipo de Screen Scrapping, esta biblioteca vale a pena pelo menos ser considerada :D

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Tags: ,

Reader's Comments

  1. |

    Não conheço Ruby, mas a solução em Java utiliza apenas recursos de APIs padrão e a solução em Ruby aparentemente utiliza uma API de terceiros. E o código da API, que realmente faz o trabalho, seria tão simples e legível? Partindo deste pressuposto, é possível construir uma API em Java que esconda o trabalho pesado e tenha uma interface igualmente simples e legível.

    Reply to this comment
  2. |

    Rodrigo, no Code Contest que mencionei no inicio do post, tem um exemplo em ruby sem nenhuma biblioteca adicional também …
    Concordo que seria possível criar uma bilbioteca parecida em java, mas até o momento, que eu saiba, não existe nenhuma :D

    Reply to this comment

Leave a Comment