Начало работы - Библиотека
Установка
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. Чтобы изменить это поведение, см. параметры установки.
Использование
После установки вы можете import
Playwright в Python-скрипт и запускать любой из 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("http://playwright.dev")
print(page.title())
browser.close()
Playwright поддерживает две вариации 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("http://playwright.dev")
print(await page.title())
await browser.close()
asyncio.run(main())
Первый скрипт
В нашем первом скрипте мы перейдем на https://playwright.dev/
и сделаем скриншот в 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.dev/")
page.screenshot(path="example.png")
browser.close()
По умолчанию Playwright запускает браузеры в безголовом режиме. Чтобы увидеть интерфейс браузера, установите опцию headless в False
. Вы также можете использовать slow_mo для замедления выполнения. Узнайте больше в разделе инструментов отладки section.
firefox.launch(headless=False, slow_mo=50)
Интерактивный режим (REPL)
Вы можете запустить интерактивный python REPL:
python
а затем запустить Playwright в нем для быстрой экспериментации:
from playwright.sync_api import sync_playwright
playwright = sync_playwright().start()
# Используйте playwright.chromium, playwright.firefox или playwright.webkit
# Передайте headless=False в launch(), чтобы увидеть интерфейс браузера
browser = playwright.chromium.launch()
page = browser.new_page()
page.goto("https://playwright.dev/")
page.screenshot(path="example.png")
browser.close()
playwright.stop()
Асинхронный REPL, такой как asyncio
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.dev/")
await page.screenshot(path="example.png")
await browser.close()
await playwright.stop()
Pyinstaller
Вы можете использовать Playwright с Pyinstaller для создания автономных исполняемых файлов.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://playwright.dev/")
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 имеет автоожидание. Если вы все же полагаетесь на это, вы должны использовать page.wait_for_timeout(5000)
вместо time.sleep(5)
, и лучше вообще не ждать тайм-аута, но иногда это полезно для отладки. В этих случаях используйте наш метод ожидания (wait_for_timeout
) вместо модуля time
. Это связано с тем, что мы внутренне полагаемся на асинхронные операции, и при использовании time.sleep(5)
они не могут быть обработаны корректно.
несовместимость с SelectorEventLoop
из asyncio
на Windows
Playwright запускает драйвер в подпроцессе, поэтому он требует ProactorEventLoop
из asyncio
на Windows, потому что SelectorEventLoop
не поддерживает асинхронные подпроцессы.
На Windows Python 3.7 Playwright устанавливает цикл событий по умолчанию на ProactorEventLoop
, так как это значение по умолчанию в Python 3.8+.
Потоки
API Playwright не является потокобезопасным. Если вы используете Playwright в многопоточном окружении, вы должны создавать экземпляр Playwright для каждого потока. Подробнее см. проблему с потоками.