Rasberry Pi4を用いてPythonのウェブスクレイピングを定期的に行いたかったので、Rasberry Pi4のcronでpython fileを実行 するための手順を備忘録として以下に示します。
Rasberry Piのcronでpython fileを実行
まずはcronによりpythonを実行して’hello cron’と表示させるようにします。
なおRaspberry PiでPythonを使用するには「Thonny Python IDE」を使用します。
Pythonについては以下の記事で広く学習方法などをまとめているので興味がある人は参照してみてください。
「Thonny Python IDE」が起動したらpythonのコードを以下のように記述し’hello-cron.py’と名前をつけて「デスクトップ」に保存します。
1 |
print('hello cron') |
ラズパイの画面左上側に表示されている、LXLXTerminalをクリックしターミナルを起動し、cronを実行するためにターミナルに「crontab -e」と入力しEnterで設定を行います。するとvim/viが立ち上がるので以下のコマンドの通り操作を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# cronの編集 crontab -e # 入力の保存方法 ^(control) + 'O' # 終了する場合 ^(control) + 'X' # ターミナルでのコマンド # cron実行 sudo /etc/init.d/cron start # cron再実行 sudo /etc/init.d/cron restart # cron停止 sudo /etc/init.d/cron stop |
crontab -eで入力するコマンドは以下の通りで、「毎分’hello-cron.py’を実行する」というコマンドです。またこのpythonファイルでは「print()」を実行させますが、この結果はターミナル上で「’mail’」コマンドを実行しないと見れないので、実行コマンドの後ろに
‘>> /Users/mark/Desktop/cron_error.txt 2>&1’
と入力します。このように記載することでデスクトップに「cron_error.txt」というlog fileを作成することができます。
1 |
* * * * * python3 /Users/mark/Desktop/hello-cron.py >> /Users/mark/Desktop/cron_error.txt 2>&1 |
またcronでfileを実行する際にはPATHを適切に設定しないと正常に動作しないことがあるため、以下の複数のPATHを設定することでcronの実行をターミナルでの実行環境と同じとすることができます。
1 2 |
PATH=/home/mark/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin # 'mark'はuser nameなのでご自身のものに変更してください |
また日本語を含むファイルの文字化けを防ぐためのコードも追記し、PATHとcrontabの実行コードを以下のように記載します。
1 2 3 |
PATH=/home/mark-pi/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin LANG=ja_JP.utf-8 * * * * * python3 /Users/mark/Desktop/hello-cron.py >> /Users/mark/Desktop/cron_error.txt 2>&1 |
PATH設定に関する試行錯誤はこちらの記事をご参照ください。
実行が成功するとデスクトップに「cron_error.txt」というファイルが作成されているのでそちらを確認すると、python fileが実行されて「’hello cron’」と出力されていることを確認できます。
cronによるselenium立ち上げの確認 selenium_open.py
Selenium, Chromium-Chromedriverのインストール
ターミナルから以下のコマンドを入力してインストールを行います。
1 2 3 4 5 |
pip3 install selenium pip3 install chromedriver_binary pip3 install webdriver-manager |
Chromedriverはこちらからダウンロードします。
インストールが終わったら以下のコードを打ち込んでSeleniumからWebブラウザ(今回はChromeをシークレットモード)が立ち上がることを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import time # スリープを使うために必要 from selenium import webdriver # Webブラウザを自動操作する(python -m pip install selenium) from selenium.webdriver.chrome.options import Options # オプションを使うために必要 option = Options() # オプションを用意 option.add_argument('--incognito') # シークレットモードの設定を付与 # option.add_argument('--headless') # ヘッドレスモード(画面表示させない)設定 # Sleniumでwebブラウザを起動する browser = webdriver.Chrome(ChromeDriverManager().install(), options=option) # Chromeを準備(optionでシークレットモードにしている) # 5秒間保持する time.sleep(5) # Sleniumでwebブラウザを停止する browser.quit() |
これを実行して無事にブラウザが立ち上がり数秒後に閉じれば成功です。
なお私の場合上記ファイルを実行した際に以下のエラー文が表示されてしまいました。このエラーを回避するために6行目のコメントアウトを外して「option.add_argument(‘–headless’) # ヘッドレスモード(画面表示させない)設定」を有効としてください。そうすると、webdriverが立ち上がっても画面上に表示されませんが裏で実行されます。
crontab -eでコマンドが実行されているかを確認するためにも、実行コマンドの後ろに
‘>> /Users/mark/Desktop/cron_error.txt 2>&1’
をつけてlog fileを出力させるようにしてください。
Error文
1 2 3 4 5 |
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.) |
コメント