🐶

【Scrapy+PostgreSQL】Dockerで環境構築

2023/04/11に公開

はじめに

現在、大学でデータサイエンスを学んでいる大学生です。今回はスクレイピングする際に使用するScrapyとPostgreSQLの環境をDockerを使用して作成していきたいと思います。

ディレクトリ構造

.
└── crawler
    ├── app
    │   ├── src          // コードの格納
    │   └── .env
    ├── docker
    │   ├── db          
    │   │   ├── init     // コンテナ作成時に初期データを登録するスクリプトを格納する
    │   │   │   └── init.sql
    │   │   └── data     // データを永続化しておくためのディレクトリ
    │   └── docker-compose.yml
    ├── requirements.txt
    └── Dockerfile

.env

POSTGRES_HOST=my_postgresql
POSTGRES_DB=app
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_PORT=5432
POSTGRES_DOCKER_PORT=5433
  • 環境変数
    • POSTGRES_HOST
      scrapyコンテナから取得したデータをpostgresコンテナに送ります。今回はdocker-compose.ymlのdbのコンテナ名をmy_postgresqlに指定しました。
    • POSTGRES_DB
      データベース名
    • POSTGRES_USER
      ユーザー名
    • POSTGRES_PASSWORD
      パスワード
    • POSTGRES_PORT
      内部ポート
    • POSTGRES_DOCKER_PORT
      ローカルのpostgresqlと衝突を避けるために外部ポートを設定しました。

docker-compose.yml

version: "3"
services:
  db:
    image: postgres:14-alpine
    container_name: my_postgresql
    ports:
      - "${POSTGRES_DOCKER_PORT:-5432}:5432"
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      TZ: "Asia/Tokyo"
    env_file:
      - ../app/.env
    volumes:
      - ./db/data:/var/lib/postgresql/data
      - ./db/init:/docker-entrypoint-initdb.d
  scrapy:
      depends_on:
        - db
      build:
        context: ..
        dockerfile: Dockerfile
      image: scrapy:2.6.1
      container_name: my_scrapy
      volumes:
        - ../app:/usr/src/app
      tty: true
  • "${POSTGRES_DOCKER_PORT:-5432}:5432"
    • 環境変数で指定したPOSTGRES_DOCKER_PORTが存在すればそのポート番号を使用して、存在しなければ5432を使用します。
  • ./db/data:/var/lib/postgresql/data
    • データの永続化をします。
  • ./db/init:/docker-entrypoint-initdb.d
    • コンテナ起動時にDBファイルが存在しない場合initディレクトリに存在するinit.sqlファイルを実行します。

init.sql

今回は簡易的にコンテナ起動時にinit.sqlが実行されてテーブルが作成されるか確認します。

CREATE TABLE IF NOT EXISTS test (
    id integer,
    name varchar(30)
);

Dockerfile

appディレクトリ配下をマウントしてコンテナからソースコードを参照出来るようにします。

FROM --platform=linux/x86_64 python:3.9.16-bullseye

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --upgrade pip && pip install --no-cache-dir -r ./requirements.txt

COPY ./app ./

requirements.txt

スクレイピングに必要なライブラリをインストールします。

scrapy==2.6.1
python-dotenv==0.19.2
sqlalchemy==1.4.43
psycopg2== 2.9.3
psycopg2-binary==2.9.5

動作確認

docker-compose.ymlが格納されているディレクトリで以下のコマンドを実行します。

docker-compose --env-file ../app/.env up -d --build
  • DBクライアントツールで確認
    • docker-compose.ymlで指定したDB名ユーザ名パスワードポート番号を入力します。
    • テーブルの確認

さいごに

今回はScrapy+PostgreSQLの環境をDockerを使用して作成してみました。備忘録も兼ねて書いてるため、もっとこうしたらいいよ〜、とか、こっちの方がおすすめだよ〜、とかあればコメントいただけると幸いです。

Discussion