modalsoul’s blog

これは“失敗”と呼べるかもしれないが、ぼくは“学習体験”と呼びたい

Seleniumスクリプトをdocker上のHeadless Chromeで動かす

Seleniumを使った時間のかかるPythonスクリプトがあり、こいつを動かすとフォーカス取られて仕事にならないので、docker化し、ヘッドレス環境で実行するようにした

Dockerfile

ChromeDriverとSeleniumをインストール

FROM python:3.6-alpine3.7
ENV APP_ROOT=${APP_ROOT:-/opt/app}

# update apk repo
RUN echo "http://dl-4.alpinelinux.org/alpine/v3.7/main" >> /etc/apk/repositories && \
    echo "http://dl-4.alpinelinux.org/alpine/v3.7/community" >> /etc/apk/repositories

# install chromedriver
RUN apk update
RUN apk add chromium chromium-chromedriver

# install selenium
RUN pip install selenium

WORKDIR $APP_ROOT/scripting

Makefile

DOCKER=docker

scripting:
    $(DOCKER) build -t scripting -f Dockerfile .

イメージをビルドする

make scripting

docker-compose.yml

version: '2'
services:
  script:
    image: scripting
    volumes:
      - .:/opt/payjp/scripting:rw

script.py

ヘッドレス環境で実行するテスト用スクリプト

from selenium import webdriver

URL = 'https://www.google.co.jp/'

def main():  
  options = webdriver.ChromeOptions()
  options.add_argument('--headless')
  options.add_argument('--no-sandbox')
  
  driver = webdriver.Chrome(chrome_options=options)
  
  driver.get(URL)
  print(driver.title)
  
  driver.close()
  driver.quit()

main()

--headlessオプションでヘッドレスモード

--no-sandboxオプションについては↓を参照 github.com

実行

> docker-compose run scripting python3 script.py
Google

動いた

日本語

日本語を表示するためにフォントを入れます

FROM python:3.6-alpine3.7
ENV APP_ROOT=${APP_ROOT:-/opt/app}

# update apk repo
RUN echo "http://dl-4.alpinelinux.org/alpine/v3.7/main" >> /etc/apk/repositories && \
    echo "http://dl-4.alpinelinux.org/alpine/v3.7/community" >> /etc/apk/repositories

# install chromedriver
RUN apk update
RUN apk add chromium chromium-chromedriver
RUN apk add ttf-freefont

# install selenium
RUN pip install selenium

# install font
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

WORKDIR $APP_ROOT/scraping