SeleniumでChromeを起動する前に指定するOptionsとServiceについておススメをまとめました
OptionsはChromeのバージョンアップとともに変わったりするので不定期に更新していきます
前置き
特にOptionsは動作軽量を目指す機能も多いのですが、スクレイピングはなるべく人が操作している状態を再現したほうが安定するので”なるべく使わない方がいい“が持論です
プロファイル指定しなければ毎回何も設定していないインストール直後のピュアな状態で起動するはずなのでその前提で設定する機能を選択すればいいと思います
Optionsについて
いわゆる起動オプションとしてChromeの機能を設定できます
あくまでChrome用の機能であってChromedriverとしてはいる?って思うものも多々ありますが、目的別に分類してるので気になるところからチェックしてみてください
記述は”options.add_argument(argument: str)”で必要な分だけ記載する
高速化・軽量化目的
--headless=new
おそらく一番需要があるオプション
画面非表示(headlessモード)になるので定期処理などバックグラウンドで処理してくれれば完全自動化と言えるので手元で実行するプログラムならかなり有用
難点はエラーになった時に気が付かない可能性があるところやサイトによってはブロックされるのかうまく動かない時がある
昔は”–headless”でしたが今は”–headless=new”が正解
--disable-gpu
GPU(グラフィック処理)を無効化します
体感そんなに変化あるかなと思いつつ、headlessモードと併用すると安定するらしい
個人的にはheadlessモードでも設定しませんが
–disable-extensions
Chromeの拡張機能を無効化して起動します
起動が軽くなり、不要な干渉を防げますがそもそも拡張機能ない状態で使うことが基本なのであったもなくてもいい気がする
–disable-dev-shm-usage
LinuxやDocker環境で、共有メモリ領域の使用を避けることでクラッシュを防いでくれるそう
Windowsなら不要な気もしますが、おまじないとして
–no-sandbox
Chromeのセキュリティ機能を無効化します
Linux環境で必要になることがありますが、基本的に設定しない方がいいと思ってる
テスト・自動化向け
–start-maximized
ウィンドウサイズを最大化して起動
指定しないと小さいサイズで開いてしまい、要素が表示されないことがあるので個人的には必須レベル
–window-size=width,height
ウィンドウサイズを指定して起動
–start-maximizedの方を推奨なんですがこちらでもOK
–disable-popup-blocking
ポップアップブロックを無効化
そもそもブロックする設定になっていないはずなのでいらないはず
–disable-notifications
通知を無効化します
通知を受け取るような操作はしない気もするのであってもなくても
–auto-open-devtools-for-tabs
起動時にDevTools(開発者ツール)を自動で表示する
少なくとも完成したプログラムには要らないし開発中は普通のchrome使ってるはずなので使うことはないと思う
–disable-blink-features=AutomationControlled
navigator.webdriverの値を偽装し、自動化検知を回避します
chromedriverは通常”navigator.webdriver=true”が設定されていて、Bot検知される要因の一つなので必須で設定すべき
プライバシー・偽装目的
–incognito
シークレットモードで起動します
冒頭の通り毎回ピュアな状態で起動するのでなくてもいいおまじないの部類
–user-agent=…
ユーザーエージェントを偽装する
Bot検知回避として紹介されることが多いですが、個人的にはrequestsならともかくSeleniumで本当に効果ある?と思ってます
ちなみにユーザーエージェント文字列は”fake-useragent”を使うと便利
–user-data-dir=/path/to/profile
ユーザープロファイルを指定して起動する
プロファイルについては割愛しますが、ユーザーアカウントを指定できればcookieなども残せて利用の幅が広がります
–ignore-certificate-errors
SSL証明書のエラーを無視してアクセスします
自己署名証明書のサイトなどに有効ですが使う機会は多分ないので設定しなくてもOK
–disable-password-manager
パスワード保存機能を無効化します
そもそも保存させることがないと思うのでこれも設定しなくてOK
表示・UI制御
–hide-scrollbars
スクロールバーを非表示にします
効果があるのはスクショ残すときぐらいなのでお好みで
–app=https://example.com
指定したURLをアプリモードで起動します
ほぼ全画面モードのような状態になりますが、手動操作しないので使う機会はなさそう
–disable-images
画像の読み込みを無効化します
今時画像の読み込みを無効化した程度で動作に大差はない気もしますが、少しでも処理高速化したいなら設定したほうが吉
–disable-javascript
JavaScriptを無効化します
JavaScriptを無効で動くサイトの方が少ない気がするし、JavaScriptを無効でいいならrequestsの方が軽量
headlessと組み合わせればrequestsに近い状態なので学習コストの節約にはなるかも
ただ、今は下部のpreferencesで設定することを推奨されています
拡張機能関連
–load-extension=/path/to/ext
ローカルのChrome拡張機能を読み込んで起動します
どうしても使いたい拡張機能があるときは需要ありそうですが、個人的に拡張機能使う時は–user-data-dirを使いたい
実験的・高度な制御(add_experimental_option)
ここからは”options.add_argument”ではなくて”options.add_experimental_option”で設定する実験的オプション
記述も変わってadd_experimental_option(name: str, value: Union[str, int, dict, list[str]])に
“excludeSwitches”, [“enable-automation”]
chromderiverのブックマークバー下に表示されるメッセージを非表示にします
Bot検知回避の一つになるので設定し得

options.add_experimental_option(“useAutomationExtension”, False)
navigator.webdriver が undefined になり、Bot検知を回避しやすくなるとかならないとか
“mobileEmulation”, {“deviceName”: deviceName}
スマホとしてブラウザを起動する
スマホの種類はデベロッパーツールのデバイスツールを参考にdeviceNameへ”iPhone 14 Pro Max”や”Pixel 7″などにすればOK
“prefs”, {dict}
preferences(環境設定)がまた多くあります
これまで指定したオプションと同じ内容もありますが、どちらを使うべきかと言えば基本的にはこちらを推奨
“download_bubble.partial_view_enabled”: False
ダイアログ(名前を付けて保存)の初期ディレクトリを指定
“download.default_directory”: “/path/to/folder”
ダウンロード先を指定
“download.prompt_for_download”: False
ダウンロード時の確認ダイアログを無効化
“download.directory_upgrade”: True
既存フォルダでも強制的に保存
“savefile.default_directory”: “/path/to/folder”
ダウンロードが完了したときの通知(吹き出し/下部表示)を無効にする
“credentials_enable_service”: False
パスワード保存のポップアップを無効
“plugins.always_open_pdf_externally”: True
Chromeの内部PDFビューアを使わない
“profile.managed_default_content_settings.javascript”: 2
javascriptの有効/無効を制御(1:有効※既定、2:無効)
“profile.managed_default_content_settings.images”: 2
画像の読み込みを無効化(1:有効※既定、2:無効)
Serviceについて
今のService特に指定しなくてもいいレベルで、個人的な利用は1つだけ
creation_flags
creation_flagsを指定することで”ChromeDriver の黒いコンソールウィンドウを非表示“にできます
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from subprocess import CREATE_NO_WINDOW
# Serviceオブジェクトを作成
service = Service()
service.creation_flags = CREATE_NO_WINDOW
service.creation_flags = 0x08000000 # CREATE_NO_WINDOWインポートしていない場合
# Serviceを渡してWebDriverを起動
driver = webdriver.Chrome(service=service)
# これ以降の処理...
driver.get('https://www.google.com')
print(driver.title)
driver.quit()
実行方法によりますがVSCodeとかで実行したときは↓のメッセージが表示されなくなります
DevTools listening on ws://127.0.0.1:50152/devtools/browser/~
Pyinstallerでアプリ化したときなんかは余計なメッセージが表示されなくてすっきりする気もしますが、おそらく”–noconsole”のオプションを付けることが多いと思うのでおマジて内的な位置づけでしょうか
余談(executable_pathが不要になった件)
その昔、chromedriverをChromeに合わせたバージョンに入れ替えていた時代がありまして、”webdriver-manager”が自動で入れ替えてくれるのでexecutable_pathと組み合わせて使っていました(当時はかなり画期的なモジュールでした)
が、Seleniuim v4.6.0からはSelenium Managerが機能として実装され、”自動でWebDriverを管理してくれるため今は不要“です
ネットには今でもその方法を紹介しているページが残っていますが無視して大丈夫です
# webdriver_managerを使っていた頃の起動
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# Serviceオブジェクトを作成
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
# これ以降の処理...
driver.get('https://www.google.com')
print(driver.title)
driver.quit()
結局何を使うべきか
プログラムによって調整は必要ですが、個人的必須だけをまとめました
お好みで追加削除してください
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
options = Options()
options.add_argument('--start-maximized')
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("useAutomationExtension", False)
options.add_experimental_option("excludeSwitches", ["enable-automation"])
prefs = {
"profile.managed_default_content_settings.images": 2,
"download.default_directory": os.path.dirname(__file__),
"download.prompt_for_download": False,
"download_bubble.partial_view_enabled": False,
}
options.add_experimental_option("prefs", prefs)
service = Service()
service.creation_flags = 0x08000000
driver = webdriver.Chrome(options=options, service=service)
driver.get('https://www.google.com')
print(driver.title)
driver.quit()
まとめ
オプションはかなりの量がありましたが、実のところ使うものは限られていますのでテンプレ化させておくこと推奨です
コメント