Scrapydというクローラー管理APIを使って制御するメモです。クローラーをバッググラウンドで動かしたい場合、cronにコマンドを登録して定期実行というのがお手軽な方法ですが、他のアプリケーションからスパイダーを起動させたり、重複起動しないように制御したい場合はちょっと大変です。Scrapydを使えば、手製のアプリケーションからAPIを叩いてリアルタイムにクローラーを走らせる事も可能だし、複数あるクローラーのスケジューリングもScrapydがやってくれるので便利です。1.2.0」という環境でクローラーをデーモン化するまでをやってみます。いうPythonモジュールをインストールします。scrapyd-clientScrapydの設定ファイルはLinuxの場合、下記の順番でファイルを探すらしいです。/etc/scrapyd/scrapyd.conf/etc/scrapyd/conf.d/*./scrapyd.conf~/.scrapyd.conf今回はScrapyのプロジェクトディレクトリ内にScrapyd用のディレクトリを作成しそこで管理する事にしました。無制限にクローラーを同時実行してしまうので、サーバスペックと相談していくつ同時に動かすかを設定する。Litenしますが、設定ファイルを読み込まないで起動させるとdbsディレクトリとかをカレントディレクトリに勝手に作るので注意。読み込んで起動します。scrapy.cfgの設定変更プロジェクトディレクトリ内にあるscrapy.cfgにある[deploy]の項目を設定変更します。ScrapyProjectこれでScrapydと連携できるようになります。Scrapydのサービス登録と起動ScrapydのデーモンはCentOS7のsystemdで管理します。あるディレクトリ、ExecStartにはpython3とscrapydのパスを書きますがここは適時変更する事。ここまで書いたらサービス登録してScrapydをバッググラウンドで起動させる。scrapydpsしてプロセスがいたら成功です。/usr/local/pyenv/versions/3.7.2/bin/scrapyd一応、停止と再起動はこのように。scrapydScrapydの管理画面にアクセスするScrapydは簡単な管理画面を持っていて、各クローラーのステータスや動作ログが確認できます。管理画面にアクセスできます。コマンドでスパイダーをデプロイします。コマンドを使ってAPIにジョブを登録します。"c2624744465f11e9ae3b9ca3ba021a29"}上記で登録したプロジェクト名、スパイダー名と違いますが、登録後はScrapydの管理画面にこのように表示されます。空いていれば登録したジョブは即座に実行されて、他のジョブを実行中の場合は後に登録したクローラーは待機します。後はcronとかでAPIにジョブを定期的に登録してあげればScrapydがよしなにクローラーを実行してくれます。設定も大事だと思いますが、設定を変えても何処に効いているのかがイマイチわかりませんでした。何はともあれクローラーの多重起動をこれで制御できるようになったのでScrapyがますます便利になりました。Scrapyd利用時のエラー集Scrapydを動かした時に発生したエラーをここにまとめておきます。ジョブを識別できるIDが渡されるようです。lost.ScrapydのAPIからRunning中のクローラーのキャンセルリクエストを送ると、少し待ってログにこのエラーが出てクローラーがハングする。job=5915184246c911e996c69ca3ba021a29正確にはクローラーは異常終了して、クローラーが呼び出したSeleniumのプロセスだったり、Scrapyd側のジョブステータスはその状態で止まりゾンビ化します。クローラーがまだPendingであれば問題なくキャンセルできるので、もしかするとRunning中のクローラーへ使うものでは無い?Seleniumとか他のプロセスが原因で、Scrapydからのクローズ処理が正常に走らないのかも知れない。(引き続き調べる)とりあえずScrapydをrestartすればゾンビも消えて元には戻る。