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-ответа.

Проверьте себя
1. В чём главное удобство Playwright по сравнению с Selenium?
AОн не требует интернета
BАвто-ожидание: Playwright сам дожидается готовности элемента перед действием
CОн парсит HTML без браузера
DОн работает только с картинками
2. Чем полезен перехват сетевых ответов (page.on('response', ...)) в Playwright?
AУскоряет загрузку картинок
BПозволяет поймать JSON-ответ API напрямую, минуя разбор отрисованного HTML
CБлокирует рекламу
DЭто нельзя использовать для скрейпинга