追記2014-10-13: ここに最新版をおいた: http://voidptrjp.blogspot.jp/2014/10/mechanize-guide.html
http://mechanize.rubyforge.org/mechanize/ にある GUIDE.txt を訳してみた。
チュートリアルとしてよくできていると思う(原文的な意味で)。
- ルー語っぽい箇所などを、若干修正[2008/3/31]
- 訳微修正。SyntaxHighlighterでコード部分を整理[2010/8/5]
GUIDE.txt
Path: GUIDE.txt Last Update: Tue Dec 04 19:36:28 -0800 2007
WWW::Mechanizeをはじめよう
このガイドは、Mechanize を使い始めるためのものです。このガイドを読み終わるまでに、ページをフェッチしたり、リンクをクリックしたり、フォームをうめてサブミットしたり、Webページ内から必要なデータを取り出したり、、と、お望みのいろいろな便利なことができるようになるとよいです。このガイドは、Mechanize を使ってできることの、表面的なほんとにちょっとしたスクラッチです。だけども、はじめるには十分な情報となるとよいです!
ページをフェッチしよう!
最初のことを最初に。mechanize を require して、新しい mechanizeオブジェクトを生成しましょう:
require 'rubygems' require 'mechanize' agent = WWW::Mechanize.new
さて、ページをフェッチするためのエージェントが使えます。グーグルをエージェントでフェッチしてみよう:
page = agent.get('http://google.com/')
なにがおこった? 我々は mechanize に対して、グーグルのメインページを取ってくるようにたのみました。Mechanize は、任意のセットされたクッキーを格納し、そしてグーグルが送ってきた任意のリダイレクトをたどりました。エージェントは、ページを我々に返しました。このページからデータを取り出したり、クリックするためのリンクを探したり、うめるためのフォームを見つけることができます。
つぎに、クリックするためのいくつかのリンクを探してみましょう。
リンクを見つける
Mechanize は、ページをGETしたり、POSTしたり、またはフォームをSUBMITしたとき、ページ・オブジェクトをひとつ返します。ページがフェッチされたら、エージェントはページをパースして、リンクの一覧表をページ・オブジェクト内に作ります。
それでは、グーグルのホームページをフェッチしたので、すべてのリンクを表示してみよう:
page.links.each do |link| puts link.text end
リンクの一覧を表示できます。だけど、Mechanize はクリックするリンクを見つけるのに役立つ、いくつかショート・カットを用意してます。たとえば、テキストが ‘News’ であるようなリンクをクリックしたい、としましょう。ふつうは、このようにしなければなりません:
page = agent.click page.links.find { |l| l.text == 'News' }
でもMechanize には、ショートカットがあります。上記の代わりに、このようにできるのです:
page = agent.click page.links.text('News')
このショートカットは、「名前が ‘News’ であるような全てのリンクを探せ」という意味です。もしかしたら読者は「そのテキストのリンクは、複数ありうるのに!」と考えているかもしれません。そしてそれは正しい!もしクリック・メソッドに、リンクの一覧を渡した場合、Mechanize は最初のひとつをクリックします。もし二つ目のリンクをクリックしたいのなら、このようにやりましょう:
agent.click page.links.text('News')[1]
適切なリンクを以下のように探すこともできます:
page.links.href('/something')
もしくはそれらを一緒につなげて、適切なテキストと適切なhrefのリンクを探すこともできます:
page.links.text('News').href('/something')
これらのショートカットは、frame, iframe, formのようなものをフェッチしたときの任意のリストに対して、使えます。さて我々はリンクのクリックの仕方を知りました。つぎに、フォームをうめるようなもっと複雑なことをやってみましょう。
フォームをうめる
グーグルの例の続きをやりましょう。以下がコードです:
require 'rubygems' require 'mechanize' agent = WWW::Mechanize.new page = agent.get('http://google.com/')
もしページが表示できれば、ひとつのfという名前のフォームがあり、2組のボタンと2,3のフィールドがあります:
pp page
いまフォームの名前がわかりましたので、ページをフェッチしてみましょう:
google_form = page.form('f')
Mechanize で、フォーム・インプット・フィールドにアクセスする方法はいくつかありますが、一番便利な方法は、オブジェクトのアクセッサを利用する方法です。では、フォーム上の ‘q’ という名前のフォーム・フィールドに、‘ruby mechanize’と入力して見ましょう:
google_form.q = 'ruby mechanize'
値をセットして、フォームを表示し、以下のような行が見えることを確認してください:
#<WWW::Mechanize::Field:0x1403488 @name="q", @value="ruby mechanize">
名前 ‘q’ に対応する値が変わっていた場合は、成功です!つぎにフォームをサブミットしてボタンを押し、結果を見てみましょう:
page = agent.submit(google_form, google_form.buttons.first) pp page
今やったことは、検索フィールドに文字をいれて「検索」ボタンを押したのと同じことです。ボタンなしでフォームをサブミットした場合、テキスト・フィールドに入力してリターン・キーを打ったのと同じです。
コードを全部見てみましょう:
require 'rubygems' require 'mechanize' agent = WWW::Mechanize.new page = agent.get('http://google.com/') google_form = page.form('f') google_form.q = 'ruby mechanize' page = agent.submit(google_form) pp page
ここまでで、スクリーン・スクレーピングをやってみました。フォームについて、もう少し深く見てみましょう。スキップしたくなる前に!
フォーム・テクニック応用編
このセクションでは、フォームで可能な入力フォームで違ったタイプの使用法について、触れたいと思う。パスワードやテキストエリア・フィールドは、テキスト・フィールドと同じように扱われ得る。セレクト・フィールドは、テキスト・フィールドにとても似ているが、関連するオプションがたくさんある。ひとつのオプションを選んだとき、mechanize はそれ以外のオプションを非選択にする (マルチセレクトでなければ!)
たとえばリスト上のひとつのオプションを選択しよう:
form.fields.name('list').options[0].select
今、チェック・ボックスとラジオ・ボタンを見てみよう。チェックボックスを選択するには、ただこのようにすればいい:
form.checkboxes.name('box').check
ラジオ・ボタンは、チェック・ボックスによく似ているが、同じ名前のその他のラジオ・ボタンをアンチェックする方法を知っている。チェック・ボタンと同じように、ラジオ・ボタンをチェックしてみよう:
form.radiobuttons.name('box')[1].check
Mechanize はまた、ファイルのアップロードも簡単にできる!ファイル・アップロード・フィールドを探し、ファイル名を教えてやるのだ:
form.file_uploads.file_name = "somefile.jpg"
データをいじる
Mechanize は、HTMLをパースするために hpricot を使っている。これはなにを意味するか? mechanize で得たページを、hpricotオブジェクトのように扱えるということだ。 Mechanize をデータを取り出したいページのナビゲートに使った後、hpricotのメソッドで取り出せる:
agent.get('http://someurl.com/').search("//p[@class='posted']")
このパワフル・スクレーパに関するさらなる情報については、 HpricotBasics を参照してほしい。