Macでブラウザの自動処理をPython×Seleniumで実施しているのですが、これを日次で実行する形にしています。
PythonのScheduleライブラリを使って実施をしてもいいのですが、Macがスリープになると動かない&サーバ上で実行するにはcsv加工など入るので処理を変えるのが面倒というのがありました。
いろいろ調べた結果、Macのスリープ&再起動をスケジュール設定できるみたいなので、それとcrontabを組み合わせて実行する形にしてみました。
全体的にこちらの記事を参考に設定を進めました。
Macのスリープ&再起動設定
Macの「システム環境設定>省エネルギー>スケジュール」で下記のように設定。
プログラムを01:00に動かす予定なのでその5分前に起動、10分もかからず終わるのですが念のため30分後にスリープで設定。
(追記:2021/05/04)
「macOS Big Sur」にアップデートすると「省エネルギー」という項目が「バッテリー」という名称に変わっているようです。
どうやら設定はそのまま引き継がれるようですが、どこにあるか探してしまったのでメモ。
crontabの設定
コンソールで「crontab -e」を実行。
crontab -e
0 1 * * * python3 /Users/xxx/hogehoge.py
vimで毎日01:00実行と記載。pythonファイルは相対パスだとcronは実行してくれないみたいなので、絶対パスで記載。
設定を確認する際は「crontab -l」で確認ができます。
cronの設定はこちらの記事を参考にしました。
Catalinaにアップデート以降は「システム環境設定>セキュリティとプライバシー>フルディスクアクセス」でファイルの追加が必要みたいなのでこちらも対応。
ファイル選択のダイヤログで [command] + [shift] + [G]を押して、下記のファイルを追加
/usr/sbin/cron
これでPython×Selenium×cronの設定が完了です!お疲れさまでした。
あとは明日きちんと動いていたかを確認していきます。
(追記)
次の日にコンソール見てみたら上手くいかなかったので原因調査。
- スリープからの起動がうまくいかなかった
- crontabが上手く動かなかった
上記の2つが考えられますが、スリープ&再起動は設定変更して見てみたところ問題がなかったのでcronに問題がありそう。
cronのログを「mail」コマンドで見てみると、実行はされていてseleniumモジュールが見つかっていないみたい。
AdminnoMacBook-puro:/ work$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/mail/work": 8 messages 8 new
>N 1 work@AdminnoMacBook- Tue Mar 23 01:00 21/884 "Cron <work@AdminnoMac"
? 1
From work@AdminnoMacBook-puro.local Tue Mar 23 01:00:01 2021
X-Original-To: work
Delivered-To: work@AdminnoMacBook-puro.local
From: work@AdminnoMacBook-puro.local (Cron Daemon)
To: work@AdminnoMacBook-puro.local
Subject: Cron <work@AdminnoMacBook-puro> python3 /Users/xxx/hogehoge.py
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=work>
X-Cron-Env: <USER=work>
Date: Tue, 23 Mar 2021 01:00:00 +0900 (JST)
Traceback (most recent call last):
File "/Users/xxx/hogehoge.py", line 2, in <module>
from selenium import webdriver
ModuleNotFoundError: No module named 'selenium'
? x # xでmailを離脱
You have mail in /var/mail/work
調べてみるとどうやらcron設定時はフルパスで記載をする必要があるようなので、python実行部分をフルパスに書き換えて、cronを再設定。
crontab -e
0 1 * * * /usr/local/bin/python3 /Users/work/Desktop/tmp/robotpayment.py
(追記2)
またもやパスが通っていないというエラー。
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
どうやら環境設定が間違っていると思われるので修正。echoでPATHを調べて、それをcrontabの中に記載をしました。
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
crontab -e
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
0 1 * * * /usr/local/bin/python3 /Users/work/Desktop/tmp/robotpayment.py
ここまで設定したらようやく設定完了!
mailでログ見てもちゃんと毎日01:00に実行できていることがわかります。
まとめ
今回はPython×seleniumをcronを使って自動定期実行してみましたが、サーバに上げるまでもないファイルや、パソコン上でささっと終わらせる作業などはこの方法で実装するのが早そうです。
APIやSQLなどを扱う場合はクラウドサーバ上で実行して、簡単なseleniumやクローラーはPC上で実行など上手く使い分けて効率化アップを目指します。