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