🐨
【Github Actions / Docker / Selenium】ブラウザ操作の自動化
はじめに
現在、大学でデータサイエンスを学んでいる大学生です。毎日行うポイントサイトにアクセスやデータ取得などの作業を自動化していきたいと思います。
ディレクトリ構造
.
├── .github
│ └── workflows
│ └── github-actions.yml
├── src
│ └── main.py
├── docker
│ └── docker-compose.yml
├── requirements.txt
└── Dockerfile
Dockerfile
Github actionsで実行する際に毎回インストールされるgoogle chromeとchromedriverのバージョンが違うとエラーが発生するので、バージョンは指定しました。
Dockerfile
FROM python:3.9.16-bullseye
# Google Chrome & ChromeDriverのインストール
RUN apt-get update -yqq \
&& apt-get install -yqq \
wget \
gnupg \
&& wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \
&& apt-get update -yqq \
&& CHROME_LATEST_VERSION=$(curl -sS "omahaproxy.appspot.com/linux?channel=stable") \
&& apt-get install -yqq google-chrome-stable=$CHROME_LATEST_VERSION-1 \
&& rm /etc/apt/sources.list.d/google-chrome.list \
&& rm -rf /var/lib/apt/lists/* \
&& CHROME_LATEST_MAJOR_VERSION=$(echo $CHROME_LATEST_VERSION | cut -d . -f 1) \
&& CHROME_DRIVER_VERSION=$(curl -sS "chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_LATEST_MAJOR_VERSION}") \
&& wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip \
&& unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ \
&& rm /tmp/chromedriver.zip
# Pythonの依存関係のインストール
WORKDIR /usr/src
COPY requirements.txt ./
RUN pip install --upgrade pip && pip install --no-cache-dir -r ./requirements.txt
ローカルで動作確認用のDockerfile
Dockerfile.local
FROM python:3.9.16-bullseye
ENV PYTHONIOENCODING utf-8
WORKDIR /usr/src
COPY requirements.txt ./
RUN pip install --upgrade pip && pip install --no-cache-dir -r ./requirements.txt
COPY ./src ./
docker-compose.yml
docker-compose.yml
version: "3"
services:
app:
container_name: app
build:
context: ..
dockerfile: Dockerfile
volumes:
- ../src:/usr/src
tty: true
ローカルで動作確認用のdocker-compose.yml
docker-compose-local.yml
version: '3'
services:
selenium:
container_name: selenium-chrome
image: seleniarm/standalone-chromium:4.1.4-20220429
ports:
- 4444:4444
- 5900:5900
shm_size: "2gb"
app:
depends_on:
- selenium
container_name: app
build:
context: ..
dockerfile: Dockerfile.local
env_file:
- ../src/.env
volumes:
- ../src:/usr/src
tty: true
-
image: seleniarm/standalone-chromium:4.1.4-20220429
GUI環境でseleniumを実行できるイメージです。5900番ポートにアクセスすると確認できます。M1、M2以外の方はselenium/standalone-chrome-debug:3.141.59-20210929
でokです。
requirements.txt
必要なライブラリをインストールします。
selenium==4.8.3
main.py
今回はこちらのスクレイピングの練習サイトに遷移するだけの簡単なプログラムを作成します。
main.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
driver = webdriver.Chrome("/usr/local/bin/chromedriver", options=options)
driver.get("https://books.toscrape.com/")
time.sleep(3)
driver.close()
driver.quit()
github-actions.yml
github-actions.yml
name: Run python script
on:
schedule:
- cron: "0 0 * * *"
workflow_dispatch:
jobs:
run-python-script:
runs-on: ubuntu-20.04
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Run main
run: |
docker-compose -f docker/docker-compose.yml up -d --build
docker exec app python main.py
- name: Slack Notification
uses: rtCamp/action-slack-notify@v2
if: ${{ success() }}
env:
SLACK_USERNAME: Bot
SLACK_TITLE: Success
SLACK_COLOR: ${{ job.status }}
SLACK_MESSAGE: 成功しました🚀
SLACK_ICON: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
-
schedule
cronで特定の時間に実行します。 -
workflow_dispatch
ワークフローの動作を手動で実行できるようになります。 -
uses: actions/checkout@v2
デフォルトブランチに移動します。 -
uses: rtCamp/action-slack-notify@v2
実行結果をslackに通知します。
slack通知手順
- Slack App を作成して、Incoming Webhook URL を発行
- 1で発行した URL をリポジトリの secrets に登録
動作確認
- 実行結果
さいごに
今回はブラウザ操作の自動化を作成してみました。日々行う操作を自動化できたら便利ですよね、、もっとこうしたらいいよ〜、とか、こっちの方がおすすめだよ〜、とかあれば教えていただけると幸いです。
Discussion