統合開発環境#2(Jupyter×Scrapy×MongoDB)
「#統合開発環境1」記事では、「構造化データ」を扱うための Scrapy環境構築をメモしました。今回は、「非構造化データ」を扱う場合を想定した Scrapy環境構築についてメモしていきます。本記事では、「非構造化データ」に対応するデータベースとして広く利用されている MongoDBを採用しています。
#ディレクトリ構造#
myscrapy
- app # Scrapy側スクリプトを格納するマウント先ディレクトリ(任意の命名)
- db_volumns # データベース関連のマウント先ディレクトリ(任意の命名)
- Mount_Directory # Jupyter側マウント先ディレクトリ(任意の命名)
- .env # 環境変数(※MongoDB※)
- 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.2) MongoDB(#公式イメージを利用する)
# ====================================== #
mongo:
image: mongo:8.0 # https://tinyurl.com/24rqnfez
container_name: mongodb
restart: always
ports:
- "27017:27017"
networks:
- scrapy_net
env_file:
- .env
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
TZ: Asia/Tokyo
volumes:
# - ./db_volumns/mongo_db/data:/data/db # データ永続化(必須1
# - ./db_volumns/mongo_db/configdb:/data/configdb # データ永続化(必須2)
# MongoDBはWSL2で上手く動かない(サポート対象外らしい?ためDocker内部のボリュームを利用する)
- mongodb_data:/data/db # データ永続化(必須1)
- mongodb_config:/data/configdb # データ永続化(必須2)
- ./Mount_Directory/BackupData:/BackupData # DBバックアップ/リストア操作用
# =========================================================== #
# (NO.3) mongo-express(#公式イメージを利用する) {'admin'/'pass'}
# =========================================================== #
mongoui:
image: mongo-express:1.0 # https://tinyurl.com/2ccctgex
container_name: mongo_express
restart: always
depends_on:
- mongo
ports:
- "8081:8081"
networks:
- scrapy_net
env_file:
- .env
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: ${ME_CONFIG_MONGODB_ADMINUSERNAME}
ME_CONFIG_MONGODB_ADMINPASSWORD: ${ME_CONFIG_MONGODB_ADMINPASSWORD}
ME_CONFIG_MONGODB_SERVER: ${ME_CONFIG_MONGODB_SERVER}
ME_CONFIG_MONGODB_AUTH_DATABASE: ${ME_CONFIG_MONGODB_AUTH_DATABASE}
volumes:
- ./db_volumns/mongoui_data:/config # 設定情報の永続化(任意)
# ==================================================== #
# (NO.4) Splash(#Javascript対策(#公式イメージを利用する)
# ==================================================== #
splash:
image: scrapinghub/splash:3.5.0 # https://tinyurl.com/22ulalqh
container_name: splash
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:
# Docker内部のボリュームを使用する(mongodb:wsl2でのエラー回避のため)
volumes:
mongodb_data:
mongodb_config:
#.env#
# MongoDB 側(任意の文字)
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=password
# MongoDB UI 側(任意の文字)
ME_CONFIG_MONGODB_ADMINUSERNAME=admin
ME_CONFIG_MONGODB_ADMINPASSWORD=pass
ME_CONFIG_MONGODB_SERVER=mongo
ME_CONFIG_MONGODB_AUTH_DATABASE=admin
#mydocker/jupyterlab#
Jupyter側、Dockerfileの作成コードは、以前作成した記事と重複するため省略する。
※Jupyter側からMongoDBに接続するため、専用ライブラリをインストールすること。
# mydocker/jupyterlab/requirements.txt
pymongo==4.11
#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'
MongoDB管理画面:http://localhost:8081
データ解析画面:http://localhost:8888
コメント(一覧)