酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Seleniumでスクレイピング [Ruby]

RubyからChrome/Safari/IE/Firefoxを操作してスクレイピングする方法として、『Selenium』を使う方法があったので、ちょっと試してみました。今回はその時のメモです。

Rubyからブラウザを操作する方法としては、他にGem『Watir』を使う方法もあるので、よかったらこちらもご検討下さい!


Gemのインストール

Gemfileに以下を追加して、コンソールでbundleを実行してください。

1
2
# ブラウザ操作
gem 'selenium-webdriver'

基本動作

Rubyのコード内でブラウザを起動・終了させる手順はこちら。

1
2
3
4
5
6
7
8
9
10
11
12
13
require 'selenium-webdriver'

# ブラウザ起動
# :chrome, :firefox, :safari, :ie, :operaなどに変更可能
driver = Selenium::WebDriver.for :chrome

# Googleにアクセス
driver.navigate.to "http://google.com"

# HTMLページの操作・解析をごにょごにょ

# ブラウザ終了
driver.quit

HTML要素の解析

Webページ内のHTML要素を解析する場合はこちら。

1
2
3
4
5
6
7
8
# :xpathは、:class, :css, :id, :link, :name, :tag_nameなど指定可能
element = driver.find_element(:xpath, 'input')

# elementをすべて探しだしてArrayを返す
elements = driver.find_elements(:xpath, 'img')

# find_elementの結果をさらにfind_elementすることも可能(メソッドチェーン)
element = element.find_element(:xpath, 'div[1]/section')  # XPathの指定

Nokogiriとの連携

HTMLの解析は専門HTMLパサーのNokogiriに任せるのもありだと思います。

1
2
3
4
5
6
require 'nokogiri'

html = driver.page_source
doc = Nokogiri::HTML(html)

# HTMLの解析処理をごにょごにょ

Webページへの入力

Webページのテキストフィールドなどへ入力を行うことも可能です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# テキストフィールドへ入力
element = driver.find_element(:name, 'q')
element.send_keys('Ruby')

# テキストフィールドのクリア
element.clear

# ドロップダウンリスト選択
select = Selenium::WebDriver::Support::Select.new(driver.find_element(:id, 'list'))
select.select_by(:value, 'hoge') # valueの値の指定
select.select_by(:text,  'fuga') # 表示テキストの指定
select.select_by(:index, 2)      # インデックス(0始まり)の指定

# ラジオボタン選択
driver.find_elements(:class, 'selection-1')[2].click

# リンクやボタンを押す
driver.find_element(:xpath, 'div[1]/section/a').click

Webページ内の情報を収集

Webページ内の情報を収集したり、スクリーンショットをとったり。

1
2
3
4
5
6
7
8
9
10
11
# 現在のページを取得
puts driver.current_url

# 現在のページのタイトルを取得
puts title: driver.title

# 指定した要素内のテキストを取得
puts element.text

# スクリーンショットを取る 
driver.save_screenshot('path/to/screen.png')

Chromeの起動時パラメータ/Profileの指定

Chromeブラウザを起動する場合のCommand Line switchesを指定する方法はこちら。

1
2
3
4
5
6
switches = []
switches << "--proxy-server='Proxyサーバ・ドメイン:ポート'"
switches << "--disable-popup-blocking"
switches << "--disable-translate"

Selenium::WebDriver.for :chrome, :switche => switches

指定できるswitchesの詳細は『List of Chromium Command Line Switches « Peter Beverloo』。

Chromeのプロファイル指定手順です。

1
2
3
4
5
profile = Selenium::WebDriver::Chrome::Profile.new
profile['download.prompt_for_download'] = false
profile['download.default_directory'] = "/path/to/dir"

driver = Selenium::WebDriver.for :chrome, :profile => profile

Chromeのプロファイルの指定できる要素の一覧は『こちら』。

Firefoxのプロファイル設定

Firefoxのプロファイル指定の手順です。

1
2
3
4
5
6
7
# Firefoxのプロファイル指定
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.dir'] = "/tmp/webdriver-downloads"
profile['browser.download.folderList'] = 2
profile['browser.helperApps.neverAsk.saveToDisk'] = "application/pdf"

driver = Selenium::WebDriver.for :firefox, :profile => profile

こちらは僕の環境ではなぜか正しく動作しませんでした。。。
もし指定の仕方が間違っていたら、ぜひ指摘して下さい。

公式サイト

Seleniumの公式サイトはこちら。英語ですが、サンプルがわかりやすく書かれています。

RubyBindings - selenium

Special Thanks

RubyでSeleniumを使ってスクレイピング #Ruby #Selenium - Qiita [キータ]

備忘録 selenium - nakanolab 開発備忘録

Seleniumでスクレイピングする - みんなのちからになりたい

おすすめの書籍