なぜ Playwright が必要か

requests + BeautifulSoup は HTML を そのまま取得して解析する。 しかし多くの現代的な Web アプリは、ページ読み込み後に JavaScript が実行されて フォームや INPUT 要素が動的に生成される。 この場合 requests が取得するのは「JS 実行前の空の HTML」になり、INPUT 要素が見つからない。

📌 Playwright が解決すること

Playwright は実際のブラウザ(Chromium / Firefox / WebKit)を裏で起動し、JavaScript を実行した後の 完成した DOM を取得する。この「JS 実行後の HTML」を BeautifulSoup に渡すことで、動的生成の INPUT 要素も抽出できる。

pip でのインストール

Shell — pip インストール
# 仮想環境が有効な状態で実行
pip install playwright

⚠️ pip だけでは動かない

pip install playwright はライブラリ本体のインストールにすぎない。次のステップ「ブラウザバイナリのインストール」を必ず実行すること。

ブラウザバイナリのインストール

Playwright は Chromium・Firefox・WebKit の各ブラウザを自前で管理する。 playwright install コマンドで使用するブラウザをダウンロードする。

Shell — ブラウザのインストール
# Chromium だけインストール(最小構成・本シリーズ推奨)
playwright install chromium

# 全ブラウザをインストール(Firefox・WebKit も含む)
playwright install

# インストール済みブラウザを確認
playwright install --dry-run
chromium インストール時の出力例
Downloading Chromium 124.0.6367.29 (playwright build v1117)...
  131.0 Mb [====================] 100% 0.0s
Chromium 124.0.6367.29 (playwright build v1117) downloaded to:
  C:\Users\user\AppData\Local\ms-playwright\chromium-1117

OS 別の注意事項

OS注意点対処
Windows 通常は追加作業不要。ただしアンチウイルスがブラウザ起動をブロックすることがある。 一時的にアンチウイルスの除外設定に ms-playwright フォルダを追加。
macOS Gatekeeper でブロックされる場合がある。 playwright install 後にシステム設定 → プライバシーとセキュリティで「許可」をクリック。
Linux(Ubuntu) ヘッドレス Chromium の依存ライブラリが不足することがある。 playwright install-deps chromium を実行。内部的に apt-get で依存パッケージを自動インストールする(sudo 権限が必要)。
Linux(CI / Docker) GUI が存在しないのでヘッドレスモードが必須。追加で --no-sandbox フラグが必要なことがある。 公式の mcr.microsoft.com/playwright/python Docker イメージを使うと依存関係が解決済みで楽。
Shell — Linux 依存パッケージインストール
# Ubuntu / Debian 系 Linux での依存ライブラリ一括インストール
sudo playwright install-deps chromium

動作確認コード

以下のスクリプトで「ブラウザが起動してページタイトルを取得できる」ところまで確認する。

Python — hello_playwright.py
from playwright.sync_api import sync_playwright

def main():
    with sync_playwright() as p:
        # Chromium をヘッドレスで起動
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()

        # ページを開いて待機
        page.goto("https://example.com", wait_until="networkidle")

        # タイトルを取得
        print("タイトル:", page.title())

        # ページ全体の HTML を取得(BeautifulSoup に渡せる)
        html = page.content()
        print("HTML 先頭100文字:", html[:100])

        browser.close()

if __name__ == "__main__":
    main()
実行結果
タイトル: Example Domain
HTML 先頭100文字: <html><head><meta charset="utf-8"><title>Example Domain</title>...

非同期 API もある

Playwright には sync_playwright(同期)と async_playwright(非同期)の両方がある。本シリーズでは可読性を優先して同期 API を使う。

ヘッドレス vs ヘッドフル

ヘッドレス(headless=True)はブラウザウィンドウを表示しない。CI や本番運用で使う。 ヘッドフル(headless=False)は実際のブラウザ画面が開く。デバッグや動作確認に便利だ。

Python — ヘッドフルで起動(デバッグ用)
browser = p.chromium.launch(headless=False, slow_mo=500)
# slow_mo=500 は各操作の間隔を 500ms 遅らせる(目で追いやすくなる)

次の章では…

PART 05 では抽出対象となる INPUT 要素の種類・属性・Python の dataclass によるエンティティモデルの定義を解説します。

→ PART 05 — INPUT 要素の整理へ