ちょっと前まではMechanizeとかでやってたんですが、最近のはJavascriptが動くのが前提なサイトが多いので、Capybara+Poltergeistでやることにしてます。
性能で問題が出た時だけMechanizeとかにすれば良いんじゃないかな。
PhantomJS入れる
brew install phantomjs
Gem入れる
Gemfile
gem 'nokogiri'
gem 'poltergeist'
gem 'capybara'
アクセスするところまで
User-Agentは適当に
require 'capybara/poltergeist'
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, {:js_errors => false, :timeout => 5000 })
end
session = Capybara::Session.new(:poltergeist)
session.driver.headers = {
'User-Agent' => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2564.97 Safari/537.36"
}
session.visit "http://www.yahoo.co.jp"
Capybara周りの使い方
ID/パスワード入力して次のページヘ
email_input = session.find('input#email')
email_input.native.send_key('mail@example.com')
password_input = session.find('input#password')
password_input.native.send_key('mypassword')
submit = session.find('#submit-button')
submit.trigger('click')
htmlを取得
html = session.html
iframeの中のHTMLを取得
iframe_html = session.evaluate_script('$("#IFrame")[0].contentWindow.document.body.innerHTML')
htmlをパースしてオブジェクト生成
doc = Nokogiri::HTML.parse(html)
Nokogiriの使い方
参考: http://d.hatena.ne.jp/otn/20090509/p1
基本的にはCSSセレクタ派なのでその使い方をメインに
cssセレクタで要素を検索
elements = doc.css('.section')
参考 http://weboook.blog22.fc2.com/blog-entry-268.html
HTMLを取得
to_html = doc.to_html
inner_html = doc.inner_html
属性
keys = doc.keys #属性名
values = doc.values #属性値
attributes = doc.attributes #ハッシュで
これくらいあればだいたいなんでもできるはず(たぶん)。