Webスクレイピングに欠かせないPythonとSelenium。
特定のサイトからファイルをダウンロードする処理を任せているのですが、しばらくぶりにちゃんと動いているか確認してみたらサボっていました・・・(;´・ω・)
何が起きていた?
タスクは動いているものの、ファイルダウンロードの処理が空ぶっていました。
以前タスクスケジューラーでPyinstallerで作成したexeが動かない問題が発生しましたが、ファイルダウンロード以外は正常に処理されているため別のトラブルのようです(;・∀・)
以前のトラブル↓
やっていた処理
Seleniumで特定のサイトにアクセスし、定期的にファイルをダウンロードさせていました。
これまではファイルをダウンロードできていたのですが、先月頃からダウンロードされなくなってしまっていました。
結局どうしたのか?
前回のトラブルでGoogle Chromeをヘッドレスモードで実行させるよう修正しましたが、その実行のさせ方に変化があったようです。
ヘッドレスモードで起動させるための赤文字の部分を"--headless"から"--headless=new"に修正することで動作するようになりました。
#Refurbished Sampe Code: Sample2.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
option = webdriver.ChromeOptions()
option.add_argument('--headless=new')
driver = webdriver.Chrome('chromedriver.exe', options=options)
browser.get('https://google.co.jp')
browser.quit()
原因
今回のトラブルはSeleniumの仕様変更と、Chromeの仕様変更の双方が関連したようです。
個人的には前者に引っかからないコードだったので早期に復旧できて良かったです。もしこれが両方とも引っかかっていたら、対処するまで時間がかかったろうなぁ…と感じます。
Seleniumの仕様変更
Selenium4.8.0からheadless属性(options.headless = True)が使えなくなりました。
ヘッドレスモードで起動するにはは、add_argument関数を使用する必要があります。
※これは前回のトラブル対応時に対処済みでした
Selenium3.xからadd_argument関数を継続使用している人には影響の無い話でもありますね。
ChromeDriverの仕様変更
Chrome’s Headless mode gets an upgrade: introducing `--headless=new` - Chrome Developersによると、これまで画面のあるChrome(headful mode)とヘッドレスモードのChrome(Headless mode)のコードが別管理になっていたが、それを統合しようと動いているようです(意訳)。
これにより、Chrome109以降ではadd_argument関数に「–headless=new」と指定する必要があるとのことです(今までは「–headless」で動いていた)。
この記事にはChrome112でheadful modeとHeadless modeが統合されるとあるので、今現在(Chrome111)なぜファイルのダウンロードだけができなかったのか謎ですが、ゆくゆくは修正せざるを得ないコードで動いたのでこれで良しとします(←超テキトー
結論
OSSは便利に使える反面、こうやってちょいちょい仕様変更に巻き込まれますので、ちゃんとリリースノートに目を通して自分に影響があるか確認しないといけません!
というお話でした( *´艸`)
今回はSeleniumのこちらの記事が役に立ちました。