お悩み女子requestsで取得したHTMLに、ブラウザで見えている商品が入っていない……どうすればいいの?
Seleniumでのスクレイピングは、プログラムからブラウザを操作して、JavaScriptで表示されたあとのページから情報を取り出す方法です。requests では取れないページに使えます。ただし、ブラウザを動かす分だけ重くなり、取得のルールは同じように守る必要があります。
Seleniumでブラウザを動かし、表示を待ってから取得する方法と、ボタンを押す方法を、動くコードつきで紹介します。取得するのは、example.com と自分のPC上の練習用ページだけです。規約の確認や requests の基本は、Pythonでスクレイピングする方法の記事にまとめています。
コードは Windows 11 で Python 3.12.10・selenium 4.51.0・Chrome 155 を使い、動くことを確かめています。example.com の内容は2026年10月18日時点のものです。
- requests で取れないページを見分ける方法
- Selenium の準備と、ブラウザの自動管理
- ブラウザを起動してページを取得する最小コード
- 表示を待つ方法と、ボタンを押す方法
- エラーが出たときに見る場所
Seleniumの導入前の確認|requestsで足りるかと取得ルール
Selenium を使う前に、requests で足りないことを確かめ、取得してよいかを確認します。
練習用ページの用意
作業用の site フォルダに、次の dynamic.html を UTF-8 で保存します。表示の1秒後に、JavaScriptが一覧の項目を3件足すページです。ボタンを押すと、さらに2件増えます。サーバーの起動のしかたは、Pythonでスクレイピングする方法の記事を見てください。
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>練習用(JavaScript表示)</title>
</head>
<body>
<ul id="items"></ul>
<button id="more" type="button">もっと見る</button>
<script>
const names = ["ボールペン 120円", "ノート 250円", "付箋 180円", "ファイル 300円", "クリップ 90円"];
let shown = 0;
function showMore(n) {
setTimeout(() => {
for (const name of names.slice(shown, shown + n)) {
const li = document.createElement("li");
li.className = "item";
li.textContent = name;
document.getElementById("items").appendChild(li);
}
shown += n;
}, 1000);
}
showMore(3);
document.getElementById("more").addEventListener("click", () => showMore(2));
</script>
</body>
</html>
requestsで取れないことの確認
まず requests と Beautiful Soup で、このページの項目を取り出してみます。
import requests
from bs4 import BeautifulSoup
res = requests.get("http://localhost:8765/dynamic.html", timeout=10)
soup = BeautifulSoup(res.content, "html.parser")
print(len(soup.select("li.item")))
print(soup.select_one("#items"))
0
<ul id="items"></ul>
li.item が0件で、ul の中が空です。項目は、ページを開いたあとにJavaScriptが足すため、requests が受け取るHTMLには入っていません。このように、ブラウザでは見えるのにHTMLに無いとき、Selenium の出番です。
取得してよいかの確認
ブラウザを動かしても、取得のルールは requests のときと同じです。規約と robots.txt の確認、間隔をあけること、ログインが必要なページを対象にしないことは変わりません。観点はスクレイピング前の規約確認の記事で整理しています。
Seleniumの準備|インストールとブラウザドライバーの自動管理
準備はライブラリを入れることと、ブラウザがあることの2つです。
インストールと確認
pip install selenium
python -c "import selenium; print(selenium.__version__)"
4.51.0
Chrome がPCに入っていることも確かめておきます。Python 自体の入れ方はPythonのインストール手順の記事にあります。
ドライバーの自動管理
ブラウザを操作するには、ブラウザごとの部品(ドライバー)が必要です。公式ドキュメントによると、Selenium には Selenium Manager が付いていて、ドライバーが見つからないときに、入っているブラウザに合うものを自動で取得します。
会社のPCで気をつけること
Selenium Manager はドライバーをインターネットから取得します。ネットワークの制限(プロキシなど)がある会社のPCでは、取得できないことがあります。公式ドキュメントによると、匿名の利用統計を1日1回送信し、止めるには環境変数 SE_AVOID_STATS を true にします。社内の決まりは情報システム担当に確認してください。
Seleniumでブラウザを起動してタイトルを取得する
まず、example.com を開いて中身を確かめる最小のコードを動かします。example.com はテストや監視に頼らない約束のドメインなので、動かすのは数回までにします。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
options = Options()
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
try:
driver.get("https://example.com/")
print(driver.title)
print(len(driver.find_elements(By.TAG_NAME, "p")))
print(driver.find_element(By.TAG_NAME, "a").text)
finally:
driver.quit()
実行結果は次のとおりです。
Example Domain
6
Learn more
タイトルのほかに、段落が6つと「Learn more」というリンクが取れました。requests で取ったHTMLには、段落が1つでリンクはありませんでした。ブラウザの中でJavaScriptが動き、段落とリンクを足しているためです。
--headless=new:ブラウザの画面を出さずに動かす指定find_elements:条件に合う要素をすべて取る(なければ空のリスト)
Seleniumの待機|JavaScriptで表示される項目の取得
動的なページは表示を待たずに取りにいくと空になります。待ち方には種類があるので、練習用ページで違いを確かめます。
待たずに取得すると空になる
前の章と同じ起動と終了の処理の間に、次の3行を書きます。
driver.get("http://localhost:8765/dynamic.html")
items = driver.find_elements(By.CSS_SELECTOR, "li.item")
print(len(items))
0
お悩み女子sleepで2秒ぐらい待てば、足りるんじゃないの?
ページを開いた直後は、まだ項目が足されていないため、0件でした。ここで time.sleep(2) のように固定の秒数で待つ方法もあります。ただ、公式ドキュメントでは、足りないと失敗し、多すぎると全体が遅くなる方法として紹介されています。
WebDriverWaitで待つ
公式ドキュメントが勧める方法の1つが、条件が満たされるまで待つ明示的な待機(WebDriverWait)です。次のコードは、li.item が現れるまで最長10秒待ちます。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
options = Options()
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
try:
driver.get("http://localhost:8765/dynamic.html")
wait = WebDriverWait(driver, 10)
items = wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "li.item"))
)
for li in items:
print(li.text)
finally:
driver.quit()
ボールペン 120円
ノート 250円
付箋 180円
項目が現れた時点で、待つのをやめて先へ進みます。最大の待ち時間を決めておくので、表示されないときは TimeoutException で止まります。なお、公式ドキュメントには暗黙の待機(implicit wait)と明示的な待機を混ぜないよう書かれています。
Seleniumのボタン操作|「もっと見る」で増える項目の取得
ブラウザを操作できる点が、Selenium の強みです。ここでは、「もっと見る」ボタンを押して、増えた項目まで取り出すコードを動かします。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
def count_items(driver):
return len(driver.find_elements(By.CSS_SELECTOR, "li.item"))
options = Options()
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
try:
driver.get("http://localhost:8765/dynamic.html")
wait = WebDriverWait(driver, 10)
wait.until(lambda d: count_items(d) >= 3)
print("最初の表示:", count_items(driver), "件")
wait.until(EC.element_to_be_clickable((By.ID, "more"))).click()
wait.until(lambda d: count_items(d) >= 5)
for li in driver.find_elements(By.CSS_SELECTOR, "li.item"):
print(li.text)
finally:
driver.quit()
最初の表示: 3 件
ボールペン 120円
ノート 250円
付箋 180円
ファイル 300円
クリップ 90円
流れは3つです。最初の3件が出るまで待ち、ボタンを押せる状態になるのを待ってクリックし、5件になるまで待ちます。件数の判定には自分で書いた条件(lambda)を使っています。最後に、画面の一覧と同じ5件であることを人が確かめます。
Seleniumのエラーと確認する場所
エラーの名前から、原因を絞ります。練習用ページで再現できた2つと、ブラウザが起動しないときの見る場所を紹介します。
TimeoutException
待っても条件が満たされなかったときに出ます。存在しない li.no-such-class を3秒待つと、次のように止まりました。
selenium.common.exceptions.TimeoutException: Message:
セレクタの綴りと、ページに本当に表示されているかを確かめます。開発者ツール(F12キー)で、要素の class を見られます。待ち時間を長くする前に、セレクタを疑います。
NoSuchElementException
待たずに find_element で探して、要素がなかったときに出ます。
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"li.no-such-class"}
「その条件の要素が見つからない」という意味です。表示が遅れているだけなら、WebDriverWait で待つ形に直します。
ブラウザが起動しない
起動のところで止まるときは、Chrome が入っているか、Selenium Manager がドライバーを取得できるネットワークか、の2点を見ます。取得できない環境では、ドライバーを自分で置く方法が公式ドキュメントにあります。
Seleniumでのスクレイピングに関するよくある質問
Selenium を使う前に、よくある疑問をまとめました。
- SeleniumとPlaywrightは、どちらを使えばよいですか?
-
どちらもJavaScriptで表示されるページを取得できます。すでにPCに Chrome が入っているなら、追加のブラウザを用意せずに始められる点が、Selenium の手軽さです。待つ処理は Playwright の方が短く書けます。比べ方はPlaywright の記事に短くまとめています。
- ログインが必要なページにも使えますか?
-
この記事では対象にしていません。規約や権限の問題があるためです。公式のAPIなど、データの提供方法がないかを先に確認してください。
- Chromeがアップデートされると、動かなくなりますか?
-
公式ドキュメントによると、Selenium Manager が入っているブラウザのバージョンを調べて、合うドライバーを取得します。手で入れ替える必要は基本的にありませんが、ネットワークの制限で取得できない環境では止まることがあります。
requestsとSeleniumの使い分け
Selenium でスクレイピングするポイントを整理します。
使う場面:ブラウザでは見えるのに、requests のHTMLに無いとき。ルールは requests と同じ。
準備:pip install selenium と Chrome。ドライバーは自動で取得される。
待ち方と操作:固定の秒数ではなく、WebDriverWait で条件を待つ。クリックのあとも待ってから取る。
まず、requests で足りるかを確かめてからSelenium に進むと、遠回りを減らせます。
基本の取得方法や、もう1つの選択肢は、次の記事で扱っています。
- Pythonでスクレイピングする方法|規約確認から保存まで
- 【実践】Pythonでスクレイピング|playwrightで攻略
- Pythonスクレイピングを始める前に確認する規約・robots.txt・アクセス負荷
参考資料
Selenium Manager | Selenium
待機 | Selenium
Seleniumライブラリのインストール | Selenium
