第9章 Scrapyのスケジュール
はじめに
ここではScrapyで作ったクローラーを定期的に実行する方法として、cronの設定やScrapingHubの使い方をまとめておきます。
cron
cronはUNIX系のシステムに常駐するデーモンプログラムの1つ。デーモンとは、メインメモリ上に常駐して機能を提供するバックグラウンドプロセスの一種で、あらかじめ指定した時間に処理を実行したりするもの、とのことです。
cronの設定は下記のコマンドから行いますが、jobがない場合、このように表示されます。
$ crontab -l
crontab: no crontab for <user name>そのため、初めてcronを利用する場合は-eで実行します。
$ crontab -ejobの指定方法は、左から「分 時 日 月 曜日 コマンド」となります。曜日は日曜日の0始まりです。下記の設定であれば、23時45分、日、月、曜日はなんでも良いということになるので、毎日23時45分に下記のhello.pyが実行されることになります。ログファイルが必要なければ、>>は不要です。cronのjobの登録方法は他にもあるみたいなので、調べてください。crontab guruで調べるのが簡単かもしれません。
45 23 * * * [Python3のパス] [実行ファイルのパス] >> [実行結果やエラーログのパス] 2>&1python3のフルパスはwhich python3で見つかります。
$ which python3
/Library/Frameworks/Python.framework/Versions/3.8/bin/python3
# hello.pyの中身
import sys
import datetime
print('Python:' + sys.version)
print(datetime.datetime.now())
print('----------')>>はリダイレクトという機能です。ターミナルに出力される「標準出力」をファイルへ出力することをリダイレクトといいます。要するに、「画面出力された文字をファイルに保存する」と考えればわかりやすいのかもしれません。組み合せ次第でいろんな事ができるので下記にまとめておきます。
形式
内容
コマンド > ファイル
コマンドの結果をファイルへ書き込む
コマンド < ファイル
ファイルの中身をコマンドの標準入力へ渡す
コマンド >> ファイル
コマンドの出力結果をファイルへ追加
コマンド 2> ファイル
エラー出力をファイルへ書き込む
コマンド 2>> ファイル
エラー出力をファイルへ追加
コマンド > ファイル 2>&1
標準出力と標準エラー出力をファイルに書き込む
コマンド >> ファイル 2>&1
標準出力と標準エラー出力をファイルに追加
下記のjob(1分ごとに実行)であれば、数分後にはログファイル内に追記しているので、こうなります。
他にもいろんな指定ができるので、下記の通りまとめておきます。
また、特に設定しない限り/var/mail/user nameにログが残り続けるので、下記を書き込んでおきます。
scrapyの場合、scrapy crawl hogeみたいな感じで毎回動かすのはcronではどのように設定すればよいのでしょうか。調べれば出てくるのですが、下記のように書けば定期的に実行できます。
実際にはこのような感じです。クローラーを作ったフォルダに移動し、scrapyへのパスを使って、クローラーを実行するという感じです。
時間になってcronjobが実行されると、出力内容とエクスポートしたjsonが出力されます。
cronでscrapyを定期的に実行する方法は他にも色々あるみたいなので、自分で検索してみてください。
標準入出力
cronの説明でよくわからない言葉がたくさん出てきましたが、ここではcronと関わりが深い標準入出力をまとめておきます。
通常、catコマンドを実行すると、標準入出力のチャネルが開かれます。チャネルは下記の3つがあり、これらをあわせて「標準入出力」と呼びます。
標準入力(stdin):キーボードやファイルなどのプログラムの標準的な入力。
標準出力(stdout):ディスプレイやファイルなどのプログラムの標準的な出力。
標準エラー出力(stderr):プログラムのエラーを出力するための標準的な出力。ディスプレイやファイルなどが使われます。
さきほども登場した標準入出力先を変更する機能が「リダイレクト」です。下記はlsコマンドの標準出力をテキストファイルにリダイレクトしています。リダイレクト先には、空のファイルなどを予め作成する必要はありません。
続いて標準エラー出力を見ていきましょう。下記は標準エラー出力の例です。
これをリダイレクトするとどうなるでしょうか。err.txtは作成されていますが、中身は空で、エラーメッセージが表示されています。エラーメッセージが表示されず、テキストファイルに書き込まれると想定していましたが、そうではありませんでした。
これは、「標準出力」と「標準エラー出力」が別のチャネルで表示が行われているためです。そのため、さきほどの例では下記のように、exec-error.logに標準出力と標準エラー出力を追加するようにリダイレクト設定をしているということになります。
Scraping Hub

ここからScrapyの開発元でもあるScrapinghub Ltd.が提供するScrapingHubでクローラーを定期実行する方法をまとめておきます。ScrapingHubにデプロイする用のクローラーを作ります。無料枠であれば1つのクローラーを登録して実行できます。対象サイトは何度も登場している偉人の名言サイトです。
scrapinghub_quotes_spider.pyの中身はこちらです。
アカウントを作成し、ScrapingHubにログインして、右上のCREATE PROJECTからプロジェクトを作成します。ここでは、プロジェクト名はquotesにします。

プロジェクトを作成すると、コードをデプロイする方法が表示されます。ここではコマンドラインから支持に従って、デプロイします。
デプロイが完了すると、下記のように表示がかわります。これでデプロイは完了です。

画面左端のjobからDashboardをクリックし、右上のRunを押すとポップアップが表示されるので、さきほどデプロイしたクローラーの名前を指定します。Runをクリックするとスクレイピングが実行されます。

Running jobにステータスが表示され、クローラーが走り終えると、Complete Jobに情報が移ります。ここでは100件の名言が取得され、リクエストはrobots.txtとページが10枚の合計11枚でエラーはなし、など情報が表示されます。

Itemsの100をクリックすると、下記のようにスクレイピングしたアイテムの情報一覧のページに移ります。その画面の右上のExportからはcsv、json、json Lines、XMLなどからエクスポートできます。その他にも、RequestsページであればHTTPリクエストの一覧がみれますし、LogやStatでは、通常ターミナルに出力される内容が表示されています。

これでクローラーを走らせる方法はわかったので、定期的に実行できるように、設定していきます。画面左端のDashboardの下にPeriodic Jobsがあるので、これをクリックします。そして、遷移先のページの右端の緑ボタンAdd Periodic Jobをクリックし、スケジュール設定を行い、SAVEボタンで保存します。これでスケジュール設定は完了です。

最終更新
役に立ちましたか?