はじめに - ライブラリ
インストール
Pip
pip install --upgrade pip
pip install playwright
playwright install
Conda
conda config --add channels conda-forge
conda config --add channels microsoft
conda install playwright
playwright install
これらのコマンドはPlaywrightパッケージをダウンロードし、Chromium、Firefox、WebKitのブラウザバイナリをインストールします。この動作を変更するには、インストールパラメーターを参照してください。
使用法
インストール後、PythonスクリプトでPlaywrightをimportし、3つのブラウザ(chromium、firefox、webkit)のいずれかを起動できます。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://playwright.dokyumento.jp")
print(page.title())
browser.close()
Playwrightは、同期APIと非同期APIの2つのAPIバリエーションをサポートしています。モダンなプロジェクトでasyncioを使用している場合は、非同期APIを使用する必要があります。
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://playwright.dokyumento.jp")
print(await page.title())
await browser.close()
asyncio.run(main())
最初のスクリプト
最初のスクリプトでは、https://playwright.dokyumento.jp/に移動し、WebKitでスクリーンショットを撮ります。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.webkit.launch()
page = browser.new_page()
page.goto("https://playwright.dokyumento.jp/")
page.screenshot(path="example.png")
browser.close()
デフォルトでは、Playwrightはブラウザをヘッドレスモードで実行します。ブラウザのUIを表示するには、headlessオプションをFalseに設定します。slow_moを使用して実行を遅らせることもできます。詳細については、デバッグツールセクションを参照してください。
firefox.launch(headless=False, slow_mo=50)
インタラクティブモード(REPL)
インタラクティブPython REPLを起動できます
python
そして、その中でPlaywrightを起動して、素早い実験ができます
from playwright.sync_api import sync_playwright
playwright = sync_playwright().start()
# Use playwright.chromium, playwright.firefox or playwright.webkit
# Pass headless=False to launch() to see the browser UI
browser = playwright.chromium.launch()
page = browser.new_page()
page.goto("https://playwright.dokyumento.jp/")
page.screenshot(path="example.png")
browser.close()
playwright.stop()
asyncio REPLなどの非同期REPL
python -m asyncio
from playwright.async_api import async_playwright
playwright = await async_playwright().start()
browser = await playwright.chromium.launch()
page = await browser.new_page()
await page.goto("https://playwright.dokyumento.jp/")
await page.screenshot(path="example.png")
await browser.close()
await playwright.stop()
Pyinstaller
Pyinstallerを使用してPlaywrightをスタンドアロン実行可能ファイルを作成できます。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://playwright.dokyumento.jp/")
page.screenshot(path="example.png")
browser.close()
ブラウザを実行可能ファイルにバンドルする場合
- Bash
- PowerShell
- Batch
PLAYWRIGHT_BROWSERS_PATH=0 playwright install chromium
pyinstaller -F main.py
$env:PLAYWRIGHT_BROWSERS_PATH="0"
playwright install chromium
pyinstaller -F main.py
set PLAYWRIGHT_BROWSERS_PATH=0
playwright install chromium
pyinstaller -F main.py
ブラウザを実行可能ファイルにバンドルすると、バイナリが大きくなります。使用するブラウザのみをバンドルすることをお勧めします。
既知の問題
time.sleep()は古い状態を引き起こす
Playwrightには自動待機機能があるため、手動で待機する必要はほとんどありません。それでも手動での待機に頼る場合は、time.sleep(5)の代わりにpage.wait_for_timeout(5000)を使用すべきですが、タイムアウトを全く待たない方が良い場合もあります。しかし、デバッグには役立つこともあります。これらのケースでは、timeモジュールの代わりに私たちの待機(wait_for_timeout)メソッドを使用してください。これは、内部的に非同期操作に依存しており、time.sleep(5)を使用するとそれらが正しく処理されないためです。
Windows上のasyncioのSelectorEventLoopとの非互換性
Playwrightはドライバーをサブプロセスで実行するため、SelectorEventLoopが非同期サブプロセスをサポートしないため、Windows上ではasyncioのProactorEventLoopが必要です。
Windows Python 3.7では、Python 3.8以降のデフォルトであるため、PlaywrightはデフォルトのイベントループをProactorEventLoopに設定します。
スレッド処理
PlaywrightのAPIはスレッドセーフではありません。マルチスレッド環境でPlaywrightを使用する場合は、スレッドごとにPlaywrightインスタンスを作成する必要があります。詳細については、スレッド処理の問題を参照してください。