🐨

【Github Actions / Docker / Selenium】ブラウザ操作の自動化

2023/04/20に公開

はじめに

現在、大学でデータサイエンスを学んでいる大学生です。毎日行うポイントサイトにアクセスやデータ取得などの作業を自動化していきたいと思います。

ディレクトリ構造

.
├── .github
│   └── workflows
│       └── github-actions.yml
├── src
│   └── main.py
├── docker
│   └── docker-compose.yml
├── requirements.txt
└── Dockerfile

Dockerfile

Github actionsで実行する際に毎回インストールされるgoogle chromeとchromedriverのバージョンが違うとエラーが発生するので、バージョンは指定しました。

Dockerfile
FROM --platform=linux/amd64 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 --platform=linux/x86_64 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に通知します。

https://github.com/rtCamp/action-slack-notify

slack通知手順

  1. Slack App を作成して、Incoming Webhook URL を発行

https://api.slack.com/messaging/webhooks

  1. 1で発行した URL をリポジトリの secrets に登録

https://docs.github.com/ja/actions/security-guides/encrypted-secrets

動作確認

  • 実行結果

さいごに

今回はブラウザ操作の自動化を作成してみました。日々行う操作を自動化できたら便利ですよね、、もっとこうしたらいいよ〜、とか、こっちの方がおすすめだよ〜、とかあれば教えていただけると幸いです。

Discussion