Rasberry Pi 4でcron を用いてSeleniumを実行する

データサイエンティスト

Rasberry Pi4を用いてPythonのウェブスクレイピングを定期的に行いたかったので、Rasberry Pi4のcronでpython fileを実行 するための手順を備忘録として以下に示します。

Rasberry Piのcronでpython fileを実行

まずはcronによりpythonを実行して’hello cron’と表示させるようにします。

なおRaspberry PiでPythonを使用するには「Thonny Python IDE」を使用します。

Thonny Python IDE

Pythonについては以下の記事で広く学習方法などをまとめているので興味がある人は参照してみてください。

機械学習を理解するために Pythonを独学で学ぶ
この記事では、プログラミング初心者が人工知能を学ぶために、まず「 Pythonを独学で学ぶ 」ことを目的とした記事です。 はじめは「Pythonって何? 蛇?」というレベルでしたが、人工知能を学ぶ上でどのようにしてこの「Python」...

「Thonny Python IDE」が起動したらpythonのコードを以下のように記述し’hello-cron.py’と名前をつけて「デスクトップ」に保存します。

print('hello cron')

ラズパイの画面左上側に表示されている、LXLXTerminalをクリックしターミナルを起動し、cronを実行するためにターミナルに「crontab -e」と入力しEnterで設定を行います。するとvim/viが立ち上がるので以下のコマンドの通り操作を行います。

# 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を作成することができます。

* * * * * python3 /Users/mark/Desktop/hello-cron.py >> /Users/mark/Desktop/cron_error.txt 2>&1

またcronでfileを実行する際にはPATHを適切に設定しないと正常に動作しないことがあるため、以下の複数のPATHを設定することでcronの実行をターミナルでの実行環境と同じとすることができます。

PATH=/home/mark/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
# 'mark'はuser nameなのでご自身のものに変更してください

また日本語を含むファイルの文字化けを防ぐためのコードも追記し、PATHとcrontabの実行コードを以下のように記載します。

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のインストール

ターミナルから以下のコマンドを入力してインストールを行います。

pip3 install selenium

pip3 install chromedriver_binary

pip3 install webdriver-manager

Chromedriverはこちらからダウンロードします。

 

インストールが終わったら以下のコードを打ち込んでSeleniumからWebブラウザ(今回はChromeをシークレットモード)が立ち上がることを確認します。

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文

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.)

 

 

コメント

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