Python | Web / API:ChromeDriver

Python Python
スポンサーリンク

概要(ChromeDriverは「SeleniumがChromeを動かすための運転手」)

ChromeDriverは、SeleniumがChromeブラウザをプログラムから操作するための仲介役です。要点は「Chrome本体とのバージョン整合」「起動オプション(ヘッドレス・ダウンロード設定など)」「パス管理(どこにあるか)」「安定化(待機・例外)」の4つ。初心者は「webdriver-managerで自動管理」→「最短起動」→「ヘッドレス実行」→「明示的待機を組み合わせる」の型で進めると、つまずきません。


はじめ方(インストールと最短の起動)

依存関係の整理と最短スクリプト

# インストール(Pythonパッケージ)
# pip install selenium webdriver-manager

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

# ChromeDriverを自動ダウンロード&起動
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.google.com")
print(driver.title)
driver.quit()  # 必ず後始末
Python

webdriver-managerを使うと、Chrome本体のバージョンに合うChromeDriverを自動取得します。手動ダウンロードやPATH設定の手間が減り、起動エラーの定番を回避できます。

手動でパスを指定したい場合

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# 例:ローカルに配置した chromedriver のパス
service = Service("/path/to/chromedriver")
driver = webdriver.Chrome(service=service)
driver.get("https://example.com")
driver.quit()
Python

社内環境でインターネット制限があるときは、管理者が配布したChromeDriverのパスを明示指定します。Chrome本体のバージョン整合は自分で合わせます。


起動オプション(ヘッドレス・言語・ダウンロード先)

ヘッドレス(画面非表示)とウィンドウサイズ

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

opts = Options()
opts.add_argument("--headless=new")     # 新ヘッドレスモード
opts.add_argument("--window-size=1280,800")  # 要素検出の安定化に有効

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts)
driver.get("https://example.com")
print(driver.title)
driver.quit()
Python

ヘッドレスはCIやサーバで便利ですが、画面サイズが小さいと要素が「見えていない」扱いになり操作に失敗します。ウィンドウサイズ指定で安定させましょう。

表示言語やユーザエージェントの設定

from selenium.webdriver.chrome.options import Options

opts = Options()
opts.add_argument("--lang=ja-JP")
opts.add_argument("--user-agent=MyCrawler/1.0")
Python

サイトの表示言語や挙動を制御したいなら、言語コードやUAを明示します。

ダウンロード先と自動保存(Chromeの設定)

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

opts = Options()
prefs = {
    "download.default_directory": r"C:\temp\downloads",
    "download.prompt_for_download": False,     # ダイアログを出さない
    "download.directory_upgrade": True
}
opts.add_experimental_option("prefs", prefs)

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts)
driver.get("https://example.com/report.csv")  # 直接リンクを開けば自動保存
driver.quit()
Python

レポートの自動ダウンロードでは保存先を固定し、ダイアログ無しで落とせるようにすると無人実行が安定します。


要素操作の基本(ロケータと明示的待機)

ロケータの使い分け(ID/NAME/CSS/XPath)

from selenium.webdriver.common.by import By

driver.get("https://www.google.com")
q = driver.find_element(By.NAME, "q")     # 最優先はID/NAME
q.send_keys("Selenium ChromeDriver")
q.submit()

results = driver.find_elements(By.CSS_SELECTOR, "h3")  # 構造指定はCSS
print([r.text for r in results[:5]])
Python

ID/NAMEがあるなら最短・堅牢。CSSは短く書けて高速。XPathは表現力が高い反面、長くなりがちでDOM変更に弱いので最後の手段。

明示的待機(ページが“準備完了”してから操作)

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type=submit]")))
btn.click()
Python

固定のsleepではなく、表示やクリック可能性を条件に待つ「明示的待機」が安定化の核心です。


トラブルシューティング(絶対にハマりがちな箇所)

バージョン不一致で起動しない

  • 症状: “Session not created” や “Chrome version must be…” などのエラー。
  • 対策: webdriver-managerで自動管理する、またはChrome本体とChromeDriverのバージョンを合わせる。手動管理なら更新のたびに入れ替え必須。

要素がクリックできない・見つからない

  • 症状: ElementClickInterceptedException、NoSuchElementException、TimeoutException。
  • 対策: 明示的待機(visibility/clickable)、ヘッドレス時はwindow-size指定、スクロールで要素を視野へ入れる、iframeはスイッチしてから操作。
from selenium.webdriver.common.action_chains import ActionChains

target = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".buy")))
ActionChains(driver).move_to_element(target).perform()
target.click()
Python

iframe内の要素に触れない

  • 症状: 何度探しても要素が見つからない。
  • 対策: iframeへスイッチしてから操作し、終わったら戻る。
frame = WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe#payment")))
# ... 操作 ...
driver.switch_to.default_content()
Python

ダウンロードが止まる・ダイアログ待ち

  • 対策: Chromeのdownload prefsを設定してダイアログ無効化。サーバ側が認証やPOST前提なら、その手順を自動化してからダウンロードリンクへ遷移。

実務の型(ログイン→検索→抽出→保存を“落ちない”ように書く)

一連の流れを「オプション+待機+例外+後始末」で守る

import csv
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

opts = Options()
opts.add_argument("--headless=new")
opts.add_argument("--window-size=1280,800")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts)
wait = WebDriverWait(driver, 12)

try:
    driver.get("https://example.com/login")
    wait.until(EC.visibility_of_element_located((By.ID, "username"))).send_keys("taro")
    wait.until(EC.visibility_of_element_located((By.ID, "password"))).send_keys("secret")
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type=submit]"))).click()

    wait.until(EC.url_contains("/dashboard"))
    driver.get("https://example.com/search?q=python")

    rows = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.item")))
    data = []
    for r in rows[:20]:
        title = r.find_element(By.CSS_SELECTOR, "h3").text
        link = r.find_element(By.CSS_SELECTOR, "a").get_attribute("href")
        data.append([title, link])

    with open("results.csv", "w", newline="", encoding="utf-8") as f:
        csv.writer(f).writerows(data)
finally:
    driver.quit()
Python

「ヘッドレス+サイズ」「明示的待機」「例外に備えたfinallyでquit」が堅牢化の三本柱です。こう書くと、動的ページでも落ちにくくなります。


まとめ

ChromeDriverは、SeleniumがChromeを動かすための“運転手”。最初の壁はバージョン不一致なので、webdriver-managerで自動管理するのが近道。ヘッドレス運用時はwindow-sizeを必ず指定し、要素操作はID/NAME/CSSを優先、クリックは明示的待機で「準備が整ってから」。ダウンロードはChromeのprefsで無人化し、iframeはスイッチを忘れない。これらの型を身につければ、初心者でも短いコードで「落ちない・速い・実務で使える」自動ブラウザ操作が安定して書けます。

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