現代のWebサイトはJavaScriptを多用しており、従来のHTTPクライアントだけではデータを取得できないケースが増えています。
SPA(シングルページアプリケーション)や非同期通信によって生成されるコンテンツを扱うには、ブラウザを自動操作するSeleniumの力が必要です。
しかし、Seleniumだけで全てのパース処理を行うと、実行速度やコードの可読性に課題が生じることがあります。
そこで、Seleniumで描画したHTMLをpage_sourceで取得し、解析に特化したBeautifulSoupへ渡す手法が非常に有効です。
本記事では、この二つのライブラリを連携させ、効率的に動的サイトから情報を抽出するテクニックを詳しく紹介します。
なぜSeleniumとBeautifulSoupを組み合わせるのか
Seleniumはブラウザを操作するためのツールであり、HTML要素の検索機能も備えています。
しかし、Seleniumのfind_elementメソッドは、呼び出すたびにブラウザドライバーを経由して通信を行うため、処理速度が遅くなる傾向があります。
大量のデータを抽出する場合、この通信オーバーヘッドが無視できないほど大きな遅延を引き起こします。
一方で、BeautifulSoupはローカルメモリ上でHTMLを解析するため、圧倒的に高速なパース処理が可能です。
SeleniumでJavaScriptを実行させ、最新の状態になったDOM(Document Object Model)を文字列として取り出し、BeautifulSoupで一気に解析するのが最も効率的です。
このアプローチを採用することで、コードの可読性が向上し、メンテナンス性も高まります。
また、BeautifulSoupの柔軟なセレクタやメソッドを利用できるため、複雑な構造のHTMLでも容易にデータを取得できます。
開発環境の準備と最新のライブラリ構成
まずは、Python環境に必要なライブラリをインストールする必要があります。
2026年現在、Selenium 4系が主流となっており、WebDriverの管理も自動化が進んでいます。
以下のコマンドを使用して、SeleniumとBeautifulSoup4、そして解析速度に優れたlxmlパーサーを導入しましょう。
pip install selenium beautifulsoup4 lxml
以前はブラウザの種類に合わせて個別にドライバをダウンロードしてパスを通す作業が必要でした。
現在のSeleniumでは、ドライバの自動管理機能が標準搭載されているため、特別な準備なしにブラウザを起動できます。
ChromeやEdgeなど、利用したいブラウザがインストールされていることを確認してください。
実装の基本:page_sourceプロパティの活用
SeleniumでWebページを開いた直後は、まだJavaScriptによるコンテンツの生成が完了していない場合があります。
目的のデータが表示されるまで適切に待機した後、driver.page_sourceプロパティにアクセスします。
このプロパティには、ブラウザ上でレンダリングされた現在のHTMLが文字列として格納されています。
この文字列をBeautifulSoupのコンストラクタに渡すことで、連携が完了します。
基本的な流れを以下の表にまとめました。
| ステップ | ライブラリ | 主な役割 |
|---|---|---|
| ブラウザ起動・遷移 | Selenium | JavaScriptの実行とページ遷移の制御 |
| HTML取得 | Selenium | page_sourceによるDOM文字列の書き出し |
| パース(解析) | BeautifulSoup | 高速なタグ検索とテキスト抽出 |
実践プログラム:動的サイトからデータを抽出する
それでは、具体的なコード例を見ていきましょう。
このサンプルコードでは、ヘッドレスモード(ブラウザを表示しない設定)でブラウザを起動し、取得したHTMLをBeautifulSoupで処理します。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
# ブラウザの設定
options = Options()
options.add_argument("--headless") # ヘッドレスモードを有効化
# ドライバの初期化
driver = webdriver.Chrome(options=options)
try:
# ターゲットサイトへアクセス
url = "https://example.com/dynamic-content"
driver.get(url)
# コンテンツの読み込み待機(最低限のsleep、本来はExplicit Wait推奨)
time.sleep(3)
# レンダリング済みのHTMLを取得
html = driver.page_source
# BeautifulSoupで解析
soup = BeautifulSoup(html, "lxml")
# データの抽出(例:記事のタイトル一覧)
titles = soup.find_all("h2", class_="entry-title")
for title in titles:
print(title.get_text(strip=True))
finally:
# ブラウザを閉じる
driver.quit()
最新のPythonニュース
スクレイピングのベストプラクティス
BeautifulSoup活用のヒント
このコードのポイントは、driver.page_sourceを一度だけ変数に格納している点です。
これにより、ループ内で何度もブラウザにアクセスする必要がなくなり、実行時間が短縮されます。
待機処理(WebDriverWait)の重要性
動的なWebサイトを扱う上で、最も失敗しやすいポイントは「読み込み待ち」の不足です。
固定のtime.sleep()は簡単ですが、回線速度やサーバーの状態によって読み込み時間が変動するため、不安定なコードになりがちです。
これを解決するために、WebDriverWaitを活用しましょう。
特定の要素が画面に現れるまで待機することで、効率的かつ確実にpage_sourceを取得できます。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 10秒を上限に、特定のクラスを持つ要素が表示されるまで待機
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "entry-title")))
# 待機後にHTMLを取得
html = driver.page_source
このように明示的な待機処理を入れることで、エラーの発生率を大幅に低減させることが可能です。
特に要素の読み込みが遅い海外のサイトや、データ量が多いポータルサイトをスクレイピングする際には必須のテクニックです。
実行速度を改善するためのテクニック
スクレイピングの効率をさらに高めるための工夫をいくつか紹介します。
まずは、不要なリソースの読み込みを制限することです。
画像やCSSの読み込みを無効化することで、ページの表示速度を向上させることができます。
また、page_sourceを取得した後は速やかにブラウザを閉じ、メモリを解放することも重要です。
大規模なクローリングを行う場合は、一つのドライバインスタンスを使い回すのではなく、一定件数ごとに再起動してリフレッシュすることをお勧めします。
BeautifulSoup側では、パーサーとしてlxmlを使用するのが最速の選択肢です。
標準のhtml.parserよりも解析速度が速いため、数千行を超えるHTMLを扱う際には顕著な差が現れます。
スクレイピングにおける注意点とマナー
技術的に取得が可能であっても、スクレイピングには倫理的・法的なルールが伴います。
まず、対象Webサイトのrobots.txtを確認し、スクレイピングが許可されているかを確認しましょう。
利用規約にスクレイピング禁止の条項が含まれている場合、それを無視して実行すると法的なトラブルに発展する恐れがあります。
また、短時間に大量のリクエストを送信することは、相手サーバーへの攻撃(DoS攻撃)と見なされる可能性があります。
適切なインターバル(最低でも1秒以上)を空けるようにコードを設計してください。
認証が必要なページや、個人情報が含まれるデータの取り扱いには細心の注意を払い、公開範囲を誤らないように管理しましょう。
まとめ
Seleniumのpage_sourceとBeautifulSoupを組み合わせる手法は、現代の複雑なWebサイトからデータを効率的に抽出するための強力な武器になります。
SeleniumでJavaScriptを実行してHTMLを完成させ、BeautifulSoupで高速にパースするという役割分担が、最適解と言えるでしょう。
本記事で紹介した待機処理やヘッドレスモード、パーサーの最適化などを取り入れることで、堅牢で高速なスクレイピングシステムを構築できます。
最新の技術動向に常に目を向けつつ、ルールとマナーを守った安全なデータ収集を心がけてください。
Pythonを活用した自動化技術を磨き、業務効率化やデータ分析に役立てていきましょう。
