dockerを使ってスクレイピング環境構築
pythonを実行するコンテナに、自分でchromeやらドライバをインストールしたりするのは面倒なので、
あらかじめchromeがインストールされたdockerイメージを使いたかったので、環境構築メモ。
python実行環境とselenium実行環境を別のコンテナとして準備して使う。
selenium実行環境はdocker-seleniumのChromeがインストールされたstandaloneイメージを使う。
https://github.com/SeleniumHQ/docker-selenium
docker-compose
version: "3"
services:
selenium:
image: selenium/standalone-chrome:4.1.4-20220427
ports:
- 4444:4444
- 7900:7900
volumes:
- /dev/shm:/dev/shm
app:
build: .
ports:
- 8888:8888
volumes:
- .:/app
environment:
SELENIUM_URL: http://selenium:4444/wd/hub
command: jupyter-notebook --port=8888 --ip=0.0.0.0 --allow-root --NotebookApp.token=''
tty: true
seleniumコンテナのportで7900をマッピングしている。VNCクライアントをインストールしてなくても、http://localhost:7900
でGUIが確認できる。
(接続の時に求められるパスワードはデフォルトでsecret
になっている。)
appコンテナ(python実行環境)の環境変数にSELENIUM_URL
を指定。プログラムの中でこれを使うようにする。
command部分はjupyter-notebookを使うためなので、不要な人は不要。
Dockerfile
FROM python:3.8.10
ENV PYTHONIOENCODING utf-8
ENV TZ="Asia/Tokyo"
ENV LANG=C.UTF-8
ENV LANGUAGE=en_US:en_US
WORKDIR /app
COPY ./requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt
インストールするものは、requirements.txtに適当に記述。
requirements.txt
selenium
jupyter
requests
BeautifulSoup4
テスト用のスクリプト
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import os
import time
url = "https://www.google.com"
keyword = "スクレイピング"
driver = webdriver.Remote(
command_executor = os.environ["SELENIUM_URL"],
options = webdriver.ChromeOptions()
)
driver.implicitly_wait(10)
driver.get(url)
driver.find_element(By.NAME, "q").send_keys(keyword + Keys.RETURN)
time.sleep(5)
driver.quit()
webdriver.Remote
でseleniumコンテナを指定している。(ここでdocker-compose.ymlで設定している環境変数を使っている。)
あとは、
ブラウザでhttp://localhost:7900
にアクセスした状態で、プログラムを実行すると、実際に動作している様子が確認できるかと!