[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を組み合わせれば、データを定期的に取ってきて保存しておいて、機械学習なんかにも使えるので便利ですね。