もやしさん家のもやもやな生活

育児とキャンプとキャンピングトレーラーのブログ♪

Pyhon+Seleniumで作ったスクリプトがタスクスケジューラーで動かない

Webスクレイピングに欠かせないPythonとSelenium。
それをpyinstallerでexe化して、タスクスケジューラーで自動実行させていたのですが、最近になって動いていないような感じがしたので調べてみました。

 

 

何が起きていた?

タスクスケジューラーでexeが動かない・・・
厳密には実行されているものの、exeに記した処理が実行されない(終了しない)ことが発生していました。
それまではうまく動いていたのですが、9月の上旬になって突然動かなくなってしまいました。

やっていた処理

SeleniumでWebスクレイピングをしています。

#Sampe Code: Sample.py
from selenium import webdriver
browser = webdriver.Chrome('chromedriver.exe')
browser.get('https://google.co.jp')
browser.quit()

これをpyinstallerでexe化します。

> pyinstall Sample.py ---onefile
created Sample.exe 

exe化されたSample.exeを、Azure上のWindows 10に配置し、タスクスケジューラーで実行させます。
いちいちVMにサインインしたくないので「ユーザーがログオンしているかどうかに関わらず実行する」をONにしておきます。
f:id:moyashinet:20210916221009p:plain
●最上位の特権(管理者権限)とするかどうかは実行する処理に応じます。

結局どうしたのか?

Google Cromeをヘッドレスモードで実行させました。
とオチは簡単ですが、そこに行きつくまでの切り分けがしんどかった…(徹夜)

修正後のコードはコチラです。

#Refurbished Sampe Code: Sample2.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
option = webdriver.ChromeOptions()
option.add_argument('--headless')
driver = webdriver.Chrome('chromedriver.exe', options=options)
browser.get('https://google.co.jp')
browser.quit()

その後のexe化、タスクの設定は同様です。

原因

9月上旬になって処理が止まってしまったタイミングでGoogle Chromeがバージョン93に更新されていました。
どうもそのバージョンで、クロームのバックグラウンド処理が封じられたようです(evidenceを探しましたが見つけ出せませんでしたが、実動ベースでの結論です)。

タスクスケジューラーには、2つの実行オプションがあります。
・ユーザーがログオンしているときのみ実行する(R)
・ユーザーがログオンしているかどうかにかかわらず実行する(W)

前者はフォアグラウンドプロセス、後者はバックグラウンドプロセスで動作します。
修正前での切り分けでもタスクの設定を前者として実行すると動き、後者として実行すると動きませんでした。

タスクの実行のためにいちいちVMにサインインするのは面倒極まりないので、バックグラウンドで動作するように対応する必要があります。

問題はクロームを表示させている(フォアグラウンド処理を要求する)ところにあるので、バックグラウンド処理させる必要があります。ヘッドレスモード(ブラウザ画面を表示させない)で実行したGoogle Chromeはバックグラウンドで動作することが分かり、修正してみたところアタリでした。

ここに至るまでに実行アカウントの問題か?(SYSTEMアカウントでもダメ)とか、pyinstallerの問題か?(python.exeでpyファイルを呼び出す)とかあーだこーだやってましたが、なんというか簡単なオチでびっくりでした。

結論

タスクスケジューラーで[ユーザーがログオンしているかどうかにかかわらず実行する]場合は、Headless Chromeを使いましょう!

というお話でした( *´艸`)