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との違い
項目 | Playwright | Selenium |
---|---|---|
対応ブラウザ | Chromium, Firefox, WebKit | 主要なブラウザ全般 |
速度 | 高速 | やや遅め |
待機処理 | 自動 | 手動での待機が多い |
モダンWeb対応 | 強い | やや弱いことがある |
API設計 | 新しい・直感的 | 古く複雑な部分もある |
今回はplaywrightの概要、seleniumとの違いについて解説しましたが、次回以降ではplaywrightを使った具体的なスクレイピング方法、コード内容の詳細を解説したいと思います
コメント