Rubyでスクレイピング

  • 76
    Like
  • 0
    Comment
More than 1 year has passed since last update.

ちょっと前までは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 #ハッシュで

これくらいあればだいたいなんでもできるはず(たぶん)。