このエントリーをはてなブックマークに追加

Headless ChromeをSeleniumから動かすDockerイメージ

Headless ChromeをSeleniumから動かしたいです。どうせやるならDockerで、と思って作りました。

https://github.com/shirou/selenium-headless-chrome

Docker hubはこちら

https://hub.docker.com/r/shirou/selenium-headless-chrome/

使い方

メインはinit.shです。環境変数で指定したS3_URLから任意のスクリプトをダウンロードし、python3で実行します。

実行するスクリプトはこんな感じです。スクリプトはS3に置くことを想定しています。が、原理的にはどこでもいいので、HTTPSの場合はinit.shaws cpをcurlなどに置き換えてみてください。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division, print_function, absolute_import

import time
import requests

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

FILE_NAME = "/tmp/search_results.png"
SLACK_TOKEN = "<SLACK BOT API TOKEN>"
SLACK_CHANNEL = "example"


def screenshot():
    options = Options()
    options.add_argument('--headless')
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-gpu')
    options.add_argument('--window-size=1920,1280')
    driver = webdriver.Chrome(chrome_options=options)

    driver.get('https://google.co.jp')

    time.sleep(5)

    driver.save_screenshot(FILE_NAME)

    driver.quit()


def upload_slack(path):
    f = {'file': open(path, 'rb')}
    payload = {
        "filename": path,
        "token": SLACK_TOKEN,
        "channels": [SLACK_CHANNEL],
        "title": "screenshot: " + path,
    }
    r = requests.post("https://slack.com/api/files.upload",
                      params=payload, files=f)
    print("slack upload: {}".format(r.text))


if __name__ == '__main__':
    screenshot()
    upload_slack(FILE_NAME)

ECSでの使い方

コンテナで実行できるので、ECSではこのようにS3_URLという環境変数を設定してタスクを実行してあげれば良いわけです。

{
   "environment": [
    {
      "name": "S3_URL",
      "value": "s3://foobar/example.py"
    }
  ],
}

弊社ではECSのスケジュール実行で、任意の時間に画面のスクリーンショットを撮ってSlackに送ったりしています。Seleniumですので、アイデア次第でどんなことも実行可能だと思います。

まとめ

  • Headless ChromeをSeleniumで実行できるDocker Imageを作りました。
  • 環境変数で外部のScriptを指定するだけです。
  • Selenium便利