統合開発環境#2(スクレイピ&分析)

<タイトル> 統合開発環境#2(スクレイピ&分析)

2025年06月16日 2025年07月06日 カテゴリ: 環境構築

統合開発環境#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



コメント(一覧)

コメント(入力画面)

空港MAP(#WIKI)
※現在の時刻 週間天気予報 (東京)
バックナンバー(年別)