« [Zaurus]Lua 5.1.2のZaurus向けパッケージ | Main | [Zaurus]Linux Zaurus上のEmacsで選択した単語を「英辞郎 on the Web」で引く »

2007.10.03

[Zaurus]Ruby用ライブラリHpricotとWWW::MechanizeのLinux Zaurus向けパッケージ

電車での移動時間を使ってLinux ZaurusでWebのスクレイピングの仕込みをするべく、RubyのHTMLパーサ等を用意してみました。

はけさんのはけのザウルス備忘録別館Hpricotの0.5がありますが、0.6が出ていたのでそれを。
WWW::Mechanizeにも興味があったので、それも。

幾霜の橘さんから「-static-libgcc」というオプションを教わったので、ruby-serialportとruby-termiosをlibgcc(3.4.4)不要版としてパッケージを作り直しました。

いずれのパッケージも、FocVさん版パッケージのRubyの構成に準拠してます。FocVさんのところにある1.8.6-p110を入れた環境で幾霜さんのzgcc34でセルフコンパイルしてます(Pure RubyなWWW::Mechanizeを除く)。

ダウンロード

Hpricot 0.6
「ruby-hpricot_0.6-1_armv5tel.ipk.bin」をダウンロード

WWW::Mechanize 0.6.10
「ruby-mechanize_0.6.10-1_armv5tel.ipk.bin」をダウンロード

ruby-serialport 0.6
「ruby-serialport_0.6-2_arm.ipk.bin」をダウンロード

ruby-termios 0.9.4
「ruby-termios_0.9.4-2_arm.ipk.bin」をダウンロード

ライブラリの紹介等

Hpricotは、HTMLを解析してオブジェクトを生成します。HTMLから特定の部分を切り出したい場合等に便利。正規表現を使わず思ったものを切り出せます。

WWW::Mechanizeは、あたかもブラウザを操作するかのようにRubyからWebアクセスできます。普通はRubyからWebをいろいろいじろうとすると、HTMLの中身を仔細に調査する必要がありますが、WWW::Mechanizeを使うと、かなり見た感じでいけます。Cookieやヒストリなんかも管理してくれます。

正規表現でバリバリやるより、スクリプトのメンテナンス性が向上します。

Linux Zaurusで動かすと、ちょっと重いですが。

何の役に立つのか? サンプル

WWW::MechanizeとHpricotでmixiのあしあとを取得する例です(リニューアル後のさっき試しました)。
World Wide Walkerさんの「mecanize.rb で mixi diary を自動取得する」のパクりともいう。

mixiのような認証があるサイトの場合、普通はログインフォームからCookieをもらって、それをヘッダにセットしてログインしないと読めないページを読む、といった処理をしますが、WWW::Mechanizeがその辺りのCookie管理をやってくれているので楽ができてます。

取得したあしあとページから必要な部分を切り出すのをHpricotでやってます。
ほぼ正規表現無しでスクレイピングができちゃってます。便利。

あしあとの取得ならAPIを使うべきですが、とりあえずサンプルということで。

アクセスログマニアの方は、こういうのをCronInetで定期起動させて、Linux Zaurusでいろいろなログを監視してみては。

#! /usr/bin/env ruby

require 'hpricot'
require 'mechanize'
require 'logger'
username = 'YOUR_EMAIL_ADDRESS'
password = 'YOUR_PASSWORD'

agent = WWW::Mechanize.new {|a| a.log = Logger.new('access.log')}
page = agent.get('http://mixi.jp/')
form = page.forms[0]

form.fields.find {|f| f.name == 'email'}.value = username
form.fields.find {|f| f.name == 'password'}.value = password
form.fields.find {|f| f.name == 'next_url'}.value = '/home.pl'
page = agent.submit(form, form.buttons.first)

if /url=([^"])"/ =~ page.body
link = 'http://mixi.jp' + $1.to_s
agent.get(link)
end

doc = Hpricot(agent.get('http://mixi.jp/show_log.pl').body)
doc.search("#log_color").search("li").each do |li|
puts li.inner_text
end

徒然に

なぜか、かの伊藤栄一郎氏のサイトhttp://oohito.com/からリンクされていてビビった!

|

« [Zaurus]Lua 5.1.2のZaurus向けパッケージ | Main | [Zaurus]Linux Zaurus上のEmacsで選択した単語を「英辞郎 on the Web」で引く »