Playwright: современный браузерный скрейпинг
Playwright — современная альтернатива Selenium с авто-ожиданиями из коробки.
Playwright от Microsoft создавался для современного веба: он сам дожидается готовности элементов (auto-waiting), поддерживает Chromium, Firefox и WebKit и работает быстрее Selenium. Для нового проекта на динамике его часто выбирают по умолчанию.
Главное удобство Playwright — авто-ожидание: перед кликом или чтением текста он сам ждёт, пока элемент появится, станет видимым и кликабельным. Это убирает большую часть хрупких ручных ожиданий, которые приходится писать в Selenium. Установка ставит и сами браузеры:
pip install playwright
playwright install chromiumСкрейпер на Playwright (запускать локально):
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://quotes.toscrape.com/js/')
# авто-ожидание: Playwright сам дождётся появления .quote
page.wait_for_selector('.quote')
for el in page.query_selector_all('.quote .text'):
print(el.inner_text())
browser.close()Перехват сетевых запросов
Сильная сторона Playwright — доступ к сети страницы. Можно поймать тот самый JSON-ответ, который грузит JavaScript, и забрать данные напрямую, минуя разбор HTML:
def on_response(response):
if '/api/quotes' in response.url:
print('Поймали API:', response.url)
print(response.json())
page.on('response', on_response)
page.goto('https://quotes.toscrape.com/js/')Как работает под капотом
Playwright общается с браузером по протоколу CDP (Chrome DevTools Protocol) — более низкоуровневому и быстрому, чем WebDriver. Авто-ожидание реализовано как набор проверок «actionability»: перед действием Playwright убеждается, что элемент присоединён к DOM, видим, стабилен и принимает события. Перехват response вешается на сетевой слой браузера, поэтому ты видишь те же запросы, что и вкладка Network, — отличный способ найти скрытый API.
Контексты, ожидания и скриншоты
Playwright вводит понятие контекста браузера (browser context) — это как отдельный изолированный профиль со своими куки и хранилищем внутри одного запущенного браузера. Контексты лёгкие, поэтому можно вести несколько независимых сессий, не плодя тяжёлые процессы. Локаторы (page.locator(...)) в Playwright «ленивые»: они не ищут элемент сразу, а перепроверяют его в момент действия, что делает код устойчивее к мерцающему DOM.
Помимо сбора данных, Playwright удобен для отладки и фиксации. Метод page.screenshot() сохраняет снимок страницы — бесценно, когда скрейпер «не видит» элемент, и нужно понять, что реально отрисовалось. page.wait_for_load_state('networkidle') дожидается, пока стихнет сетевая активность, что помогает с сайтами, догружающими данные порциями. А поскольку Playwright поддерживает Chromium, Firefox и WebKit одним и тем же API, можно проверять поведение сайта в разных движках. Эти возможности делают его рабочим инструментом не только для скрейпинга, но и для автоматизированного тестирования — что лишний раз подчёркивает: технологии у тестировщиков и скрейперов общие.
Частые ошибки
- Путать sync и async API. У Playwright два интерфейса:
sync_playwrightиasync. Не смешивай их в одном коде. - Не закрывать браузер. Используй
with-блок или явныйbrowser.close(). - Игнорировать перехват сети. Часто проще поймать JSON, чем парсить отрисованный HTML.
Best practices
- Для новых проектов с динамикой пробуй Playwright раньше Selenium — меньше ручных ожиданий.
- Используй перехват
response, чтобы достать чистый JSON вместо разбора DOM. - Применяй
with sync_playwright()— он сам закроет ресурсы.
Отдельно отметим режим трассировки. Playwright умеет записывать подробный trace выполнения — со скриншотами, сетевыми запросами и DOM на каждом шаге, — который потом открывается в наглядном просмотрщике. Для скрейпинга это мощный инструмент отладки: когда сценарий «иногда не находит» данные, по трассировке видно, на каком шаге и почему. Вместе с авто-ожиданием и перехватом сети это делает Playwright особенно дружелюбным к новичку, который только учится укрощать капризную динамику современных сайтов.
Итог: Playwright — быстрый современный инструмент с авто-ожиданием и перехватом сети. Часто он позволяет вообще не парсить HTML, а забрать данные из пойманного JSON-ответа.