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便利

Comments

comments powered by Disqus