最近PythonのScrapyを使ったスクレイピングについて勉強しているのですが、その延長でScrapydも扱っています。
わからないことの方が多いので動かしながら理解に努めているという感じなのですが、ScrapydのJobの保存先について疑問に思いましたので調べてみました。
なお、ScrapyとScrapydは名前が似ていて紛らわしいのでご注意ください。
ローカルにdbファイルが生成される
Scrapydを動かすと、Scrapydを起動したディレクトリ内にデータベースのファイルが作られるようです。
dbsディレクトリが作られ、さらにその中に作られるdefault.dbという名前のファイルがおそらくデータベースのファイルです。
また、dbsディレクトリの中にはScrapyのJobをデプロイしたデータもdbファイルで保存されるようです。
どこに何がどう保存される、ということが詳しく説明されているドキュメントを見つけられていませんが、以下のScrapydの設定に関するドキュメントにチラホラ書かれています。
これらのデータベースのファイルはSqliteのファイルで、default.dbにはJobのキューが保存されるようです。
Jobはメモリに保存される?
ドキュメントの設定項目を見ていると、Jobの保存先について言及されていました。
jobstorage
A class that stores finished jobs. There are 2 implementations provided:scrapyd.jobstorage.MemoryJobStorage
(default) jobs are stored in memory and lost when the daemon is restartedscrapyd.jobstorage.SqliteJobStorage
jobs are persisted in a Sqlite database in dbs_dirIf another backend is needed, one can implement its own class by implementing the IJobStorage interface.
完了したJobの保存先は2通り用意されていて、デフォルトではメモリに保存されデーモンの再起動で失われる、もうひとつはdbs_dir(dbsディレクトリ)に保存されるそうです。(メモリっていうのはおそらくRAMのことだと思います。コードを追えばわかるかも。)
ということは、Jobのデータが消えてほしくなければこの設定を変更しないといけませんね。
そして、逆に言えばメモリに保存されるということは、明示的にJobの情報を消さないとRAMを圧迫してしまうのでしょうか?メモリの容量をチェックしながらScrapydを動かすような検証をしていませんのでわかっていませんが、注意が必要だと考えています。
Sqlite以外のデータベースに保存できない?
完了したJob情報の保存先がローカルのSqliteになっているそうですが、この保存先をデータベースにできないか疑問に思いました。Sqliteもデータベースではありますが、他のMySQLなどのデータベースシステムを保存先にできないか、ということです。
おそらく以下のstack overflowの質問も自分と同じ疑問なんじゃないかと思います。
この疑問について、例えばMySQLに保存する方法等調べてみましたが、見つけられませんでした。
stack overflowでも回答されているように、ScrapyのJobの中でDBに保存したらいいんじゃないかということだと思います。例えばDjangoとScrapyを接続して使う場合には、Djangoで管理しているDBに保存すると良いということなのかもしれません。
そもそも完了したJobの情報は必要なのかどうかということも考えるべきかもしれません。このあたりの運用に関わる経験や知識は全然ありませんので、これから調べつつ進める予定です。
また、先程のドキュメントのjobstorageの項目に、「独自のバックエンドが必要ならIJobStorageインターフェースを実装したら独自のクラスを実装できる」ということが書かれていました。これが言わんとしていることは、Sqlite以外に保存する仕組みは自分で拡張して作れ、ということでしょうか。拡張するまでのことは今のところハードルが高くて手がでません。。。
まずは現状のScrapydの動作を確認しながら、Job情報の管理方法を検討する予定です。
コメント