[クローラー] Capybara Tips

More than 1 year has passed since last update.


poltergeistの設定

Capybara.configure do |config|

config.run_server = false
config.current_driver = :poltergeist
config.javascript_driver = :poltergeist
config.default_max_wait_time = 10
end

Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, {
timeout: 10,
js_errors: false,
phantomjs_options: ['--load-images=no', '--ignore-ssl-errors=yes', '--ssl-protocol=any'],
})
end


Capybara::Sessionのラッパークラスを作る

class BaseBrowser

attr_reader :session
def initialize(url, options = {})
@session = Capybara::Session.new(:poltergeist)

@session.visit(url)
end
end


デフォルト言語設定を日本語にする

session.driver.headers = {

'Accept-Language' => 'ja'
}

ja と ja-JPだとjaのが良さそう

http://memorva.jp/internet/pc/browser_language.php


iphoneやMacでアクセスする

Mac

session.driver.headers = {

"User-Agent" => "Mac Safari"
}

iphone

session.driver.headers = {

"User-Agent" => 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A334 Safari/7534.48.3'
}


非表示のテキストを取得する

session.find('css_class', visible: false).text(:all)

session.all('css_class', visible: false).map { |tag| tag.text(:all) }

visible: false

textにallを渡す


ajaxの待機メソッド(Capybara.default_max_wait_time = 10であれば内部で10秒待ってくれる)

def wait_for_ajax(loading_element)

session.has_css?(loading_element)
end


poltergeistをkill

def finish

session.driver.quit
@session = nil
end

これをしないとバッチのループなどでsessionを立ち上げ続けてるとpoltergeistが死なずにメモリが膨れる。なので実行終了時や例外時で抜ける時などに必ずfinishを呼び出す。