どうも、コロンビア人の学生エンジニアgaruです。
Rubyでスクレイピング(クローリング)の構築をするには必ず理解しておきたい、3つのライブラリがあるってご存知でしたか?

  • Net::HTTP
  • Mechanize
  • Selenium

Net::HTTPについては「マッハでクローラーを構築する(curl to ruby)」で紹介しました。
今回は、Mechanizeについて紹介します。

「Net::HTTP」「Mechanize」「Selenium」を使い分ける理由

そもそもなぜ、3つのライブラリを使い分けなければいけないのだろうか?
どれか1つに統一してはダメなのだろうか??

ごもっともです

僕も可能なら、どれか1つに統一したいのですが、それぞれにはメリット/デメリットがあります。

実行速度 コード量 Javascript実行
Net::HTTP 早い 多い ✖️
Mechanize 普通 少ない ✖️
Selenium やや遅い 少ない

SeleniumはMechanizeよりもブラウザに近い状態で実行できるので、とても便利です。
しかし、今回はMechanizeに焦点を絞っていきましょう。

# mechanizeを持っていない人はインストールしよう
$ gem install mechanize

「Net::HTTP」->「Mechanize」に切り替える理由

上記の表でコード量は減るが、実行速度は遅くなるためメリットがあるようには感じられません。。。

もちろん、それだけではありません。

Net::HTTPはリクエストを送り、そのレスポンスを受け取っているだけにすぎないため、ブラウザ(ChromeやSafari)とは状態が違います。 しかし、Mechanizeはブラウザと同じようにリクエストして受け取ったレスポンスを一時的に保持し、通信上ではまるでブラウザからアクセスしているかのように感じ取られます。

require 'mechanize'

# ブラウザの立ち上げ
agent = Mechanize.new

# ページにアクセス
google_page = agent.get('https://www.google.com/')

ブラウザのようなアクセスが出来る事によって以下の3つの利点を紹介します。

1. ブラウザのようにページを遷移(クリックして移動)ができる

HTMLの状態を保持しているため、ページ内のリンクをクリックして、ページを遷移することができます。

# ページ内のリンクをクリック
img_search_page = google_page.links[0].click # このlinkは画像検索ページのリンクでした

次の状態を変数に格納します。
この時、変数名はどのようなページにいるのかわかりやすい名前にしましょう。

2. ブラウザ上で入力欄に文字を入力できる

HTMLの状態があればログイン情報の入力欄や検索ボックスに文字の入力ができます。

# ページ内の入力欄を取得
search_form = img_search_page.forms[0]

# 検索キーワード入力欄に文字を入力
search_form.q = 'google'

# 検索結果を表示(フォームをsubmitすると言います)
google_img_page = search_form.submit

このようなことをNet::HTTPで行おうとすると、検索の際にどのようなリクエストを送信しているのか調べて、それらの情報を渡した状態でURLを開く必要があり、手間がかかります。
その点、Mechanizeはブラウザのように進める事が出来るため、より直感的に進められらますね。

ブラウザではGmailにアクセスすると自動ログインされるような場面があります。

これはどうしてでしょう?

それはブラウザが「Cookie」というユーザーの情報を保存しているからです。Cookieはユーザーの検索履歴やログイン情報などを多く保存しています。これがある事によって、自動でログインが可能となります。
そして、Mechanizeでもブラウザを立ち上げた瞬間からCookieを保持しているため、より本当のブラウザのように見せかけられているのです。

# cookieを確認
agent.cookie_jar
# => #<Mechanize::CookieJar:(略

ここで気をつけたいのは、cookieを保持しているのは初期に立ち上げたagentだという事です。
遷移したページ先でpage.cookie_jarは出来ないので注意したいです。

このようにcookieを出力できると、データベースにcookieを保存するなどして、次回のスクレイピング(クローリング)でcookieを渡せば同様の状態から開始する事が可能です。

Mechanizeの極意とは

今回はMechanizeの入門という事で、以下の3つに絞ってシンプルにMechanizeの優位性を解説しました。

  • リンクをクリックできる
  • 入力欄に値を入力して、submitできる
  • Cookieを出力できる(保存できる)

しかし、Mechanizeの本領はまだまだ発揮されていません。
さらにブラウザっぽく偽装(ユーザーエージェントの指定)をしたり、画像を保存したり、入力欄だけでなくドロップダウンリストを指定したり、Net::HTTPと組み合わせて使ったりも出来ます。

どれかに囚われるのではなく、それぞれの強みを理解した上で、どれが最適か選択する事もまたスクレイピングエンジニアの役割だと思いました。