Python × Selenium × Cron をMac環境で定期実行させる

プログラミング

Macでブラウザの自動処理をPython×Seleniumで実施しているのですが、これを日次で実行する形にしています。

PythonのScheduleライブラリを使って実施をしてもいいのですが、Macがスリープになると動かない&サーバ上で実行するにはcsv加工など入るので処理を変えるのが面倒というのがありました。

いろいろ調べた結果、Macのスリープ&再起動をスケジュール設定できるみたいなので、それとcrontabを組み合わせて実行する形にしてみました。

全体的にこちらの記事を参考に設定を進めました。

Python + Selenium + Cron で Chrome の自動操作を定期的に行う - Qiita
日々行う単純作業を自動で行いたくなったので色々調べた。MacOSではcronではなくてlaunchdを使うことが推薦されているらしいが、なぜかうまく行かなかったので今回は慣れているcronで定期実…

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の設定はこちらの記事を参考にしました。

cronの日時指定を、基礎から学ぶ(分,時,日,月,曜日の指定、◯分ごと、月末起動、など) - YoheiM .NET
cronの日時指定を、基礎から学ぶ(分,時,日,月,曜日の指定、◯分ごと、月末起動、など)今日は、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

https://programming-beginner-zeroichi.jp/articles/265

(追記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
Pythonでseleniumをcronで動かすとchromedriverでエラーになる
### 前提・実現したいこと PythoでseleniumをCentOS8でcronで動かしたいのですが、 chromedriverでエラーになってしまいます。 CentoOSでコマンドを打

ここまで設定したらようやく設定完了!

mailでログ見てもちゃんと毎日01:00に実行できていることがわかります。

まとめ

今回はPython×seleniumをcronを使って自動定期実行してみましたが、サーバに上げるまでもないファイルや、パソコン上でささっと終わらせる作業などはこの方法で実装するのが早そうです。

APIやSQLなどを扱う場合はクラウドサーバ上で実行して、簡単なseleniumやクローラーはPC上で実行など上手く使い分けて効率化アップを目指します。

タイトルとURLをコピーしました