📚
DockerとSeleniumでWEBスクレイピング環境を構築する
想定読者
- WEBスクレイピングしたい人
- Shellチョットワカル
- Pythonチョットワカル
- Dockerチョットワカル
- Seleniumの環境構築にハマっている人
前提
以下セットアップされていること
- Docker
- docker compose
- git
構築方法
- ディレクトリとファイルをを用意する
mkdir src
touch src/main.py
mkdir docker
touch docker/requirements.txt
touch docker-compose.yml
- 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"]
- requirements.txtを書く
docker/requirements.txt
selenium==4.25.0
- 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
- 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()
- Dockerを起動させて動作確認する
docker-compose up
# http://localhost:7900 ブラウザアクセス「接続」をクリック
# 資格情報(パスワード)を入力(デフォルトではsecret)
docker exec -it python-app /bin/bash
python main.py
以上
Discussion