君の瞳はまるでルビー - Ruby 関連まとめサイト

Mechanize について

最終更新: 2016-11-29 (火) 09:36:50 (359d)

目的

Mechanize を使ってウェブアクセスをエミュレートする基礎的な方法について説明します。

本ページが想定するのは基本的に「特定ページに対する操作の自動化」です。

自動巡回情報収集には Mechanize だけではなく、その他多くの応用技術が必要になるため対象としません。

インストール

以下のコマンドを実行して Mechanize gem をインストールします。

gem install mechanize

インストールできない場合は DEVELOPMENT KIT のセットアップが終わっているかを確認してみてください。

何をするにもまず最初に

エージェントを作る

何をするにもまずは最初にエージェント(=Mechanize インスタンス)を作ります。

require 'mechanize'

agent = Mechanize.new

この agent を使ってブラウザの操作を行います。変数名はもちろん任意ですが、慣習として a もしくは agent を利用するのが良いでしょう。

エージェントの設定を行う

エージェントを作ったらページにアクセスする前に必要な設定を行います。

例えば User-Agent*1 を設定するには以下の通り書きます。

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'

user_agent_alias は AGENT_ALIASES というマップ*2 によって定義された値を User-Agent として設定します。詳細な文字列を指定するよりも簡単に使えるので楽です。

ページにアクセスする

Mechanize#get メソッドを使うことでページにアクセスできます。

url = 'http://www.google.co.jp'
page = agent.get(url)

例えば以上のプログラムは、Google のトップページにアクセスし、そのページ内容を取得するものです。

ページ内容を取得した後は、ページの操作ができます。

画面の操作

テキストリンクをクリックする

アンカータグ(a タグ)によって作られたリンクのクリック操作は以下の通り書きます。

next_page = page.link_with(:text => 'リンクテキスト').click

テキストが可変な場合は正規表現も使えます*3

next_page = page.link_with(:text => %r!リンクテキスト!).click

next_page に次のページの情報が入ってきます。

フォームを入力する

フォームタグ(form タグ)によって作られたフォームの操作は以下の通り書きます。

next_page = page.form_with(:name => 'フォーム名') do |form|
  form.項目名1 = 項目値1
  form.項目名2 = 項目値2
end.submit

項目名には input 要素の name 属性の名前を使います。

submit メソッドでサブミットが行われ、次のページの情報が next_page に入ってきます。

入力が必要な項目の値だけ設定すればよく、hidden 項目やその他項目の初期値など、既存の項目は Mechanize が自動認識してくれるので、自分で入力する必要はありません。

ただし、Mechanize は JavaScript の実行はエミュレートしてくれないので、 submit ボタンが JavaScript の実行を前提としている場合、その動作は自分で行う必要があります。

例えば onClick イベントで以下のような処理

  • 項目の値を変更している
  • 実行するアクションを決定している

を JavaScript で行なっている場合などです。

対応方法についての考察を以下にまとめているので参考にしてください。

コツ

一気にプログラムを書くのは得策ではありません。

確実に目的が達成できるよう、以下のような不測の事態に備えて1操作ずつ確認しながら進めていくのをお勧めします

  • リンクのテキストが間違っていた。
  • フォーム名が間違っていた。
  • フォームの項目名が間違っていた。
  • JavaScript が使われていた。

確認のため次のページの HTML を出力していく方法があります。ページの HTML を出力するには以下の通り書きます。

puts page.body

画面を1つ遷移させたら、次のページの HTML を確認し、期待通りであれば次の画面操作を実装していきましょう。

備考

HTTPS アクセスを行う場合

Mechanize は HTTPS アクセスも当然サポートします。

HTTPS アクセスを行うには証明書情報が必要です。

ここでいう証明書情報とは、アクセス先のサイトが安全であること(偽装サイト等の悪徳サイトではないこと)を証明する情報のことです。

HTTPS アクセスを行うには事前にこの証明書情報の準備が必要になりますが、 これからアクセスする先のサイトが既に安全であるということがわかっていれば証明書の検証を飛ばす(無効にする)ことが可能です。

そのためにはサイトにアクセスする前に以下の設定をエージェントに対して行います。

agent.verify_mode = OpenSSL::SSL::VERIFY_NONE

この行為は危険ですので、アクセス先のサイトが限定される場合にのみ使ってください。

meta タグによるリフレッシュが行われている場合

サイトにアクセスする前に以下の設定をエージェントに対してするだけで自動で対処してくれます。

agent.follow_meta_refresh = true

コメント

本ページの内容に関して何かコメントがある方は、以下に記入してください。

コメントはありません。 コメント/mechanize/about

お名前: