mechanize-2.7.3 の GUIDE.rdoc の
日本語訳です。Mechanize は MIT ライセンス で配布され、現在 (2014年) は、
Eric Hodel, Aaron Patterson, Mike Dalessio, Akinori MUSHA, Lee Jarvis ら
によってメンテされています。
日本語訳です。Mechanize は MIT ライセンス で配布され、現在 (2014年) は、
Eric Hodel, Aaron Patterson, Mike Dalessio, Akinori MUSHA, Lee Jarvis ら
によってメンテされています。
最近わたくしはこの手のことは Capybara を使ってやるべきだと考えるように
なりました; Capybara はそのドライバに Mechanize, PhantomJS, Selenium,
Webkit をそろえており、抽象化されているからです。なので、Mechanize 単体
について触れるのは、たぶんこれが最後になるかなぁ。
なりました; Capybara はそのドライバに Mechanize, PhantomJS, Selenium,
Webkit をそろえており、抽象化されているからです。なので、Mechanize 単体
について触れるのは、たぶんこれが最後になるかなぁ。
Mechanize をはじめてみる Getting Started With Mechanize
このガイドは、きみに Mechanize を始めてもらうためのものだ。このガイド
を終えるころには、きみはページをフェッチしたり、リンクをクリックしたり、
フォームを埋めてサブミットしたり、データをスクレイプしたり、またその他
お望みの、たくさんの便利なことができるようになるはず。このガイド
は、できることのほんのさわりをざっと書いただけだけど、きみが実際にやって
みるための十分な情報となるはずだ!
を終えるころには、きみはページをフェッチしたり、リンクをクリックしたり、
フォームを埋めてサブミットしたり、データをスクレイプしたり、またその他
お望みの、たくさんの便利なことができるようになるはず。このガイド
は、できることのほんのさわりをざっと書いただけだけど、きみが実際にやって
みるための十分な情報となるはずだ!
ページをフェッチしよう! Let’s Fetch a Page!
大事なことを最初に。きみが Mechanize を使いたいときには、必ず
新しい Mechanize オブジェクトをインスタンス化する必要がある:
新しい Mechanize オブジェクトをインスタンス化する必要がある:
require 'rubygems'
require 'mechanize'
agent = Mechanize.new
さあ、ページをフェッチするためにエージェントを使おう。ぼくたちの Mechanize
のエージェントでグーグルをフェッチしてみよう:
のエージェントでグーグルをフェッチしてみよう:
page = agent.get('http://google.com/')
なにが起きたんだ? ぼくたちは Mechanize に、グーグルのメインページを
拾ってくるように言った。Mechanize はセットされた任意の cookie たちを
保存し、グーグルが送ったかもしれない任意のリダイレクトを追っていった。
エージェントはぼくたちに、ひとつのページ ――ぼくたちがデータをスクレイプ
したり、クリックするリンクを探したり、もしくはフォームを埋めたりするために
使うことができる―― を返してくれた。
拾ってくるように言った。Mechanize はセットされた任意の cookie たちを
保存し、グーグルが送ったかもしれない任意のリダイレクトを追っていった。
エージェントはぼくたちに、ひとつのページ ――ぼくたちがデータをスクレイプ
したり、クリックするリンクを探したり、もしくはフォームを埋めたりするために
使うことができる―― を返してくれた。
つぎに、リンクを探してクリックするのをやってみよう。
リンクを探す Finding Links
Mechanize は、きみがページを get したり post したり、フォームを submit
したりしたときに、page オブジェクト返す。ページがフェッチされると、
エージェントはそのページをパースして、page オブジェクト上にリンクたちの
リストを作る。
したりしたときに、page オブジェクト返す。ページがフェッチされると、
エージェントはそのページをパースして、page オブジェクト上にリンクたちの
リストを作る。
今われわれは Google のホームページをフェッチしたので、リンクたちを
すべてリストアップしてみよう:
すべてリストアップしてみよう:
page.links.each do |link|
puts link.text
end
ぼくたちはリンクたちをリストしたけど、Mechanize はクリックするためのリンク
を見つけるのに役立つ、2, 3 のショートカットたちを与えてくれる。仮にぼくたち
は ‘News’ というテキストのリンクをクリックしたかったとしよう。
を見つけるのに役立つ、2, 3 のショートカットたちを与えてくれる。仮にぼくたち
は ‘News’ というテキストのリンクをクリックしたかったとしよう。
ふつうは、こうすればいいでしょう:
page = agent.page.links.find { |l| l.text == 'News' }.click
だけど Mechanize はぼくたちにショートカットを与えてくれる。代わりにこう
書けるんだ (訳注:
書けるんだ (訳注:
:text => /.ews$/
というように正規表現も可能です): page = agent.page.link_with(:text => 'News').click
このショートカットは「’News’という名前のリンクを全部さがせ」と言っている。
きみは「そのテキストを持つリンクが複数あるかもしれない!」考えてるかも
ね。そしてあなたは正しい! 複数形をつかえば、きみは一覧にアクセスできるよ。
きみは「そのテキストを持つリンクが複数あるかもしれない!」考えてるかも
ね。そしてあなたは正しい! 複数形をつかえば、きみは一覧にアクセスできるよ。
もしきみが 2 番目の ‘News’ リンクをクリックしたければ、このようにできる
(訳注:
(訳注:
link_with
が links_with
になっていることに注目): agent.page.links_with(:text => 'News')[1].click
ぼくたちは適切な href を使ってもリンクを探せるよ:
page.link_with(:href => '/something')
もしくはこれらをつなげて、適切なテキストと適切な href を持つリンクを探す
こともできる:
こともできる:
page.link_with(:text => 'News', :href => '/something')
これらの Mechanize が提供するショートカットたちは、きみがフェッチできる
frame たち、iframe たち、また form たちのような、どんなリストにも可能だ。
今われわれはリンクを探してクリックする方法がわかったので、フォームを
埋めるような、なにかもっと複雑なことをやってみよう。
frame たち、iframe たち、また form たちのような、どんなリストにも可能だ。
今われわれはリンクを探してクリックする方法がわかったので、フォームを
埋めるような、なにかもっと複雑なことをやってみよう。
フォームを埋める Filling Out Forms
Google の例の続きをやろう。これが、ここまででぼくたちにあるコードだ:
require 'rubygems'
require 'mechanize'
agent = Mechanize.new
page = agent.get('http://google.com/')
もしそのページをプリティプリント (
2 つのボタンたちと 2, 3 のフィールドたちを持つ、ひとつの form があること
が、ぼくたちにはわかる。
pp
) すれば、そこには ‘f’ という名前の、2 つのボタンたちと 2, 3 のフィールドたちを持つ、ひとつの form があること
が、ぼくたちにはわかる。
pp page
今ぼくたちは form の名前を知っているので、それをページからフェッチして
みよう:
みよう:
google_form = page.form('f')
Mechanize はきみに 2, 3 の異なる方法で input フィールドたちにアクセスさせる
けど、いちばん便利なのは、きみがオブジェクト上のアクセッサで input
フィールドにアクセスできることだ。じゃあ、そのフォームの ‘q’ という名前の
フィールドに ‘ruby mechanize’ とセットしてみよう:
けど、いちばん便利なのは、きみがオブジェクト上のアクセッサで input
フィールドにアクセスできることだ。じゃあ、そのフォームの ‘q’ という名前の
フィールドに ‘ruby mechanize’ とセットしてみよう:
google_form.q = 'ruby mechanize'
ぼくたちが値をセットしたことを確認するには、フォームを
きみがこれに似たような一行があるのがわかるはずだ:
pp
して、きみがこれに似たような一行があるのがわかるはずだ:
#<Mechanize::Field:0x1403488 @name="q", @value="ruby mechanize">
もし ‘q’ の「値」 (
トラックにいるよ!今ぼくたちはそのフォームをサブミットしてサブミットボタン
を「押し」、そして結果をプリントできる:
value
) が変わっていることがわかれば、きみは正しいトラックにいるよ!今ぼくたちはそのフォームをサブミットしてサブミットボタン
を「押し」、そして結果をプリントできる:
page = agent.submit(google_form, google_form.buttons.first)
pp page
ぼくたちのしたことはちょうど、検索フィールドにテキストを入力して「Google 検索」
ボタンをクリックしたのと同じ (equivalent) ことだよ。もしボタンの指定無しで
フォームをサブミットしたならば、それはテキストフィールドにタイプして、
Enter キーを押したのと同じこと。
ボタンをクリックしたのと同じ (equivalent) ことだよ。もしボタンの指定無しで
フォームをサブミットしたならば、それはテキストフィールドにタイプして、
Enter キーを押したのと同じこと。
コードをすべて通しで見てみよう:
require 'rubygems'
require 'mechanize'
agent = 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
スクリーン・スクレイピングに進む前に、フォームについてもうちょっと
つっこんで見てみよう。きみが先に飛ばしたくなければ!
つっこんで見てみよう。きみが先に飛ばしたくなければ!
フォーム・テクニック応用 Advanced Form Techniques
このセクションでは、わたしは、form によって使える input フィールドたちの
異なったタイプたちを使ってみることに触れたい。パスワードや TEXTAREA
フィールドたちは、ちょうどテキスト・インプット・フィールドたちのように扱う
ことができる。Select フィールドたちは、テキスト・フィールドにとても似て
いるけど、それらは関連するたくさんのオプションたち (選択アイテム群) を持つ。
きみがひとつのオプションをセレクトすれば、Mechanize はその他のオプション
たちについてデセレクト (非選択に) する (マルチ・セレクトでない限りは!)。
異なったタイプたちを使ってみることに触れたい。パスワードや TEXTAREA
フィールドたちは、ちょうどテキスト・インプット・フィールドたちのように扱う
ことができる。Select フィールドたちは、テキスト・フィールドにとても似て
いるけど、それらは関連するたくさんのオプションたち (選択アイテム群) を持つ。
きみがひとつのオプションをセレクトすれば、Mechanize はその他のオプション
たちについてデセレクト (非選択に) する (マルチ・セレクトでない限りは!)。
たとえば、あるリストのひとつのオプションを選択してみよう:
form.field_with(:name => 'list').options[0].select
さあいまチェックボックスたちとラジオボタンたちについて、見てみよう。
あるチェックボックスを選択するには、このようにチェックするだけだ:
あるチェックボックスを選択するには、このようにチェックするだけだ:
form.checkbox_with(:name => 'box').check
ラジオボタンたちはチェックボックスたちにとても似ているけど、それらは同一の
名称の他のラジオボタンたちをどうやってアンチェックするかを、知っている。
あなたがチェックボックスでやったように、ただラジオボタンをひとつチェック
するだけだ (訳注: 反対に、チェックされているかどうか調べたいときは、
名称の他のラジオボタンたちをどうやってアンチェックするかを、知っている。
あなたがチェックボックスでやったように、ただラジオボタンをひとつチェック
するだけだ (訳注: 反対に、チェックされているかどうか調べたいときは、
#checked?
を使う): form.radiobuttons_with(:name => 'box')[1].check
Mechanize はまたファイルのアップロードも簡単だ! file upload フィールドを
みつけて、なんというファイル名をきみがアップロードしたいかを教えてやるだけ:
みつけて、なんというファイル名をきみがアップロードしたいかを教えてやるだけ:
form.file_uploads.first.file_name = "somefile.jpg"
データをスクレイピングする Scraping Data
Mechanize は HTML をパースするのに Nokogiri 鋸 を
使っている。これはきみにとって何の意味があるか? きみは Mechanize の
ある page を、Nokogiri オブジェクトのひとつとして扱えるということだ。
スクレイプしたいページへのナビゲーションに Mechanize を使えば、
きみは Nokogiri のメソッドを使ってスクレイプできるんだ:
使っている。これはきみにとって何の意味があるか? きみは Mechanize の
ある page を、Nokogiri オブジェクトのひとつとして扱えるということだ。
スクレイプしたいページへのナビゲーションに Mechanize を使えば、
きみは Nokogiri のメソッドを使ってスクレイプできるんだ:
agent.get('http://someurl.com/').search("p.posted")
Mechanize::Page#search
に与える式は、CSS の式や XPath の式でよいかも。 agent.get('http://someurl.com/').search(".//p[@class='posted']")
0 件のコメント:
コメントを投稿
何かありましたら、どうぞ: