お悩み女子ブラウザでは見えるのに、requestsだと空になる。Playwrightを使えばいいと聞いたけれど、いきなり使っていいの?
Playwrightでスクレイピングとは、Python からブラウザを操作して、JavaScriptで表示されたあとのページから情報を取り出す方法です。ただ、使う前に確かめることがいくつかあります。確認せずにブラウザを動かすと、取得してはいけないページを取ってしまうおそれがあります。
この記事ではJavaScriptで表示されるサイトを取得する前の確認と、Playwrightで表示を待ってから取得する基本を、動くコードつきで紹介します。取得するのは、example.com と自分のPC上の練習用ページだけです。
コードは Windows 11 で Python 3.12.10・Playwright 1.64.0 を使い、動くことを確かめています。example.com の内容は2026年10月18日時点のものです。
- JavaScriptで表示されるサイトを取る前の4つの確認
- Playwright の準備と、ブラウザのダウンロード
- ブラウザを起動してページを取得する最小コード
- 表示を待つ方法と、ボタンを押す方法
- Selenium との違いと、エラーが出たときの見る場所
Playwrightで取得する前の4つの確認
ブラウザを動かす方法は手間も負担も大きいため、先に4つのことを確かめます。確認の結果、Playwright を使わずに済む場合もあります。
JavaScriptで表示されているか
ブラウザで「ページのソースを表示」(Chrome や Edge では Ctrl+U)を開き、欲しい文字があるかを探します。ソースに文字があれば、requests で取れます。無いのに画面には出ているなら、JavaScriptが後から足しています。
この記事の練習用ページでは、requests と Beautiful Soup で取った結果が0件で、一覧の ul の中は空でした。取り方の基本はPythonでスクレイピングする方法の記事にあります。
公式の提供手段があるか
サイトがAPI・CSVのダウンロード・RSSなどを公式に案内していないかを探します。あれば、そちらを使う方が確実です。画面の裏で使われているURLを直接呼ぶ方法は、サイトが公開している仕様でない限り、規約に触れることがあるため、この記事では扱いません。
規約・robots.txt・間隔
利用規約で自動取得が禁止されていないか、robots.txt で断られていないかを確かめ、取得するときは間隔をあけます。ブラウザを動かしても、ルールは requests のときと同じです。観点はスクレイピング前の規約確認の記事で整理しています。
ログインや個人情報の有無
ログインが必要なページや、個人情報を含むページは、この記事の対象にしません。規約や権限の問題が大きいためです。
Playwrightとブラウザの準備・動作確認
Playwright はライブラリを入れるだけでは動きません。専用のブラウザをダウンロードする手順も必要です。準備ができたら、最小のコードで動作を確かめます。
インストールとブラウザのダウンロード
pip install playwright
Python 3.8 以上が必要で、Windows は11以降が対象と、公式ドキュメントに書かれています。公式ドキュメントによると、Playwright の各バージョンは決まったバージョンのブラウザを必要とします。次のコマンドで、Chromium をダウンロードします。
playwright install chromium
この確認ではダウンロードに30秒ほどかかり、ブラウザ一式で約720MBのディスクを使いました(Playwright 1.64.0、Windows 11)。保存先はC:\Users\(ユーザー名)\AppData\Local\ms-playwright です。Playwright を更新したときは、再度ダウンロードが必要になることがあります。
会社のPCで気をつけること
ブラウザはPlaywright の配布元からインターネット経由で取得します。ネットワークの制限(プロキシなど)がある環境では、ダウンロードできないことがあります。公式ドキュメントには、プロキシを指定してダウンロードする方法も載っています。会社の決まりがある場合は、情報システム担当に確認してから進めてください。
最小コードで動作確認
まず、example.com を開いて中身を確かめる最小のコードを動かします。example.com はテストや監視に頼らない約束のドメインなので、動かすのは数回までにします。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com/")
print(page.title())
print(page.locator("p").count())
print(page.locator("a").inner_text())
browser.close()
実行結果は次のとおりです。
Example Domain
6
Learn more
タイトルのほかに、段落が6つと「Learn more」というリンクが取れました。requests で取ったHTMLには、段落が1つでリンクはありませんでした。ブラウザの中でJavaScriptが動き、段落とリンクを足しているためです。
sync_playwright():Playwright を使い始めて、終わると自動で片づけるp.chromium.launch():Chromium を起動する。公式ドキュメントによると、標準では画面を出さずに動くpage.locator("p").count():条件に合う要素の数を数える
Playwrightでの表示待ちと取得
動的なページは、表示を待たずに取りにいくと空になります。練習用ページで、待たない場合と待つ場合を比べます。
練習用ページの用意
作業用の 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>
待たずに取得すると空になる
ブラウザの起動と終了の処理の間に、次の行を書いて試します。
page.goto("http://localhost:8765/dynamic.html")
print(page.locator("li.item").all_inner_texts())
[]
お悩み女子ページを開いたのに、なぜ空のリストなの?
空のリストが返りました。公式ドキュメントでは、locator.all() は要素が出るのを待たず、その時点にあるものを返すと説明されています。項目が動的に読み込まれるときは、全体が出てから呼ぶようにと書かれています。
expectで表示を待つ
Playwright には、条件が満たされるまで自動でやり直す expect があります。次のコードは、li.item が3件になるまで最長10秒待ちます。
from playwright.sync_api import expect, sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("http://localhost:8765/dynamic.html")
items = page.locator("li.item")
expect(items).to_have_count(3, timeout=10000)
for text in items.all_inner_texts():
print(text)
browser.close()
ボールペン 120円
ノート 250円
付箋 180円
待つ条件が「件数が3件」と明確なので、途中で取りこぼす心配が減ります。固定の秒数で待つ time.sleep よりも、表示が遅れても早まっても対応できます。
Playwrightでボタンを押す|「もっと見る」で増える項目を取り出す
ブラウザを操作できる点が強みです。ここでは、「もっと見る」ボタンを押して、増えた項目まで取り出すコードを動かします。
from playwright.sync_api import expect, sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("http://localhost:8765/dynamic.html")
items = page.locator("li.item")
expect(items).to_have_count(3, timeout=10000)
print("最初の表示:", items.count(), "件")
page.get_by_role("button", name="もっと見る").click()
expect(items).to_have_count(5, timeout=10000)
for text in items.all_inner_texts():
print(text)
browser.close()
最初の表示: 3 件
ボールペン 120円
ノート 250円
付箋 180円
ファイル 300円
クリップ 90円
流れは3つです。最初の3件が出るまで待ち、ボタンの名前を指定してクリックし、5件になるまで待ちます。公式ドキュメントによると、クリックの前に、ボタンが見えていて操作できる状態かを自動で確かめて待ちます。最後に、画面の一覧と同じ5件であることを人が確かめます。
PlaywrightとSeleniumの比較
2つは同じ目的で使えるため、環境と手間で選びます。Selenium の詳しい使い方はSeleniumでPythonスクレイピングする記事にあります。
| 項目 | Playwright | Selenium |
|---|---|---|
| ブラウザ | 専用のブラウザを playwright install でダウンロード(この確認では約720MB) | PCに入っている Chrome などを使う。ドライバーは自動取得 |
| 待ち方 | クリックなどは自動で待つ。件数の確認は expect | WebDriverWait で条件を書く |
| 同じ動きのコード | この記事の例では17行(空行を含む) | Selenium の記事の例では28行(空行を含む) |
筆者なら、新しく環境を作れるなら Playwrightを選びます。待つ処理が短く書けるためです。会社のPCで追加のダウンロードが難しいときは、すでに入っている Chrome を使える Selenium が向いています。
Playwrightがうまく動かないとき|よくあるエラーと見る場所
エラーの文言から、原因を絞ります。練習用ページと、ブラウザ未ダウンロードの状態で再現できた2つを紹介します。
Executable doesn’t exist
ブラウザをダウンロードしていない状態で launch() を実行すると、次のエラーで止まります。
playwright._impl._errors.Error: BrowserType.launch: Executable doesn't exist at C:\Users\(ユーザー名)\AppData\Local\ms-playwright\chromium_headless_shell-1248\chrome-headless-shell-win64\chrome-headless-shell.exe
「ブラウザの実行ファイルが無い」という意味です。画面にも案内が出るとおり、playwright install を実行します。Playwright を更新したあとにも、同じエラーが出ることがあります。
expectの待ち時間切れ
存在しない li.no-such-class が1件になるのを3秒待つと、次のように止まりました。
AssertionError: Locator expected to have count '1'
Actual value: 0
続くログには「要素が0件と解決された」と出ます。待ち時間を延ばす前に、セレクタの綴りと、ページに本当に表示されているかを確かめます。
Playwrightでのスクレイピングに関するよくある質問
取得できる範囲、ブラウザの表示、ダウンロード容量についての疑問をまとめました。
- Playwrightなら、どんなサイトでも取得できますか?
-
技術的にブラウザで表示できても、取得してよいとは限りません。規約・robots.txt・ログインの有無・個人情報の扱いを先に確かめます。判断がつかないときは、取得しない選択もあります。
- ブラウザの画面を見ながら動かせますか?
-
公式ドキュメントによると、標準では画面を出さずに動き、見たいときは launch() の引数 headless に False を渡します。この記事のコードは画面を出さない形で確かめています。
- ダウンロードしたブラウザが大きいので、減らせますか?
-
公式ドキュメントに、画面を出さない実行だけなら、通常の Chromium のダウンロードを省ける方法(–only-shell)が載っています。使う前に、公式ドキュメントで条件を確認してください。この記事では試していません。
Playwrightの準備と取得時の確認
Playwright でスクレイピングするポイントを整理します。
取る前の確認:JavaScript表示か、公式の提供手段があるか、規約・robots.txt・間隔、ログインや個人情報の有無。
準備:pip install playwright のあと、playwright install chromium。ブラウザ一式は約720MB。
取得と待ち方:expect で件数が出るまで待ってから取り出す。クリックは自動で待つ。
選び方:新しく環境を作れるなら Playwright、追加のダウンロードが難しいなら Selenium。
requests で足りるかを先に確かめることが、いちばんの近道です。
基本の取得方法や、もう1つの選択肢は、次の記事で扱っています。
参考資料
インストール | Playwright Python
ブラウザ | Playwright Python
ライブラリ | Playwright Python
自動待機 | Playwright Python
Locator | Playwright Python
