スキップしてメイン コンテンツに移動

Seleniumでスクレイピング

Seleniumでスクレイピング

はじめに

近年、Webサービスの増加に伴い、データ取得や業務自動化のニーズが急増しています。Python自動化とSeleniumを組み合わせることで、ブラウザ操作をコードで制御し、スクレイピングや自動テストを効率的に実行できます。WebDriverを利用した要素特定やヘッドレスモードでの高速実行は、CI/CDパイプラインに組み込む際に不可欠です。本記事では、ログイン処理から待機処理、ヘッドレスモードの設定まで、実践的なWeb操作の全貌を解説します。

基礎知識・概念

まずは主要用語を整理します。Seleniumはブラウザ自動化フレームワークで、Pythonからselenium.webdriverを介して操作します。WebDriverはブラウザ固有のドライバ(ChromeDriver、GeckoDriverなど)で、Seleniumとブラウザ間の橋渡しを行います。要素特定はfind_element_by_*メソッドで行い、待機処理はWebDriverWaitexpected_conditionsで実装します。ヘッドレスモードはブラウザをGUI無しで起動し、リソースを節約します。ログイン処理はフォーム入力と送信、待機処理はページ遷移後の要素待ちで安定化します。

実装・設定の詳細

以下は、Chromeをヘッドレスモードで起動し、ログイン処理を行うサンプルです。待機処理を組み込むことで、動的に読み込まれる要素への安定したアクセスが可能です。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.add_argument("--headless")          # ヘッドレスモード
options.add_argument("--disable-gpu")
driver = webdriver.Chrome(options=options)

driver.get("https://example.com/login")

# 要素特定と入力
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "username"))
).send_keys("my_user")

WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "password"))
).send_keys("my_pass")

# ログインボタンをクリック
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type='submit']"))
).click()

# ログイン後のページが読み込まれるまで待機
WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.ID, "dashboard"))
)

print("ログイン成功")
driver.quit()

ポイントは、WebDriverWaitで待機時間を設定し、要素が確実に存在するまで処理をブロックする点です。これにより、ページの読み込み遅延やJavaScriptの非同期処理に対しても安定した自動化が実現します。

応用テクニック

基本操作をマスターしたら、次は実務で役立つ応用テクニックへ。まず、スクレイピング対象が大量データの場合、ページネーションを自動で巡回し、CSVに保存するスクリプトを作成します。以下は簡易例です。

import csv

driver.get("https://example.com/list")
rows = []

while True:
    WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".item-row"))
    )
    items = driver.find_elements(By.CSS_SELECTOR, ".item-row")
    for item in items:
        title = item.find_element(By.CSS_SELECTOR, ".title").text
        link = item.find_element(By.CSS_SELECTOR, ".link").get_attribute("href")
        rows.append([title, link])

    # 次ページが存在するか確認
    try:
        next_btn = driver.find_element(By.LINK_TEXT, "Next")
        next_btn.click()
    except:
        break

with open("data.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["Title", "Link"])
    writer.writerows(rows)

さらに、Selenium GridやDockerを利用すれば、複数ブラウザ・OSで同時にテストを走らせることが可能です。自動テストフレームワーク(pytest + selenium)と組み合わせることで、CI環境での継続的テストが実現します。ヘッドレスモードを併用すれば、ビルド時間を大幅に短縮できます。

Check: 実務で役立つポイント!ヘッドレスモードはCI環境で必須。ログイン処理はCookieを保存して再利用すると、毎回ログイン不要で高速化できます。

トラブルシューティング

よくあるエラーと対処法をまとめます。「NoSuchElementException」は要素が見つからない場合に発生します。待機時間を増やすか、presence_of_element_locatedではなくvisibility_of_element_locatedを試してください。「SessionNotCreatedException」はWebDriverとブラウザのバージョン不一致が原因です。ChromeDriverを最新版に更新し、options.binary_locationで正しいブラウザパスを指定します。ヘッドレスモードで「DevToolsActivePort file doesn't exist」エラーが出たら、--no-sandbox--disable-dev-shm-usageを追加してください。

まとめ

Python自動化とSeleniumを組み合わせることで、ブラウザ操作、スクレイピング、ログイン処理、待機処理、ヘッドレスモードを自在に制御できます。実装例を参考に、CI環境での自動テストや大量データ取得に挑戦してみてください。次のステップとしては、Selenium GridやDockerを使った分散テスト、またはPlaywrightやPuppeteerへの移行を検討すると、さらに高速かつ安定した自動化が実現します。

この記事はAI技術を活用して作成されましたが、内容は慎重に確認されています。

コメント