selenium-webdriverでRuby からブラウザを操作する
まとめ
- selenium-webdriverでプログラムからブラウザを制御できる
- ページのロードをまったり、ページ内のJSを実行したりできる。
- rubyのgemがあり、簡単に導入できる
- Firefoxならgemを入れるだけで動かせる
Rubyのスクレイピング方法
Rubyでスクレイピングする方法としては、 NokogiriやMechanizeが存在します。
どちらもHTMLを解析してページの要素にアクセスします。
ですが、実際のWebブラウザのエンジンとは違うため、若干の差異があったり、
Javascriptで動的に変化するページなどにちゃんと対応するのはとても大変です。
そこで、Webブラウザを直接操作してスクレイピングするライブラリの一つが、
selenium-webdriverになります。
selenium-webdriverのインストール
Rubyではselenium-webdrierのgemをインストールするだけで完了です。
なお、Google Chromeだとgem以外にもう一つインストールするものがありますが、
今回は説明が面倒なので省略し、Firefoxで動かします。
使い方
Selenium::WebDriver.for :firefox
で、firefoxのウインドウに対応するWebDriverオブジェクトが取得できます。
このWebDriverに対して、移動先のURLやDOM要素の取得などを行えます。
また、細かい設定などの変更のために、Profileというものが用意されています。
これに対して様々な設定をし、WebDriver作成時に設定することで、
ブラウザの挙動を変更出来ます。
以下は、pdfを開いたときに特定のフォルダに保存する設定がされた状態で、
Googleでpdfを検索し、先頭の一つをdownフォルダにダウンロードするコードになります。
require "selenium-webdriver"
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.dir'] = "#{File.expand_path(File.dirname(__FILE__))}/down"
profile['browser.download.folderList'] = 2
profile['browser.download.useDownloadDir'] = true
profile['browser.helperApps.neverAsk.saveToDisk'] = "application/pdf"
profile['pdfjs.disabled'] = true
driver = Selenium::WebDriver.for :firefox, :profile => profile
driver.navigate.to "https://www.google.com/search?as_q=&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=&cr=&as_qdr=all&as_sitesearch=&as_occt=any&safe=images&as_filetype=pdf&as_rights=&gws_rd=ssl"
links = driver.find_element(:class, 'r').find_elements(:tag_name, 'a')
if links
links.each do |element|
if element.displayed?
element.click
exit 0
end
end
end