超レガシー環境の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 のスクリーンショットが撮れます。
手こずった点
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 は見つかりません..
いろいろググっていたところ以下の記事が見つかり、助けられました。
この表から v57 に適合するのは 2.28 と分かり、対応するchromedriveをインストールできました
# /usr/local/bin/chromedriver --version ChromeDriver 2.28.455506 (18f6627e265f442aeec9b6661a49fe819aeeea1f)
今回のコード
今回の記事のコードはこちらにあります github.com