😽

スクレイピングする上で発生したトラブル

2025/01/29に公開

はじめに

Selenium と ChromeDriver は、ウェブスクレイピングにおいて不可欠なツールです。Selenium はウェブブラウザの自動操作を可能にし、ChromeDriver は Google Chrome ブラウザを制御するためのドライバーとして機能します。本記事では、これらのツールのセットアップ方法と、実際に遭遇したトラブルおよびその解決策について詳しく解説します。

Selenium と ChromeDriver のスクレイピングにおける意義と役割

Selenium の役割

Selenium は、ウェブブラウザをプログラムから操作するためのオープンソースツールです。スクレイピングにおいては、JavaScript で動的に生成されるコンテンツの取得や、ユーザー操作をシミュレーションする際に非常に有用です。具体的には、以下のような用途があります:

  • 動的コンテンツの取得: ページロード後に JavaScript で生成されるデータを取得。
  • ユーザー操作の自動化: ログインフォームの入力やボタンのクリックなど、人間が行う操作を自動化。
  • テストの自動化: ウェブアプリケーションの機能テストを自動化。

ChromeDriver の役割

ChromeDriver は、Selenium と Google Chrome ブラウザを連携させるためのドライバーです。Selenium はブラウザの操作を指示しますが、実際のブラウザ操作は ChromeDriver が担います。これにより、Python などのプログラミング言語から Chrome ブラウザを制御できるようになります。

セットアップで発生したトラブルとその対策

エラー 1: desired_capabilities が予期せぬ引数として渡された

発生状況

以下のエラーメッセージが表示されました:


TypeError: WebDriver.**init**() got an unexpected keyword argument 'desired_capabilities'

このエラーは、Selenium 4 以降でdesired_capabilities引数が非推奨となり、新しい設定方法が必要になったために発生しました。

解決策

desired_capabilitiesの代わりに、Optionsクラスを使用してブラウザの設定を行います。以下に修正例を示します。

修正前のコード:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

def login():
    caps = DesiredCapabilities.CHROME.copy()
    caps["goog:loggingPrefs"] = {"performance": "ALL"}

    driver = webdriver.Chrome("/path/to/chromedriver", desired_capabilities=caps)
    # ログイン処理続行...

修正後のコード:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

def login():
    options = Options()
    options.set_capability("goog:loggingPrefs", {"performance": "ALL"})

    # webdriver_managerでChromeDriverを自動管理
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=options)
    # ログイン処理続行...

主な変更点:

  • DesiredCapabilitiesからOptionsクラスに変更。
  • webdriver.Chromeの引数にdesired_capabilitiesを渡さず、代わりにoptionsを渡す。
  • webdriver_managerを使用して ChromeDriver を自動的に管理。

エラー 2: SessionNotCreatedException - ChromeDriver と Chrome のバージョン不一致

発生状況

以下のエラーメッセージが表示されました:

selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 120
Current browser version is 131.0.6778.109 with binary path /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

このエラーは、インストールされている ChromeDriver のバージョンが、現在使用している Google Chrome ブラウザのバージョンと一致していないために発生します。

解決策

ChromeDriver のバージョンを Google Chrome ブラウザのバージョンに合わせて更新する必要があります。手動での更新方法を試みましたが、うまくいかなかったため、webdriver_managerを利用して自動的に適切なバージョンの ChromeDriver を管理する方法に切り替えました。

修正前のコード:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

def login():
    caps = DesiredCapabilities.CHROME.copy()
    caps["goog:loggingPrefs"] = {"performance": "ALL"}

    driver = webdriver.Chrome("/opt/homebrew/bin/chromedriver", desired_capabilities=caps)
    # ログイン処理続行...

修正後のコード:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

def login():
    options = Options()
    options.set_capability("goog:loggingPrefs", {"performance": "ALL"})

    # webdriver_managerでChromeDriverを自動管理
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=options)

    # 以下、ブラウザ操作の続行...

主な変更点:

  • webdriver_managerを導入し、ChromeDriver のバージョン管理を自動化。
  • webdriver.Chromeの引数に直接 ChromeDriver のパスを指定せず、Serviceオブジェクトを利用。
  • webdriver_managerを使用することで、Chrome ブラウザのバージョンに適した ChromeDriver が自動的にダウンロード・設定されるようにした。

webdriver_manager を使った ChromeDriver の自動管理

webdriver_managerライブラリは、Selenium で使用する ChromeDriver のダウンロードと管理を自動化するための便利なツールです。これを活用することで、手動で ChromeDriver をダウンロードする手間を省き、常に最新のブラウザに対応したドライバーを使用することができます。

インストール方法

pip install webdriver_manager

使用方法

以下は、webdriver_managerを使用した ChromeDriver のセットアップ例です。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

def main():
    options = Options()
    options.set_capability("goog:loggingPrefs", {"performance": "ALL"})

    # ChromeDriverを自動的にダウンロード・設定
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=options)

    # ブラウザ操作の例
    driver.get("https://www.google.com")
    print(driver.title)

    driver.quit()

if __name__ == "__main__":
    main()

ポイント:

  • ChromeDriverManager().install()が現在の Chrome ブラウザに適した ChromeDriver を自動的にダウンロードし、パスを返します。
  • Serviceクラスにより、ChromeDriver のサービスを管理します。
  • webdriver.Chromeの引数にserviceoptionsを渡すことで、Selenium と ChromeDriver が正しく連携します。

これにより、Chrome ブラウザのバージョンが更新されても、自動的に対応する ChromeDriver が使用されるため、バージョン不一致によるエラーを防ぐことができます。

おまけ: M1 Mac での「chromedriver が悪質なソフトウェアかどうかを Apple では確認できない」というエラーの対処法

発生状況

M1 Mac に ChromeDriver をインストールして実行した際に、以下のポップアップが表示されることがあります:

“chromedriver”が悪質なソフトウェアかどうかを Apple では確認できないため、このソフトウェアは開けません。

対応方法

初回の実行時は、ChromeDriver を許可する必要があります。以下の手順で対応してください:

  1. システム環境設定を開く
    システム環境設定を開き、「セキュリティとプライバシー」を選択します。
  2. 許可をクリック
    「一般」タブ内に表示されているメッセージに対して、「許可」をクリックします。
  3. ポップアップの確認
    再度、同じポップアップが表示された場合は、再度「許可」をクリックします。

これで、ChromeDriver の実行が可能になります。

 
 
 
 
以上です。

KA projects

Discussion