mechanize

ウェブサイトのスクレイピングを楽にするライブラリ。同じ名前のライブラリがPerlやRuby、Pythonにもあるらしい。

Ruby

参考サイト

Mechanize 公式サイト
http://mechanize.rubyforge.org/

Mechanize Github
https://github.com/sparklemotion/mechanize

RubyのMechanizeを解説 for 1.0.0 | きたももんががきたん。
http://d.hatena.ne.jp/kitamomonga/20081209/kaisetsu_for_ver_0_9_ruby_www_mechanize

Nokogiri
http://nokogiri.org/
Mechanizeが利用しているHTMLを解析するライブラリ

Nokogiriをインストールするにはgem以外のパッケージも必要

自分の環境では gem install する前に apt-get でいくつかのパッケージをインストールすることが必要だった。

sudo apt-get install libxslt-dev libxml2-dev libruby1.9.1
sudo gem install nokogiri

# nokogiriの最新バージョン 1.6.0 では Ruby 1.9.2 以上が必要
# Ruby 1.9.1 の場合は nokogiri のバージョンの指定が必要
sudo gem install -v 1.5.9 nokogiri

詳しくは以下の公式ドキュメントを参照。
http://nokogiri.org/tutorials/installing_nokogiri.html

(Ubuntu 12.04 で確認。2013/06/17)

コードの例

require 'mechanize'

agent = Mechanize.new
agent.user_agent = 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31' # User-Agentを設定
p agent.get('http://www.yahoo.co.jp/')
p agent.page.uri.to_s # 現在のURLwを取得
p agent.page.title # titleを取得
p agent.page.body # HTMLを取得
p agent.page.search('div#topicsfb li') # CSSセレクタでマッチする要素の配列を取得
p agent.page.at('div#topicsfb li') # CSSセレクタでマッチする最初の要素を取得
link = agent.page.link_with(:text => 'ヘルプ'.toutf8) # リンクを探す
link.click if link != nil リンクをクリック

フォームに関するコードの例

form = agent.page.forms[0] # フォームを取得
# または
form = agent.page.form_with(:id => 'login_form') # フォームをidで取得
form = agent.page.form_with(:action => '/service') # フォームをactionで取得

form['login'] = email # input要素に値を設定
form['password'] = pw # input要素に値を設定
form.click_button # submitを実行

BASIC認証のあるページにアクセスするには

リクエストする前にid, pwをauthメソッドに渡す。

例:

agent.auth('user_hoge', 'passwd')

user_agent_alias で使えるエイリアス

サーバへのリクエスト時に送信される User-Agent をmechanizeデフォルトのものから以下のようなコードで変更できる。

agent.user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'

長い User-Agent を指定するのが面倒なのでエイリアスでも指定できる。以下のようにすると、上記と同じ効果が得られる。

agent.user_agent_alias = 'Windows IE 9'

エイリアスのリストは以下で定義されている。

https://github.com/sparklemotion/mechanize/blob/c2cbbd78242ea3cc5a5b4df28c539b045792c75f/lib/mechanize.rb#L117

mechanize 2.7.1 では以下のとおり。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク