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

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

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

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



コメント(一覧)

コメント(入力画面)

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