PythonのSeleniumを使用してWebスクレイピングを行う際にwebdriverのChromeOptionsというメソッドを使用することで起動オプションを設定することが可能です。いろいろ解説されているサイトがありますが、どのオプション設定を使えばいいか分かりませんよね。
ちなみにSeleniumの公式ページでは以下の2つのリンクがexcellent resources for investigating(調査のための優れたリソース)として紹介しています。これを見ても多くの起動オプションがあることが分かります。
そこで私が使用しているChromeOptionsのオプション設定を紹介したいと思います。
オプションの設定方法
以下のコードがChromeOptionsのオプションを設定し、webdriverを起動するためのサンプルコードとなります。
webdriver.ChromeOptionsをインスタンス化し、add_argumentまたはadd_experimental_optionのメソッドにてオプションを追加していきます。その後、webdriver.Chromeをインスタンス化する際に引数として渡してwebdriverを起動します。
from selenium import webdriver
def main():
options = webdriver.ChromeOptions()
options.add_argument('--incognito')
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)
if __name__ == '__main__':
main()使用するオプション
add_argument(‘–incognito’)
add_argument(‘–incognito’)はGoogle Chromeをシークレットモードで起動するためのオプションです。シークレットモードで起動することで前回実行時の状態(キャッシュやcookie)に影響を受けることなく、スクレイピングを実行できるので偏りなく情報を収集することが可能となります。
このオプションは常に使用しています。
options.add_argument(‘–headless=new’)
options.add_argument(‘–headless=new’)はGoogle Chromeをヘッドレスモードで起動するためのオプションです。ヘッドレスモードで起動することでブラウザを表示せずにスクレイピングを実行できます。
デバッグ時は画面の状態等が分からなくなるのでこのオプションは使用していませんが、ツールとしてお客様に納品する際はブラウザが邪魔になったり、間違えて閉じられると困るのでこのオプションを使用しています。
ブラウザが表示されない分、スクレイピングの速度が上がりそうですが、そういったことはないようです。
また、options.add_argument(‘–headless’)でもヘッドレスモードで起動できますが、現在はoptions.add_argument(‘–headless=new’)が推奨されているようです。
options.add_argument(‘–blink-settings=imagesEnabled=false’)
options.add_argument(‘–blink-settings=imagesEnabled=false’)は画像の読み込みを無効にするためのオプションです。画像の読み込みを無効にすることでページの読み込み速度が向上します。
画像が多いWebページに対しては読み込み速度はかなり向上するのでスクレイピング中にページのスクリーンショットを撮るような場合でない限り、このオプションを使用しています。
options.add_argument(‘–start-maximized’)
options.add_argument(‘–start-maximized’)はウィンドウを最大化した状態で起動するためのオプションです。
使用する頻度は少ないですが、JavaScriptが実装されているWebページでスクロールしないと表示されない要素が合ったり、画面に表示されていないと要素を取得できない場合、表示範囲を広げる目的で使用しています。
options.add_experimental_option(‘excludeSwitches’, [‘enable-logging’])
options.add_experimental_option(‘excludeSwitches’, [‘enable-logging’])はコンソールに表示するwebdriverのログを非表示にする設定です。
webdriverからのログでコンソールが見にくくなるのを防ぐため、常に使用しています。
ヘッドレスモードで起動した場合、ブラウザ起動時のログ「DevTools listening on ws:xxxxxxxxxx」は表示されます。
面倒なので自作モジュール化

こんなの1からコーディングするくらいなら
オプションなしで起動するわ



options.add_argument(‘–blink-settings=imagesEnabled=false’)
なんかはかなり実行時間短縮になるから使った方が絶対いいですよ



Eだけ大文字とか何のトラップだよ



たしかにそうですが、効果を体感してほしいので
自作モジュール化しますね
ということでwebdriver.Chromeを継承してMyWebdriverというクラスを作成して自作モジュール化してしまいましょう。
from selenium import webdriver
class MyWebdriver(webdriver.Chrome):
def __init__(self, *, is_headless=True, enable_images=False, maximize_window=False):
options = webdriver.ChromeOptions()
options.add_argument('--incognito')
if is_headless:
options.add_argument('--headless=new')
if not enable_images:
options.add_argument('--blink-settings=imagesEnabled=false')
if maximize_window:
options.add_argument('--start-maximized')
options.add_experimental_option('excludeSwitches', ['enable-logging'])
super().__init__(options=options)ポイントは以下のとおりです。
- 常に使用するオプション以外は引数is_headless、enable_images、maximize_windowで設定可能
- 引数はキーワード引数として使用頻度が多い方をデフォルト値として設定
- 引数はbool型のみなのでキーワード専用引数に設定
(インスタンス化の際にMyWebdrive(False, True, False)等では分かりにくいため)
実際に使用するにはmywebdriver.pyをインポートして以下のように使用します。
from mywebdriver import MyWebdriver
def main():
# デフォルトのままであれば引数省略可
driver = MyWebdriver(is_headless=False, enable_images=True)
# スクレイピングの処理を記述
driver.quit()
if __name__ == '__main__':
main()


コメント