なぜ Playwright が必要か
requests + BeautifulSoup は HTML を そのまま取得して解析する。 しかし多くの現代的な Web アプリは、ページ読み込み後に JavaScript が実行されて フォームや INPUT 要素が動的に生成される。 この場合 requests が取得するのは「JS 実行前の空の HTML」になり、INPUT 要素が見つからない。
📌 Playwright が解決すること
Playwright は実際のブラウザ(Chromium / Firefox / WebKit)を裏で起動し、JavaScript を実行した後の 完成した DOM を取得する。この「JS 実行後の HTML」を BeautifulSoup に渡すことで、動的生成の INPUT 要素も抽出できる。
pip でのインストール
# 仮想環境が有効な状態で実行
pip install playwright
⚠️ pip だけでは動かない
pip install playwright はライブラリ本体のインストールにすぎない。次のステップ「ブラウザバイナリのインストール」を必ず実行すること。
ブラウザバイナリのインストール
Playwright は Chromium・Firefox・WebKit の各ブラウザを自前で管理する。
playwright install コマンドで使用するブラウザをダウンロードする。
# Chromium だけインストール(最小構成・本シリーズ推奨)
playwright install chromium
# 全ブラウザをインストール(Firefox・WebKit も含む)
playwright install
# インストール済みブラウザを確認
playwright install --dry-run
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 イメージを使うと依存関係が解決済みで楽。 |
# Ubuntu / Debian 系 Linux での依存ライブラリ一括インストール
sudo playwright install-deps chromium
動作確認コード
以下のスクリプトで「ブラウザが起動してページタイトルを取得できる」ところまで確認する。
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)は実際のブラウザ画面が開く。デバッグや動作確認に便利だ。
browser = p.chromium.launch(headless=False, slow_mo=500)
# slow_mo=500 は各操作の間隔を 500ms 遅らせる(目で追いやすくなる)
✅ 次の章では…
PART 05 では抽出対象となる INPUT 要素の種類・属性・Python の dataclass によるエンティティモデルの定義を解説します。