環境
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.6
BuildVersion: 17G65
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin17]
下準備
- GoogleChromeのインストール
- chromedriverのダウンロード
- selenium-webdriver(gem)をインストール
1. GoogleChromeのインストール
- 最新版のchromeを上記サイトからダウンロード&インストール
- インストールしたアプリを起動(デフォルトブラウザ設定/レポート送信等はお好みで)
2. chromedriverのダウンロード/パスを通す
2-1. ファイルダウンロード
GUIの場合:
http://chromedriver.storage.googleapis.com/index.html
- LATEST_RELEASEディレクトリに、最新のディレクトリの記載があるので、そのバージョンをダウンロード
- 2.42(10/09時点)
CUIの場合:
$ curl -O -L http://chromedriver.storage.googleapis.com/2.42/chromedriver_mac64.zip # -> カレントディレクトリ配下にダウンロード
※ダウンロードURLはバージョンに合わせてよしなに調べて下さい
$ unzip chromedriver_mac64.zip
$ rm chromedriver_mac64.zip
2-2. ファイルを移動
$ sudo mv ['解凍したchromedriver'] /usr/local/bin
2-3. パスを通す
$ export PATH="/usr/local/bin:$PATH"
2-4. 確認
$ which chromedriver
--> /usr/local/bin/chromedriver
3. selenium-webdriver(gem)をインストール
3-1. selenium-webdriverインストール
- Gemファイルを使う場合
gem 'selenium-webdriver' # この記載を追加
$ bundle install
- 直接インストールする場合
$ gem install selenium-webdriver
3-2. 確認
$ gem list | grep selenium-webdriver
-> selenium-webdriver (3.12.0) ※特定のバージョンが良い場合はよしなに指定
コード
require 'selenium-webdriver'
@wait_time = 3
@timeout = 4
# Seleniumの初期化
# class ref: https://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Chrome
Selenium::WebDriver.logger.output = File.join("./", "selenium.log")
Selenium::WebDriver.logger.level = :warn
driver = Selenium::WebDriver.for :chrome
driver.manage.timeouts.implicit_wait = @timeout
wait = Selenium::WebDriver::Wait.new(timeout: @wait_time)
# Yahooを開く
driver.get('https://www.yahoo.co.jp/')
# ちゃんと開けているか確認するため、sleepを入れる
sleep 2
#**
# ブラウザでさせたい動作を記載する
# ex. 検索欄に'Ruby'と入力して、検索ボタンを押す処理
# 検索欄/検索ボタン取得
begin
search_box = driver.find_element(:id, 'srchtxt') # 検索欄
search_btn = driver.find_element(:id, 'srchbtn') # 検索ボタン
rescue Selenium::WebDriver::Error::NoSuchElementError
p 'no such element error!!'
return
end
# 入力欄に'Ruby'を入力し、検索ボタンを押下
search_box.send_keys 'Ruby'
search_btn.click
#**
# ドライバーを閉じる
driver.quit
注意点
-
ネットワークが遅い場合等は@wait.until{}を使って要素が取得出来るまで待ってあげると良いです。
-> http://katsulog.tech/i-do-not-recommend-using-sleep-when-waiting-for-elements/ -
ログについては、私は別途Loggerオブジェクトを生成してロギングするメソッドを作って、それを呼び出してます。
log_file = File.join('./', "function.log")
@log = Logger.new(log_file)
def log(msg)
@log.debug(msg)
end
参考
まとめ
仕事でよく使う機会があるので、備忘も兼ねて書きました。
覚えてしまえば、簡単にスクレイピング出来るので重宝しています。
cronとDBを組み合わせれば、データを定期的に取ってきて保存しておいて、機械学習なんかにも使えるので便利ですね。