Help us understand the problem. What is going on with this article?

Mechanizeでログインしてスクレイピングする

More than 3 years have passed since last update.

はじめに

クローラーを作成してみたのでメモとして残しておきます。使用できる言語は色々ありますが今回はRubyを使用します。この際に、利用できるライブラリが幾つか用意されています。ライブラリの選び方は下記のURLが綺麗にわかりやすくまとまっているので参考にしてください。
http://qiita.com/mmmm/items/545e0aec82e6949ebb0a

今回はログインだけできればよかったのでNokogiri + Mechanizeで開発していきたいと思います。

 インストール

大げさにしていますが単にGemfileに

gem 'nokogiri'

gem 'mechanize'

と書いて

bundle install --path=vendor/bundle

とするだけです笑

間違って違うgemをインストールしてしまった場合(例としてunicorn)は

bundle exec gem uninstall unicorn

としてGemfileから

gem 'unicorn'

を削除すれば完了です。

 実用例

require 'mechanize'

class Hoge < Site
  def crawl
    agent = Mechanize.new
    agent.user_agent = 'Mac Safari'
    agent.get('https://www.hogehoge.jp/login/') do |page|
      response = page.form_with(:action => '/login/doLogin/') do |form|
        formdata = {
          :mail => 'mail', # 自分のログイン用メールアドレスを入れる
          :password => 'password',  # 自分のパスワードを入れる
        }
        form.field_with(:name => 'email').value = formdata[:mail]
        form.field_with(:name => 'password').value = formdata[:password]
      end.submit
    end
  end
end

基本形がこんな感じです。

細かくみていく

MechanizeはWebサイトとの対話を自動化するためのライブラリです。ググってみるとログインのためのフォーム入力、ページ遷移しての処理をMechanizeのインスタンスで行っているのをよく見かけるので、ここでもそこに則って行います。

user_agentの部分ですが、こいつがないとエラーになるときもあるのでいれておきましょう。
ちなみにuser_agentですが以下が一覧になります。

AGENT_ALIASES = {
  'Windows IE 6' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
  'Windows IE 7' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
  'Windows Mozilla' => 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6',
  'Mac Safari' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-at) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10',
  'Mac FireFox' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6',
  'Mac Mozilla' => 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4a) Gecko/20030401',
  'Linux Mozilla' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624',
  'Linux Firefox' => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1',
  'Linux Konqueror' => 'Mozilla/5.0 (compatible; Konqueror/3; Linux)',
  'iPhone' => 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3',
  'Mechanize' => "WWW-Mechanize/#{VERSION} (http://rubyforge.org/projects/mechanize/)"
}

あとはgetメソッドでログイン画面のサイトのURLを取得する。そしてform_withでログイン後のアクションを指定します(開発ツールで指定のログインサイトのログインボタンを見てみると記述してあります。)field_withのname=>以降に開発ツールでみた値(name)を入れます

これでログインできます。

ログインした後にページを遷移する

require 'open-uri' ← スクレイピングするのに必要
require 'nokogiri' ← スクレイピングするのに必要
require 'mechanize'

class Hoge < Site

  def crawl
    上のと全く同じなので略。endで閉じずに続ける
    taget_url = "https://www.hoge.jp/hogehoge&p=[[page_number]]"
    (1..1000).each do |index|
      url = target_url.gsub("[[page_number]]",index.to_s)
      html = agent.get("#{url}").content.toutf8
      contents = Nokogiri::HTML(html, nil, 'utf-8')
      break if contents.search("div[@class='mogemoge']").empty?
      contents.search("div[@class='mogemoge']").search('a').each do |content|
        href = content['href']
        href.slice!(0)  if href[0] == "/"
        next if href=="javascript:void(0);"
        url = "#{self.web_site.url}#{href}"
      end
    end
 end

end

みたいな感じでページネージョンのあるページにて、リンクが並んでいるもの(求人サイトとか)のurl(求人情報とか)を取得しています。ここからは、同じことをやってどんどんページ遷移していき取得したい情報のページまで遷移して、スクレイピングします。

注意点

スクレイピングするときは、くれぐれも相手のサイトに負荷をかけないように間隔をあけて作業するようにプログラムを組みましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした