Dockerを利用したGerapyとScrapydの構築・設定ガイド

はじめに

複数のScrapyプロジェクトを効率的に管理・監視するための手法として、GerapyとScrapydの組み合わせが有力です。本記事では、これらのツールをDockerコンテナとして導入し、クローリングタスクをスケジューリング・実行するための環境構築と設定手順を詳述します。(注意:本番環境での公開はセキュリティ上推奨されません)

ステップ1:Dockerコンテナのデプロイ

まず、ScrapydとGerapyの2つのコンテナをホストマシン上で起動します。

Scrapydコンテナの起動

Scrapyプロジェクトを実行するためのサービスであるScrapydをデプロイします。

# Scrapydの最新版イメージを取得
docker pull germey/scrapyd:latest

# コンテナをバックグラウンドで起動(ポート6800をマッピング)
docker run -d --name my-scrapyd -p 6800:6800 -e TZ="Asia/Tokyo" germey/scrapyd:latest

Gerapyコンテナの起動

次に、プロジェクト管理とタスクスケジューリングを行うGerapyをデプロイします。ホスト側にデータ永続化用のディレクトリを作成し、コンテナにマウントします。

# Gerapyのイメージを取得(最新版を利用)
docker pull germey/gerapy

# データ永続化用のディレクトリをホストに作成
mkdir -p /srv/gerapy/workspace/projects
mkdir -p /srv/gerapy/workspace/logs
mkdir -p /srv/gerapy/workspace/dbs

# コンテナを起動し、ボリュームとポートをマッピング
docker run -d --name my-gerapy -p 8000:8000 \
  -v /srv/gerapy/workspace/projects:/app/projects \
  -v /srv/gerapy/workspace/logs:/app/logs \
  -v /srv/gerapy/workspace/dbs:/app/dbs \
  -e TZ="Asia/Tokyo" germey/gerapy

この状態で、ブラウザから `http://<ホストIP>:8000` にアクセスするとGerapyの管理画面、`http://<ホストIP>:6800` にアクセスするとScrapydの画面が表示されます。

ステップ2:Gerapyの初期設定とプロジェクトデプロイ

ホストの登録

GerapyのWebインターフェースにデフォルトアカウント(admin/admin)でログインします。サイドメニューの「ホスト管理」から、先ほど起動したScrapydサービスを登録します。名前は任意で、IPアドレスはScrapydコンテナのホストIP、ポートは6800を指定します。

Scrapyプロジェクトのアップロードと設定

既存のScrapyプロジェクトをzipアーカイブに圧縮し、「プロジェクト管理」画面からアップロードします。

アップロード後、「編集」をクリックしてプロジェクト内のファイルを修正する必要があります。

1. scrapy.cfgの修正
デプロイ先Scrapydを明示的に指定するため、`[deploy]`セクションを調整し、`[scrapyd]`セクションを追加・修正します。

# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.io/en/latest/deploy.html

[settings]
default = MyProject.settings

[deploy:MyProject]
url = http://<ホストIP>:6800/
project = MyProject

[scrapyd]
maxproc = 10
encoding = utf-8

2. Spiderクラスの修正
Gerapyからタスクを実行する際に引数エラーが発生しないよう、Spiderの`__init__`メソッドを以下のように変更します。`_job`という引数はScrapydが内部的に使用するため、これを除外する処理が必須です。

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'

    def __init__(self, **kwargs):
        # Gerapyとの連携で必須となる修正点
        if '_job' in kwargs:
            kwargs.pop('_job')
        super().__init__(**kwargs)

    # ... start_requests, parse等のメソッド ...

修正が完了したら、プロジェクト画面に戻り「デプロイ」ボタンをクリックして、まず「パッケージ化」を実行し、続けて「デプロイ」を実行します。

ステップ3:タスクの実行とエラーハンドリング

「タスク管理」画面でデプロイしたプロジェクトとSpiderを選択し、タスクを作成・実行します。

実行時に、Pythonの依存ライブラリ(例: `itemadapter`)が不足しているとエラーが発生します。その場合は、Scrapydコンテナ内に直接ライブラリをインストールします。

# Scrapydコンテナのシェルに入る
docker exec -it my-scrapyd bash

# 不足しているライブラリをインストール
pip install itemadapter==0.7.0

# コンテナから抜ける
exit

ライブラリをインストール後、再度タスクを実行します。ScrapydのWebUI (`http://<ホストIP>:6800`) のJobsセクションでタスクのステータスと実行ログを確認でき、データが正常に収集されていることを確認できます。

補足:管理者パスワードの変更

Gerapyのデフォルトパスワードはセキュリティ上変更が推奨されます。パスワードはGerapyコンテナ内のPythonスクリプトを直接編集することで変更可能です。

# Gerapyコンテナのシェルに入る
docker exec -it my-gerapy bash

# パスワード定義ファイルをsedコマンドで直接書き換える
sed -i 's/password = "admin"/password = "your-secure-password"/' /usr/local/lib/python3.10/site-packages/gerapy/cmd/initadmin.py

# Gerapyコンテナを再起動して設定を反映
docker restart my-gerapy

7月15日 19:45 投稿