読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Ruby+Mechanizeで対話型のスクレイピング

 クローラー/スクレイピング Advent Calendar 2014の6日目です。あと、全部俺Advent Calendarも開催中です。

 リクエストがあったので、Mechanizeを使ったスクレイピング方法についてです。Mechanizeは、対話型の処理を得意とするスクレイピングの補助ツールです。対話型とは、例えばIDとパスワードを使ってログインするようなサイトなので、それぞれ項目に入力して次のページに遷移するような行為です。

Mechanizeのサンプルソース



 下記は、Amazonアソシエイトサイトから売上を取得するサンプルです。

require 'mechanize'

uri=URI.parse('https://affiliate.amazon.co.jp/')
agent = Mechanize.new
agent.user_agent_alias = 'Mac Safari'
page = agent.get(uri)
next_page = page.form_with(:name => 'sign_in') do |form|
  form.username = 'your_username'
  form.password = 'your_password'
end.submit
puts next_page.search('//*[@id="mini-report"]/div[5]/div[2]').text

 Mechanizeのオブジェクトを作成し、ユーザエージェントなどの属性情報を指定します。次に対象のURIを指定して、ページを開けます。ページを開くと、入力する対象のフォームを探します。幾つか探し方はありますが、今回はフォーム名で探しています。そして、フォーム中のユーザ名とパスワードにそれぞれ入力しサブミットしています。
 次のページでは、xpath形式で取得対象の情報を指定してデータを抜き出しています。Mechanizeも、データのスクレイピングにはNokogoriを内部的に利用しています。

Mechanizeが得意とする処理と苦手とする処理



 Mechanizeの基本は対話型の処理になります。その為、ページごとに必要な処理を記述する必要があります。その為、認証が必要なページやPOST送信が必要な場合には、絶大な威力を発揮します。反面、サイト内をくまなく巡回して、全てのリンクを取得するといったような処理は苦手とします。出来ないことはないですが、記述する処理量が多くなり非効率となります。

感想



 Mechanizeは、Rubyによるクローラー開発技法でも少し取り上げています。しかし、あまり詳しくは書いていない為、もっと色々書いてというリクエストを受けます。根強い人気なんだなぁと度々実感しています。今回はホンのさわり部分だけなので、いつか掘り下げて取り扱おうと思います。

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例