Seleniumでスクレイピング
はじめに
近年、Webサービスの増加に伴い、データ取得や業務自動化のニーズが急増しています。Python自動化とSeleniumを組み合わせることで、ブラウザ操作をコードで制御し、スクレイピングや自動テストを効率的に実行できます。WebDriverを利用した要素特定やヘッドレスモードでの高速実行は、CI/CDパイプラインに組み込む際に不可欠です。本記事では、ログイン処理から待機処理、ヘッドレスモードの設定まで、実践的なWeb操作の全貌を解説します。
基礎知識・概念
まずは主要用語を整理します。Seleniumはブラウザ自動化フレームワークで、Pythonからselenium.webdriverを介して操作します。WebDriverはブラウザ固有のドライバ(ChromeDriver、GeckoDriverなど)で、Seleniumとブラウザ間の橋渡しを行います。要素特定はfind_element_by_*メソッドで行い、待機処理はWebDriverWaitとexpected_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環境での継続的テストが実現します。ヘッドレスモードを併用すれば、ビルド時間を大幅に短縮できます。
トラブルシューティング
よくあるエラーと対処法をまとめます。「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への移行を検討すると、さらに高速かつ安定した自動化が実現します。
コメント
コメントを投稿