cronを使って定時にクローリング

どうもおはこんばんにちは。マタキチです。
もうだんだん夜は肌寒い季節になってきましたね。毛布にくるまる温度が心地いい、おでんが美味しい季節ですね。ただね、こうなんていうかね。こう、外に出づらい季節になりつつある気がするよね。もう想像しただけでも2ヶ月後が恐ろしいよね。そんな危機感を抱いた今日この頃。

pythonでスクレイピングを勉強中なので忘備録的な意味で書いていきたいと思います。間違い等ございましたらご指摘お願いいたします。

cronとは

cron(クロンorクーロン)と呼ばれるデーモンプロセス。デーモンプロセスっていうのはLinuxとかmacOSとかいわゆるOSのメモリ上に常駐しているプロセスのことです。デーモンとは悪魔 (demon)ではなく守護神(deamon)を意味します。このcronを使用するとスクレイピングを自動で定期的に実行することができます。Windowsでは「タスク スケジューラー」でも可能かと思いますが今回はcronを使用します。

為替情報を保存する

Webサイトから毎日更新されるデータをスクレイピングして保存するものを作成したいと思います。今回は試しに為替情報でこのプログラムを作成したいと思います。

import urllib.request as req
import datetime
import json

#Webサイトにアクセスする
API = "https://api.aoikujira.com/kaease/get.php?code=USD&format=json"
json_str = req.urlopen(API).read().decode("utf-8")
data = json.loads(json_str)
print("USD = " + data["JPY"])

#保存ファイル名を指定
f = datetime.date.today()
fname = f.strftime("%Y-%m-%d") + ".json"
with open(fname, "w", encoding="utf-8") as f:
    f.write(json_str)

簡単なものですが為替情報サイトからJPYの値をスクレイピングするプログラムです。これをcronを使用して定期的に起動してもらいましょう。

エディタについて

cronを設定するにあたりエディタをインストールする必要があるかもしれません。というのも標準でviというエディタが使用できるます。筆者はそうでもないと思うのですが、人によっては独特で使いづらいかも。その場合は別のエディターをインストールしましょう。atom、nano、サクラエディタなどなど色々あります。筆者はatomを使用しているので(理由はありません)、インストール方法は下記を紹介させていただきます。

Mac - テキストエディタ「Atom」のインストール
https://webkaru.net/dev/mac-atom-install/

ではコンソールから次のコマンドを実行してファイルを見てみましょう。

$atom ~/.bash_profile

するとファイルの中身がatomで見ることができます。

export PATH="$HOME/.rbenv/bin:$PATH"
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
# added by Anaconda3 2019.07 installer
# >>> conda init >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$(CONDA_REPORT_ERRORS=false '/Users/oomoriyuusuke/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
   \eval "$__conda_setup"
else
   if [ -f "/Users/oomoriyuusuke/anaconda3/etc/profile.d/conda.sh" ]; then
       . "/Users/oomoriyuusuke/anaconda3/etc/profile.d/conda.sh"
       CONDA_CHANGEPS1=false conda activate base
   else
       \export PATH="/Users/oomoriyuusuke/anaconda3/bin:$PATH"
   fi
fi
unset __conda_setup
# <<< conda init <<<

あらまぁ。anaconda3やらrbenvの単語がちらほら見えますね。ファイルの中身は人によって違うところがあるので自分の中身をみてみてください。
筆者はrbenvのPATHになってますね。EDITORもこの際登録しちゃいましょうか。ということで下記コマンドを最後に追加。さらにコンソールから設定変更を反映させるコマンド実行。

#~/.bash_profileの最後に追加
export EDITOR=atom


#コンソールから設定変更を反映させる
$source ~/.bash_profile

crontabで設定変更

定時実行を初めて設定する場合は「crontab -e」コマンドで開いたファイルに記述できます。こちらは初めて設定する場合は何も書かれていないのでご注意を。すでに設定したことがある方はさらにご注意。気をつけないと間違えて「crontab -r」としてしまうと今までの記述が消えます。なので実際にやるのはホームディレクトリにでも作業ファイルを作成して、そこに今の設定をコピーして作業することをおすすめします。詳しい方法は今度書かせてください。長くなるので。実際にcrontabに「毎日午前7時に冒頭に作成した為替情報取得プログラム(practice.py)」を起動するよう設定します。

PATH = /usr/local/bin : /usr/local/bin : /bin
PYTHONIOENCODING="utf-8"

0  7
*
*
*  python3 /home/test/practice.py

環境変数を指定してあげることで、パスが通ってなかったりモジュールパスが見つからないなどの問題を解消します。記述方法は以下のようになっています。

分  0から59
時  0から23
日  1から31
月  1から12
曜日 0から7(0または7は日曜日)

crontab
(分)(時)(日)(月)(曜日)実行するコマンドのパス

※cronを実行した時、エラーが出るとメールで通知してくれる設定もあります。これをオフにするには。
MAILTO=""
と冒頭に追記します。

設定を反映させるには、crontabの作業ファイルまたは「crontab -e」で作成したファイル名を使用します。次のコマンドをコンソールで実行します。

$ crontab   ファイル名

反映されているかどうか確認するためにはdiffコマンド等を使用して中身に差異がないか確認します。以上、設定方法でした。

まとめ

cronを利用することで定期的にプログラムを実行できる。スクレイピングと組み合わせると定期的にWebサイトから情報収集することができる。実際にはcrontabに何時に実行するか記述する。ただしcrontab -eコマンドはのちの作業が面倒になるので、作業ディレクトリを作成してそこで作業、終了後diffコマンド等で差異がないことを確認してcrontab  ファイル名で設定反映させる。



この記事が気に入ったらサポートをしてみませんか?