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.sh の aws 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