スクレイピングする上で発生したトラブル
はじめに
Selenium と ChromeDriver は、ウェブスクレイピングにおいて不可欠なツールです。Selenium はウェブブラウザの自動操作を可能にし、ChromeDriver は Google Chrome ブラウザを制御するためのドライバーとして機能します。本記事では、これらのツールのセットアップ方法と、実際に遭遇したトラブルおよびその解決策について詳しく解説します。
Selenium と ChromeDriver のスクレイピングにおける意義と役割
Selenium の役割
Selenium は、ウェブブラウザをプログラムから操作するためのオープンソースツールです。スクレイピングにおいては、JavaScript で動的に生成されるコンテンツの取得や、ユーザー操作をシミュレーションする際に非常に有用です。具体的には、以下のような用途があります:
- 動的コンテンツの取得: ページロード後に JavaScript で生成されるデータを取得。
- ユーザー操作の自動化: ログインフォームの入力やボタンのクリックなど、人間が行う操作を自動化。
- テストの自動化: ウェブアプリケーションの機能テストを自動化。
ChromeDriver の役割
ChromeDriver は、Selenium と Google Chrome ブラウザを連携させるためのドライバーです。Selenium はブラウザの操作を指示しますが、実際のブラウザ操作は ChromeDriver が担います。これにより、Python などのプログラミング言語から Chrome ブラウザを制御できるようになります。
セットアップで発生したトラブルとその対策
desired_capabilities
が予期せぬ引数として渡された
エラー 1: 発生状況
以下のエラーメッセージが表示されました:
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 を自動的に管理。
SessionNotCreatedException
- ChromeDriver と Chrome のバージョン不一致
エラー 2: 発生状況
以下のエラーメッセージが表示されました:
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
の引数にservice
とoptions
を渡すことで、Selenium と ChromeDriver が正しく連携します。
これにより、Chrome ブラウザのバージョンが更新されても、自動的に対応する ChromeDriver が使用されるため、バージョン不一致によるエラーを防ぐことができます。
おまけ: M1 Mac での「chromedriver が悪質なソフトウェアかどうかを Apple では確認できない」というエラーの対処法
発生状況
M1 Mac に ChromeDriver をインストールして実行した際に、以下のポップアップが表示されることがあります:
“chromedriver”が悪質なソフトウェアかどうかを Apple では確認できないため、このソフトウェアは開けません。
対応方法
初回の実行時は、ChromeDriver を許可する必要があります。以下の手順で対応してください:
- システム環境設定を開く
システム環境設定を開き、「セキュリティとプライバシー」を選択します。 - 許可をクリック
「一般」タブ内に表示されているメッセージに対して、「許可」をクリックします。 - ポップアップの確認
再度、同じポップアップが表示された場合は、再度「許可」をクリックします。
これで、ChromeDriver の実行が可能になります。
以上です。
Discussion