MENU

PlaywrightでPythonスクレイピング|動的サイト入門

当ページのリンクには広告(PR)が含まれていることがあります。
【実践】Pythonでスクレイピング|playwrightで攻略のアイキャッチ
お悩み女子

ブラウザでは見えるのに、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スクレイピングする記事にあります。

スクロールできます
項目PlaywrightSelenium
ブラウザ専用のブラウザを playwright install でダウンロード(この確認では約720MB)PCに入っている Chrome などを使う。ドライバーは自動取得
待ち方クリックなどは自動で待つ。件数の確認は expectWebDriverWait で条件を書く
同じ動きのコードこの記事の例では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

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次