Edited at

[Ruby] seleniumでChromeを使ってWebスクレイピング


環境

$ 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のインストール

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


注意点


log_file = File.join('./', "function.log")
@log = Logger.new(log_file)

def log(msg)
@log.debug(msg)
end


参考

ドライバーでの処理について(操作方法をまとめてくれてます)


まとめ

仕事でよく使う機会があるので、備忘も兼ねて書きました。

覚えてしまえば、簡単にスクレイピング出来るので重宝しています。

cronとDBを組み合わせれば、データを定期的に取ってきて保存しておいて、機械学習なんかにも使えるので便利ですね。