【Python】SeleniumのOptionsとServiceまとめ

本ページはプロモーションが含まれています

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

まとめ

オプションはかなりの量がありましたが、実のところ使うものは限られていますのでテンプレ化させておくこと推奨です

コメント

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