ruby1.9.3でseleniumを動かす

超レガシー環境のruby1.9.3で動かしていたスクレイピングseleniumを使ったものに対応させる必要性があり、その時のメモです。

Dockerfile

FROM ruby:1.9.3

RUN apt-get update
RUN apt-get install -y ttf-freefont chromium unzip libgconf-2-4

ADD Gemfile .
ADD Gemfile.lock .
RUN bundle install

RUN wget https://chromedriver.storage.googleapis.com/2.28/chromedriver_linux64.zip && unzip chromedriver_linux64.zip
RUN rm -f /usr/local/bundle/bin/chromedriver && mv chromedriver /usr/local/bin/ && chmod 755 /usr/local/bin/chromedriver

RUN mkdir /noto
ADD https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip /noto
WORKDIR /noto
RUN unzip NotoSansCJKjp-hinted.zip && \
    mkdir -p /usr/share/fonts/noto && \
    cp *.otf /usr/share/fonts/noto && \
    chmod 644 -R /usr/share/fonts/noto/ && \
    fc-cache -fv
RUN rm -rf /noto

docker-compose.yml

version: '3'
services:
  ruby_selenium:
    build: .
    image: ruby_selenium
    container_name: ruby_selenium
    working_dir: /root/src
    volumes:
      - ./src/:/root/src/
    tty: true

src/scrape.rb

# coding: utf-8

require 'selenium-webdriver'

driver = Selenium::WebDriver.for :chrome, switches: ["--headless", "--no-sandbox"]

driver.navigate.to 'https://www.yahoo.co.jp/'
driver.save_screenshot './screenshot.png'

動かし方

コンテナを起動し、コンテナ内のシェルに入ります。

$ docker-compose build
$ docker-compose up -d
$ docker-compose exec ruby_selenium sh

シェルの中でサンプルスクリプトを動かすと

# ruby scrape.rb

次のように yahoo.co.jp のスクリーンショットが撮れます。

f:id:sanshonoki:20200213220552p:plain

手こずった点

ruby1.9.3だと selenium-webdriver の バージョンを指定する必要がある

selenium-webdriver のバージョン 2.53.4 じゃないとruby1.9 にはインストールできません

selenium-webdriver 2.53.4 だと Selenium::WebDriver::Chrome::Options がない

rubyで headless chrome を動かすコードをWebで調べると以下のようなサンプルコードが簡単に見つかるのですが、

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')

driver = Selenium::WebDriver.for :chrome, options: options

selenium-webdriver 2.53.4 ではこのコードは動きません..

How to use Chrome Options in Ruby Selenium? - Stack Overflow

に助けられました

chromiumのバージョンが古い

apt-get でインストールした chromiumブラウザ はかなりバージョンが古いです。

# /usr/bin/chromium --version
Chromium 57.0.2987.98 Built on 8.7, running on Debian 8.0

このバージョンに適合する chromedriver を探してくるのに苦労しました。

chromedriverのダウンロードページ だと ChromeDriver 2.41、Supports Chrome v67-69 までの情報しかのってなくv57 は見つかりません..

いろいろググっていたところ以下の記事が見つかり、助けられました。

javascript - Which ChromeDriver version is compatible with which Chrome Browser version? - Stack Overflow

この表から v57 に適合するのは 2.28 と分かり、対応するchromedriveをインストールできました

# /usr/local/bin/chromedriver --version
ChromeDriver 2.28.455506 (18f6627e265f442aeec9b6661a49fe819aeeea1f)

今回のコード

今回の記事のコードはこちらにあります github.com

参考にした記事