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

## はじめに
クローラーを作成してみたのでメモとして残しておきます。使用できる言語は色々ありますが今回は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(求人情報とか)を取得しています。ここからは、同じことをやってどんどんページ遷移していき取得したい情報のページまで遷移して、スクレイピングします。

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