はじめに
クローラーを作成してみたのでメモとして残しておきます。使用できる言語は色々ありますが今回は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(求人情報とか)を取得しています。ここからは、同じことをやってどんどんページ遷移していき取得したい情報のページまで遷移して、スクレイピングします。
注意点
スクレイピングするときは、くれぐれも相手のサイトに負荷をかけないように間隔をあけて作業するようにプログラムを組みましょう。