Un peu de webscrapping ?

Le webscraping est défini sur la page française de Wikipedia comme suit :

Le Web scraping (parfois appelé Harvesting) décrit généralement en informatique un moyen d’extraire du contenu d’un site internet, via un script ou un programme, dans le but de le transformer ou de changer son format pour permettre son utilisation dans un autre contexte.

J’en faisais régulièrement avant en mIRC scripting, rencontrant souvent des problèmes plutôt http que parsing : suivi des sessions, chunks, etc… Et puis j’étais à un séminaire ces derniers jours, et des collègues m’ont remotivé pour en faire, alors je commence quelques essais en Ruby.

Let’s go !

Installons scRUBYt!, un package qui vient par dessus Hpricot notamment (parser HTML). Les instructions officielles n’étant pas très concluantes, je me suis rabattu sur ce post qui a résolu tous mes soucis :-) Il faudra d’ailleurs que j’examine un de ces jours les avantages de Scrubyt par rapport à Hpricot seul, vues les difficultés d’installation, raisonnables mais un peu aggaçantes (et qui ne feront que s’ajouter aux futures difficultés lors d’installations sur d’autres distribs ou au boulot).

# gem install —version 1.7.1 ParseTree
# gem install —version 3.6.3 RubyInline
# gem install —version 1.1.6 ruby2ruby
# gem install ParseTreeReloaded
# gem install RubyInlineAccelleration
# gem install scrubyt

Parfois il faut relancer le gem install une ou deux fois, mais ça finit par passer normalement.

Ensuite, premier essai (tiré d’ici) :

require 'rubygems'
require 'scrubyt'

google_data = Scrubyt::Extractor.define do
 fetch 'http://www.google.com/ncr'
 fill_textfield 'q', 'ruby'
 submit

 link "Ruby Programming Language/@href" 
 next_page "Next", :limit => 2
end

puts google_data.to_xml
# ruby test_scrubyt.rb 
/usr/local/lib/site_ruby/1.8/rubygems.rb:139:in `activate': can't activate RubyInline (= 3.6.3), already activated RubyInline-3.7.0] (Gem::Exception)
  from /usr/local/lib/site_ruby/1.8/rubygems.rb:155:in `activate'
  from /usr/local/lib/site_ruby/1.8/rubygems.rb:154:in `each'
  from /usr/local/lib/site_ruby/1.8/rubygems.rb:154:in `activate'
  from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
  from test_scrubyt.rb:2

Oopsie !
J’ai donc désinstallé la version 3.7.0 via le choix 2 dans la commande :

# gem uninstall RubyInline

Et là hop !

# ruby test_scrubyt.rb 
/usr/lib/ruby/gems/1.8/gems/scrubyt-0.3.4/lib/scrubyt/core/scraping/filters/text_filter.rb:25: warning: don't put space before argument parentheses
http://www.google.com/search?hl=en&ie=ISO-8859-1&q=ruby
http://www.google.com/search?hl=en&ie=UTF-8&q=ruby&start=10&sa=N
<root>
<link>http://www.ruby-lang.org/</link>
<link>http://www.ruby-lang.org/en/20020101.html</link>
<link>http://en.wikipedia.org/wiki/Ruby_programming_language</link>
<link>http://en.wikipedia.org/wiki/Ruby</link>
<link>http://www.rubyonrails.org/</link>
<link>http://www.rubys.com/</link>
<link>http://www.rubycentral.org/</link>
<link>http://www.w3.org/TR/ruby/</link>
<link>http://www.zenspider.com/Languages/Ruby/QuickRef.html</link>
</root>

Excellent début !

Après un petit patch de /usr/lib/ruby/gems/1.8/gems/scrubyt-0.3.4/lib/scrubyt/core/scraping/filters/text_filter.rb:25 (tu parles d’un patch, j’ai juste supprimé un espace… :D), je compte bien mener d’autres essais, notamment ce dont j’ai parlé dans le résumé :-) Je mettrai les résultats ici !