統合開発環境#1(Jupyter×Scrapy×Postgresql)
Python初学者でも requests+beautifulsoupや Seleniumのライブラリは扱いやすいです。それらのライブラリと比べると Scrapyの仕様はやや学習コストが高いです。それでも Scrapyを積極的に採用したいケースは結構あります。
Scrapyを採用するケース
- 2つ以上の階層構造を辿って情報を取得したい(コーディング楽)
- スクレイピング実行時に外部データベースに取得データを格納したい(連携楽)
- 大量のデータをスクレイピング処理したい(速度早)
本記事では、Scrapyの実行環境、スクレイピング結果を保存するデータベース、そして結果を解析するための JupyterLab、この3つを連携させた Docker コンテナの構成をメモしています。
そのため、本記事で扱うスクレイピングするデータは、*構造化データ(RDB)*を想定しています。
非構造化データ(例:テキスト文など)を扱う場合については、別記事にてメモします。
#ディレクトリ構造#
myscrapy
- app # Scrapy側スクリプトを格納するマウント先ディレクトリ(任意の命名)
- db_volumns # データベース関連のマウント先ディレクトリ(任意の命名)
- Mount_Directory # Jupyter側マウント先ディレクトリ(任意の命名)
- .env # 環境変数(PostgreSQL)
- docker-compose.yml # 立ち上げ用($Docker-compose up -d)
- mydocker
# Jupyter側の環境構築
- jupyterlab
- Dockerfile
- requirements.txt
# scrapy側の環境構築
- scrapy
- Dockerfile
- requirements.txt
#Docker-compose.yml#
services:
# ============================== #
# (NO.1) データ解析用(JupyterLab)
# ============================== #
task:
container_name: jupyterlab
ports:
- "8888:8888"
networks:
- scrapy_net
build:
context: ./mydocker/jupyterlab
dockerfile: Dockerfile
volumes:
- ./Mount_Directory:/Mount_Directory
command: jupyter lab --ip=0.0.0.0 --allow-root --NotebookApp.token=''
# ========================================= #
# (NO.2A) PostgreSQL(#公式イメージを利用する)
# ========================================= #
postgresql:
image: postgres:14 # https://tinyurl.com/2b5jbcpc
container_name: postgres
ports:
- "5432:5432"
networks:
- scrapy_net
env_file:
- .env
environment:
TZ: Asia/Tokyo
volumes:
- ./db_volumns/postgre_db:/var/lib/postgresql/data # データ永続化(必須)
- ./Mount_Directory/BackupData:/BackupData # DBバックアップ/リストア操作用
# ====================================== #
# (NO.3) pgadmin4 UI(#公式イメージを利用する)
# ====================================== #
pgadmin:
image: dpage/pgadmin4:9 # https://tinyurl.com/2cu2lgjr
container_name: pgadmin
restart: always
ports:
- "5050:80"
networks:
- scrapy_net
env_file:
- .env
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
TZ: Asia/Tokyo
volumes:
- ./db_volumns/pgadmin_data:/var/lib/pgadmin # 設定情報の永続化
- ./Mount_Directory/BackupData:/var/lib/pgadmin/storage # pgadmin4 UI側からSQLクエリ操作
# ==================================================== #
# (NO.4) Splash(#Javascript対策(#公式イメージを利用する)
# ==================================================== #
splash:
image: scrapinghub/splash:3.5.0 # https://tinyurl.com/22ulalqh
container_name: splash
depends_on:
- postgresql
networks:
- scrapy_net
ports:
- 8050:8050
# ======================================= #
# (NO.5) "WEBスクレイピング"専用('Scrapy')
# ======================================= #
scrapy:
depends_on:
- splash
build:
context: ./mydocker/scrapy
dockerfile: Dockerfile
container_name: scrapy
networks:
- scrapy_net
volumes:
- ./app:/usr/src/app
tty: true
networks:
scrapy_net:
#.env#
# PostgreSQL(任意の文字)
POSTGRES_DB=mydb
POSTGRES_USER=admin
POSTGRES_PASSWORD=password
# pgadmin4 UI(任意の文字)
PGADMIN_DEFAULT_EMAIL=admin@example.com
PGADMIN_DEFAULT_PASSWORD=password
#mydocker/jupyterlab#
Jupyter側、Dockerfileの作成コードは、以前作成した記事と重複するため省略する。
※Jupyter側からPostgresqlデータベースに接続するため、専用ライブラリをインストールすること。
# mydocker/jupyterlab/requirements.txt
psycopg2==2.9.10
#mydocker/scrapy#
Scrapy側のDockerfileは「動的サイト(JS)」への対応によってコーディング手段が異なります。
- 「Splash」と連携する場合
#1 docker-compose.yml:「splash」専用コンテナを構築すること
#2 mydocker/scrapy/requirements.txt:専用ライブラリをインストールする
Scrapy==2.12.0
scrapy-splash==0.10.0
- 「Playwright」を使用する場合
#1 mydocker/Dockerfile
FROM python:3.11-slim
WORKDIR /usr/src/app
RUN apt-get update && apt-get install -yq --no-install-recommends \
unzip \
wget \
# Playwright用の依存パッケージ
libnss3 \
libatk-bridge2.0-0 \
libgtk-3-0 \
libxss1 \
libasound2 \
libgbm1 \
libxshmfence1 \
libatspi2.0-0 \
libdrm2 \
libxcomposite1 \
libxrandr2 \
libu2f-udev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --upgrade pip && \
pip install --no-cache-dir -r ./requirements.txt
# Playwrightのブラウザバイナリをインストール
RUN python -m playwright install --with-deps
#2 mydocker/scrapy/requirements.txt:専用ライブラリをインストールする
Scrapy==2.12.0
playwright==1.52.0
scrapy-playwright==0.0.43
#最終的にコンテナが起動すると#
Scrapyファイルを実行するコンテナ:'docker exec -it scrapy bash' -> :/app# $'scrapy crawl XXX'
- Postgresql管理画面:http://localhost:5050
- データ解析画面:http://localhost:8888
コメント(一覧)