🐶
【Scrapy+PostgreSQL】Dockerで環境構築
はじめに
現在、大学でデータサイエンスを学んでいる大学生です。今回はスクレイピングする際に使用する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
ファイルを実行します。
- コンテナ起動時にDBファイルが存在しない場合
init.sql
今回は簡易的にコンテナ起動時にinit.sql
が実行されてテーブルが作成されるか確認します。
CREATE TABLE IF NOT EXISTS test (
id integer,
name varchar(30)
);
Dockerfile
app
ディレクトリ配下をマウントしてコンテナからソースコードを参照出来るようにします。
FROM 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名
、ユーザ名
、パスワード
、ポート番号
を入力します。
- テーブルの確認
- docker-compose.ymlで指定した
さいごに
今回はScrapy+PostgreSQLの環境をDockerを使用して作成してみました。備忘録も兼ねて書いてるため、もっとこうしたらいいよ〜、とか、こっちの方がおすすめだよ〜、とかあればコメントいただけると幸いです。
Discussion