📚

DockerとSeleniumでWEBスクレイピング環境を構築する

2024/10/13に公開

想定読者

  • WEBスクレイピングしたい人
  • Shellチョットワカル
  • Pythonチョットワカル
  • Dockerチョットワカル
  • Seleniumの環境構築にハマっている人

前提

以下セットアップされていること

  • Docker
  • docker compose
  • git

構築方法

  1. ディレクトリとファイルをを用意する
mkdir src
touch src/main.py
mkdir docker
touch docker/requirements.txt
touch docker-compose.yml
  1. Dockerfileを書く
docker/dokerfile
# 軽量なベースイメージを指定
FROM python:3.9-slim

# 環境変数の設定(Pythonのバッファリング無効化)
ENV PYTHONUNBUFFERED=1

# 必要なパッケージをインストール
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    build-essential \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# 作業ディレクトリを設定
WORKDIR /app/src/

# 依存関係ファイルをコピーしてインストール
COPY ./requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# コンテナを終了させずに起動し続ける設定
ENTRYPOINT ["tail", "-f", "/dev/null"]
  1. requirements.txtを書く
docker/requirements.txt
selenium==4.25.0
  1. docker-compose.ymlを書く
docker-compose.yml
version: "3"
services:
  selenium:
    image: selenium/standalone-chrome:129.0
    container_name: selenium
    ports:
      - 4444:4444 # Selenium サーバー
      - 7900:7900 # VNC(Seleniumの挙動を確認するGUI)
    shm_size: "2gb"

  python:
    build: ./docker
    container_name: python-app
    depends_on:
      - selenium
    volumes:
      - ./src:/app/src
    environment:
      - SELENIUM_URL=http://selenium:4444/wd/hub
  1. main.pyを書く
src/main.py
import os
import time
import traceback
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# URL
target_url = 'https://******.com'
 
# Selenium サーバー (Remote WebDriver) の設定
selenium_url = "http://selenium:4444/wd/hub"
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")

# ブラウザを表示するための設定
chrome_options.add_argument("--start-maximized")  # ブラウザを最大化
chrome_options.add_argument("--disable-infobars")  # 情報バーを無効化
chrome_options.add_argument("--disable-extensions")  # 拡張機能を無効化

driver = webdriver.Remote(command_executor=selenium_url, options=chrome_options)

try:
    driver.get(target_url)
    wait = WebDriverWait(driver, 10)
    # 値入力
    hoge_field = wait.until(EC.presence_of_element_located((By.hoge, 'hoge')))
    # ボタンをhogehogeのテキストで探す
    hogehoge_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'hogehoge')]")))

    # ボタンをクリック
    hogehoge_button.click()


except Exception as error:
    error_msg: str = traceback.format_exc()
    print(error_msg)
    # 例外を無視したい場合は、pass を使用する
    pass

finally:
    # ブラウザを閉じる
    driver.quit()
  1. Dockerを起動させて動作確認する
docker-compose up
# http://localhost:7900 ブラウザアクセス「接続」をクリック
# 資格情報(パスワード)を入力(デフォルトではsecret)
docker exec -it python-app /bin/bash
python main.py

以上

Discussion