python playwright モダンなスクレイピングツール

Python

Pythonの Playwright は、Microsoftが開発したブラウザの自動操作ライブラリで、ウェブアプリケーションの自動テストスクレイピングなどに使われます
Seleniumのようなツールに似ていますが、より高速でモダンな設計が特徴です


1.主な特徴

  • 複数ブラウザ対応
    Chromium(Chrome系)、Firefox、WebKit(Safari系)をサポート
  • ヘッドレス・ヘッドフル対応
    UIの表示有無を切り替えられる
  • 非同期処理に対応(async/await)
  • 自動的な待機処理
    ページ読み込みや要素の表示を自動で待機してくれる
  • スクリーンショット・PDF保存
    ページのキャプチャやPDF保存が簡単

非同期処理(asynchronous processing)とは?

非同期処理とはプログラムが時間のかかる処理(I/Oなど)を待たずに他の処理を進められる仕組みです

これがSeleniumとの大きな違いの一つです

特に、ネットワーク通信、ファイル操作、Webアクセスなど「待ち時間」がある処理に使われます
ここでは初心者にもわかりやすく、詳しく解説していきます


たとえば

お湯を沸かす間に皿洗いをする
お湯が沸くのをじっと待ってから皿を洗う

これが非同期処理同期処理の違いです。

非同期(async):待ち時間がある処理を”並行”に実行できる

同期(sync):一つの処理が終わるまで、他の処理は待つ

Pythonでの非同期の基本構文

要素説明
async def非同期関数の定義
await時間のかかる処理の前に使う
asyncio.run()非同期関数を実行する入り口
asyncio.gather()複数の非同期関数を並行実行

Playwrightでは、非同期処理を使うことで「待ち時間のある処理」を「同時に(並行して)」実行できます
では、何が同時に動いているのか?という点を詳しく解説します


✅ Playwrightで「同時に実行しているもの」とは?

🎯 主に以下のようなI/O(待ち時間のある処理)です

同時に動くもの説明
ページの読み込み (goto)ページが表示されるまでのネットワーク通信を待っている間に他の処理が可能
要素の表示待ち (wait_for_selector)DOMの読み込み・描画を待つ間に他ページの処理ができる
JavaScriptの実行結果待ち (evaluate)JSの返りを待つ間に他のページやタブを動かせる
複数タブの操作タブごとに並行して処理可能(ログイン+データ取得など)
ファイルのダウンロード待ち完了までの待ち時間中に他処理が可能
スクリーンショットやPDFの生成完了までの間も他処理を進められる

🧪 例 複数のページを同時に開いて処理

以下は Playwright を使って、3つのページを同時に読み込んでタイトルを取得する非同期コード例です

import asyncio
from playwright.async_api import async_playwright

async def fetch_title(page, url):
    await page.goto(url)
    title = await page.title()
    print(f"{url} → {title}")

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        context = await browser.new_context()

        # 3つのページを開く
        page1 = await context.new_page()
        page2 = await context.new_page()
        page3 = await context.new_page()

        # 同時に処理(並行)
        await asyncio.gather(
            fetch_title(page1, "https://www.nikkei.com/"),
            fetch_title(page2, "https://news.yahoo.co.jp/"),
            fetch_title(page3, "https://www3.nhk.or.jp/news/")
        )

        await browser.close()

asyncio.run(main())

asyncio.gather() によって、3つの goto() が並行に走り、早く終わったページから順に結果が返るようになります


🎯 つまり:Playwrightで同時に動いているのは…

  • ページの読み込み処理
  • 要素の出現を待つ処理
  • ネットワーク通信・JSの実行待ち
  • 複数タブ/ウィンドウの並列処理

こうした「時間がかかる処理」を「待たずに」他のページや操作を並行で進められるのが非同期の力です


注意点

  • Pythonの非同期処理はCPUでは並列ではなく並行処理(concurrent)
  • CPUをガンガン使う処理(画像処理など)は非同期の対象外(→スレッドやプロセス)

Playwrightで「スクレイピング対象が複数あるとき」にこの仕組みを使えば、圧倒的に速く・安定した処理ができます

例えば「10個のニュースURLを非同期で巡回して中身を取得する」ような応用例もできます


2.主な用途

  • E2E(End-to-End)テスト
  • スクレイピング(JavaScriptで生成されたデータも取得可)
  • フォーム自動入力・送信
  • ログイン処理の自動化
  • ブラウザの操作ロボット(RPA的用途)

3.インストール方法

pip install playwright
playwright install

playwright install は、必要なブラウザ(Chromiumなど)をダウンロードします


4.サンプルコード(簡単なGoogle検索)

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://www.google.com")
    page.fill("input[name='q']", "Python Playwright")
    page.press("input[name='q']", "Enter")
    page.wait_for_timeout(3000)  # 結果読み込み待ち
    print(page.title())
    browser.close()

🔄 非同期バージョンの利用(async/await)

from playwright.async_api import async_playwright
import asyncio

async def run():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()
        await page.goto("https://example.com")
        print(await page.title())
        await browser.close()

asyncio.run(run())

5.Seleniumとの違い

項目PlaywrightSelenium
対応ブラウザChromium, Firefox, WebKit主要なブラウザ全般
速度高速やや遅め
待機処理自動手動での待機が多い
モダンWeb対応強いやや弱いことがある
API設計新しい・直感的古く複雑な部分もある

今回はplaywrightの概要、seleniumとの違いについて解説しましたが、次回以降ではplaywrightを使った具体的なスクレイピング方法、コード内容の詳細を解説したいと思います

コメント