
Pythonでブラウザ自動化を行う際に便利なのが、Playwright というライブラリです。
この記事では、async_playwright と sync_playwright の基本的な意味や使い方から、具体的な使い分け方まで、初心者にもわかりやすく丁寧に解説します。
async_playwright とは?
async_playwright は、Playwrightライブラリの 非同期(async/await)版のAPI です。
Playwrightとは、ブラウザ(Chrome、Firefox、Safari)を自動操作するためのライブラリで、Webスクレイピングやテストの自動化に使用されます。
async_playwright を使うと、ブラウザの操作を非同期で実行でき、複数のタスクを効率的に並行処理できます。
これにより、大量のページを同時にスクレイピングしたり、複数のブラウザを並行で操作することが可能になります。
async_playwright の基本的な使い方
async_playwright を使った基本的なブラウザ操作を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import asyncio from playwright.async_api import async_playwright async def main(): async with async_playwright() as p: browser = await p.chromium.launch() page = await browser.new_page() await page.goto("https://example.com") title = await page.title() print(title) await browser.close() asyncio.run(main()) |
このコードでは、非同期でブラウザを起動し、ページを開いてタイトルを取得します。
await
キーワードを使うことで、非同期処理を順次実行しています。
async_playwright と sync_playwright の違い
両者の主な違いは以下の通りです。
- async_playwright
→ 非同期処理で並行実行が可能、高いパフォーマンス - sync_playwright
→ 同期処理で順次実行、シンプルで理解しやすい
実行方式
- async_playwright:
await
やasyncio.run()
が必要 - sync_playwright:通常のPython関数として実行
パフォーマンス
- async_playwright:複数タスクの並行処理で高速
- sync_playwright:単一タスクの順次処理
async_playwright の例
async_playwright をコード例です(前述のコードを再掲します。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import asyncio from playwright.async_api import async_playwright async def main(): async with async_playwright() as p: browser = await p.chromium.launch() page = await browser.new_page() await page.goto("https://example.com") title = await page.title() print(title) await browser.close() asyncio.run(main()) |
このコードでは、非同期でブラウザを起動し、ページを開いてタイトルを取得します。
各処理にawait
キーワードが入っていることが確認できるかと思います。
sync_playwright の例
一方、sync_playwright は同期版のAPIです。
通常のPythonコードのように順次実行されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from playwright.sync_api import sync_playwright def main(): with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto("https://example.com") title = page.title() print(title) browser.close() main() |
sync_playwright では await
は不要で、より直感的にコードを書けます。
使い分けの指針
async_playwright と sync_playwright は、次のような基準で使い分けるのがおすすめです。
- async_playwright を選ぶべき場面
→複数ページの同時スクレイピングや、大量データの処理で高速化が必要な場合に適しています。 - sync_playwright を選ぶべき場面
→単発のスクレイピングや、学習目的、プロトタイプ作成など、シンプルさを重視する場合に適しています。
すでに非同期処理を使っているプロジェクトならasync版、通常の同期コードならsync版を使うのが良いでしょう。
並行処理の比較例
async_playwright の真価は、複数のタスクを同時実行する際に発揮されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# async版:複数ページを並行処理 import asyncio from playwright.async_api import async_playwright async def scrape_page(page, url): await page.goto(url) return await page.title() async def main(): async with async_playwright() as p: browser = await p.chromium.launch() # 複数ページを並行で処理 tasks = [] urls = ["https://example.com", "https://google.com", "https://github.com"] for url in urls: page = await browser.new_page() task = scrape_page(page, url) tasks.append(task) results = await asyncio.gather(*tasks) print(results) await browser.close() asyncio.run(main()) |
この例では、3つのURLを同時並行で処理するため、sync版より大幅に高速化されます。
注意点
Playwrightを使う際には以下の点に注意しましょう。
async_playwright を使う場合は、必ず asyncio.run()
でメイン関数を実行する必要があります。
1 2 3 4 5 6 7 8 9 |
# NG:asyncio.run()なし async def main(): # 処理 main() # これではエラー # OK:asyncio.run()あり asyncio.run(main()) |
また、ブラウザのリソース管理のため、必ず browser.close()
でブラウザを閉じましょう。
並行処理数が多すぎると、メモリ不足やブラウザの応答不良を起こす可能性があります。
適切な制限を設けることが大切です。
まとめ
今回は async_playwright と sync_playwright の違いと使い分けを紹介しました。
- async_playwright は 非同期処理による高速な並行実行が可能
- sync_playwright は シンプルで理解しやすい同期処理
- 大量処理や複数タスクなら async版、単純な処理なら sync版
- 用途に応じて適切に選択することで効率的なブラウザ自動化が実現
Webスクレイピングやテスト自動化を効率よく行ううえで、Playwrightの非同期・同期APIの理解と使い分けは欠かせません。
Pythonでブラウザ自動化を行うなら、まず覚えておきたい基本知識のひとつです。