Парсинг в современном мире – это скорее данность, чем просто необходимость. Практически любой бизнес собирает данные о конкурентах, о тенденциях на рынке, о товарах поставщиков, о самих поставщиках, о клиентах и т.д. Просто мало кто умеет автоматизировать процессы сбора информации. В основе автоматизации всегда программные решения – парсеры. Их можно написать с нуля, а можно использовать библиотеки, фреймворки и интеграции с внешними сервисами и инструментами.
Если вы планируете работать с сайтами, то встаёт вопрос обхода систем защиты и правильного отображения динамического контента. Лучше всего с такими задачами справляются актуальные версии браузеров. Но как их интегрировать с парсером? Есть два столпа: Playwright и Puppeteer. Название первого переводится на русский как «Драматург», а второго – как «Кукловод».
Ниже подробное сравнение: «Драматург против Кукловода».
Введение в Playwright и его возможности
Playwright – это библиотека автоматизации с открытым исходным кодом, разработанная корпорацией Microsoft для тестирования браузеров и сайтов. Последний пункт (автоматизация работы с сайтами) активно используется для задач парсинга.
Официальный сайт (обратите внимание: по умолчанию открывается версия для Python, но есть поддержка и других языков программирования).
Playwright впервые был представлен в 2020 году и очень быстро набрал популярность в среде веб-разработчиков.
Основное назначение библиотеки описывается тезисом: «Any browser. Any platform. One API». Что дословно переводится как «Любой браузер. Любая платформа. Один API».
Преимущества использования Playwright для веб-скрапинга
- Поддержка разных языков программирования и популярных фреймворков – Java, Python, .Net, JavaScript, TypeScript. Готовый плагин для Visual Studio.
- Совместимость со всеми популярными браузерными движками – Chromium (Google Chrome, Edge и т.п.), WebKit (Safari), Firefox. Браузеры могут запускаться с открытием или работать скрыто. Поддерживается быстрая установка сборок headless-браузеров (из собственного репозитория), все уже с готовыми драйверами управления.
- Максимальная кроссплатформенность – Windows, Linux, MacOS, эмуляция мобильных версий Chrome и Safari.
- Поддержка асинхронных вызовов из коробки – без дополнительных скриптов и «костылей», всё на уровне API. Есть CLI-режим.
- Playwright может работать удалённо, например, на внешнем сервере.
- Независимые контексты (экземпляры) на базе одного браузера. Данные будут надёжно изолированы друг от друга. Вместе с тем, можно авторизоваться один раз и аутентификация сохранится на уровне контекста.
- Поддерживается перехват сетевых запросов и ответов (интерсепторы).
- Не нужно прописывать явные условия ожидания показа элементов. В Playwright это реализуется автоматически.
- Простой и удобный синтаксис команд, единый для всех браузеров и платформ.
- Большой объём обучающих материалов, в том числе видео и мануалы по конкретным ситуациям, примеры кода.
- Большой набор инструментов для тестирования и трассировки. Можно делать скриншоты, записывать видео.
- Широкие возможности эмуляции поведения пользователей.
- За созданием и обслуживанием стоит крупный вендор – компания Microsoft.
- В реальных ситуациях применения показывает хорошую производительность и надёжность.
- Поддерживается работа с загрузкой файлов, заполнением форм и т.п.
В каких ситуациях стоит использовать Playwright
Библиотека Playwright идеально подходит для следующих задач:
- Парсинг простых HTML-сайтов.
- Работа с динамическим контентом, который рендерится непосредственно в браузере (JavaScript, AJAX).
- Обслуживание мультиаккаунтов (по аналогии с антидетект-браузерами).
- Тестирование и отладка web-приложений, в том числе тесты производительности, а также работа с мобильными и десктопными версиями.
- Создание скриншотов страниц.
- Интеграция со скриптами и web-сервисами, задействующими извлечение данных с внешних сайтов.
- Построение сложной архитектуры тестирования в крупных корпоративных проектах.
Итого: крутой фреймворк, который способен автоматизировать массу задач, связанных с парсингом и тестированием.
Введение в Puppeteer и его возможности
Puppeteer – это JavaScript-библиотека, разработанная командой Chrome Browser Automation (входит в состав официальных разработчиков Google Chrome), она реализует высокоуровневый API-интерфейс для протокола Chrome DevTools Protocol и драйвера WebDriver BiDi. В первую очередь такая прослойка нужна для унификации синтаксиса при написании скриптов тестирования сайтов и web-приложений.
Как можно догадаться, протокол Chrome DevTools предназначен для работы только с браузерами Google Chrome или Chromium.
Немного сложнее дела обстоят с веб-драйвером BiDi – с недавних пор он поддерживает работу с Firefox, поэтому при желании Puppeteer можно интегрировать не только с Хромом (как это изначально задумывалось), но и с Огнелисом.
Официальный сайт Puppeteer. Упоминание инструмента на портале для разработчиков Chrome DevTools.
Разработка Puppeteer ведётся с 2017 года (через год после запуска headless-Chrome). Существует упрощённая версия библиотеки, puppeteer-core, которая может интегрироваться с любым установленным в системе Chromium-браузером, например, с Edge.
Преимущества использования Puppeteer для веб-скрапинга
- Совместимость с браузерами на базе Chromium и Firefox.
- Кроссплатформенность (на самом деле библиотеке важно только наличие поддержки языка программирования, поэтому она может работать в любой операционной системе, в которой есть совместимый браузер).
- Это образец того, как может и должна выглядеть автоматизация браузера Хром на базе Node.js. Соответственно, можно задействовать языки программирования JavaScript и TypeScript.
- Взаимодействие с Хромом происходит без web-драйвера – через оригинальный протокол Chrome DevTools (проще и быстрее настройка, не нужно качать отдельный headless-браузер).
- Простой и понятный синтаксис.
- Возможность перехвата запросов (интерцепторы).
- Автоматическое ожидание показа элементов вёрстки + ряд специфических методов.
- Возможность параллельного выполнения сценариев с изолированием контекстов (экземпляров браузера).
- Новый экземпляр браузера по умолчанию запускается в headless-режиме и потребляет минимум вычислительных ресурсов.
- Возможность быстрого создания скриншотов и PDF-версий страниц.
- Базовый набор возможностей для тестирования и трассировки.
- За созданием и обслуживанием стоит крупный вендор – компания Google.
В каких ситуациях стоит использовать Puppeteer
Puppeteer подходит в основном для простых задач, связанных с браузером Chrome. С библиотекой не получится быстро реализовать сложных корпоративных систем тестирования, но с задачами парсинга Puppeteer сможет справиться на «ура». Итак, в каких ситуациях её можно использовать:
- Парсинг простых и динамических сайтов.
- Тестирование и отладка web-приложений, в том числе нагрузочное тестирование.
- Создание скриншотов и PDF-версий страниц.
- Визуализация web-приложений.
- Ведение мультиаккаунтов и эмулирование цифровых отпечатков пользователей (через плагины).
При определённых усилиях на базе Puppeteer можно организовать удалённый сервер, который будет выполнять задачи и отдавать результат по API.
Playwright против Puppeteer: сравнение функций
Если не вдаваться в детали, то обе библиотеки можно использовать фактически для одних и тех же задач: парсинг и тестирование. И там, и там есть поддержка асинхронности, кроссплатформенность и т.п. Но есть и нюансы, которые делают инструменты различными.
Сначала ключевые технические отличия:
- Puppeteer работает только с одним языком программирования – JavaScript. Playwright поддерживает заметно больше языков.
- Puppeteer в первую очередь разрабатывается для тестирования Хрома и задействует его оригинальный протокол Chrome DevTools (CDP). Поддержка Firefox добавлена недавно, и она уступает по набору вызовов. Playwright поддерживает разные версии браузеров, API всегда единый.
- Puppeteer позволяет только делать скриншоты или генерировать PDF, а Playwright дополнительно умеет записывать видео.
Остальные различия рассмотрим в разрезе отдельных направлений (категорий).
Производительность
Так как Puppeteer работает напрямую с headless-протоколом Хрома, то он ожидаемо оказывается производительнее. Вот примеры реального тестирования библиотек на одной и той же задаче рендеринга.
Playwright отрабатывает немного медленнее, но это отставание нельзя назвать критическим.
По отзывам многих разработчиков Playwright оказывается выгоднее в определённых задачах, когда можно задействовать отправку целого пакета запросов или использовать шифрование end-to-end (E2E).
Гибкость и удобство использования
И там, и там простой синтаксис, а также достаточный набор методов для использования вызовов. Но Puppeteer фактически повторяет API Хрома (Chrome DevTools). Каждая новая версия библиотеки подстраивается под актуальную версию браузера и тесно с ним связана.
А Playwright – это универсальное средство, которое обеспечивает работу с разными браузерами. Вне зависимости от используемого языка программирования синтаксис API остаётся унифицированным. Поэтому Playwright по умолчанию гибче – библиотеку можно применять в большом количестве ситуаций.
Но на этом преимущества Playwright не заканчиваются. Так как инструмент поддерживается большим сообществом, для него легко найти готовые реализации скриптов под любые ситуации применения: парсинг, тестирование, запуск на удалённом сервере и т.п. Естественно, объём написания своего кода в этом случае сильно сокращается – не нужно выдумывать свой велосипед, достаточно взять что-то готовое.
Для Puppeteer тоже можно поискать нишевые решения, но их заметно меньше. Объём своего кода и сложность разработки существенного возрастают. Это не может не отразиться на гибкости и удобстве использования.
Например, работа с прокси, с мультиаккаунтами и т.п. – всё это возможно только с использованием специальных дополнений от сторонних разработчиков. У Playwright большинство таких решений есть в связанных репозиториях от тех же разработчиков или из коробки.
Резидентные прокси
Идеальные прокси для получения ценных данных со всего мира.
Обслуживание и обновление
Оба инструмента поддерживаются крупными вендорами и имеют открытый исходный код. Они регулярно обновляются, в них постоянно правятся найденные ошибки и добавляются новые функции.
Но есть незначительные нюансы:
- Так как экосистема Playwright масштабнее (с разными языками программирования и большим числом штатных дополнений/модулей), то количество ошибок и проблем будет неизбежно выше. Это логично, ведь чем больше кода нужно обслуживать, тем тяжелее за всем уследить.
- Puppeteer в противовес пока легче и имеет меньший объём кода, нацелен только на один язык программирования. Всё это способствует снижению числа ошибок и проблем. Библиотека быстрая и точная, как швейцарские часы. Тенденция на расширение наметилась только в последнее время – в связи с ростом интереса сторонних разработчиков.
В вопросе обслуживания Playwright и Puppeteer, можно сказать, условный паритет.
Но есть небольшой перевес в отношении поддержки – см. раздел про кривую обучения.
Масштабируемость
Playwright поддерживает функционал масштабирования из коробки – у него есть всё необходимое для сложных задач тестирования или парсинга, в том числе мануалы по развёртыванию на удалённых серверах.
Puppeteer тоже можно масштабировать, но для этого нужно приложить дополнительные усилия – как минимум нужно будет поискать готовые реализации под свои задачи в репозиториях сторонних разработчиков. Основная команда Puppeteer концентрирует свои усилия на ядре, то есть на самой библиотеке. А что вы будете делать с ней, зависит только от вашей фантазии и предметных знаний. Часть наиболее удачных примеров нишевых реализаций можно поискать в специальном разделе официального сайта Puppeteer – здесь.
Глобальное покрытие
Получите доступ к нашей прокси-сети с более чем 200 локациями и более чем 10 миллионами IP-адресов.
Кривая обучения
Google традиционно не любит общаться со своими пользователями. Документация к Puppeteer скудная и не рассчитана на новичков. Она оформлена по wiki-формату с массой перелинковок по терминам. Всё вместе читается и воспринимается очень тяжело.
Вместе с тем, обучение работе с Puppeteer может проходить проще и быстрее по причине того, что библиотека задействует протокол Chrome DevTools (без каких-либо веб-драйверов и т.п.) и имеет очень простой синтаксис вызовов. В итоге новичкам проще начать, а начать погружаться в детали можно по мере обучения.
Microsoft, напротив, предлагает бесплатный учебный курс, предоставляет видео, мануалы и подробную документацию. Всё вместе это облегчает процесс самостоятельного обслуживания скриптов на базе Playwright. Синтаксис вызовов нельзя назвать сложным, да и установка headless-браузеров происходит в автоматическом режиме.
Вместе с тем, так как возможностей у библиотеки больше, обучение работе с ней становится неизбежно сложнее. Но в итоге, когда знания по теме уже есть, можно создавать очень сложные и масштабные программные решения.
Общий итог Playwright vs Puppeteer
В Playwright парсинг и скрипты тестирования сайтов могут быть сложнее и масштабнее. Этому способствует комплексная экосистема и большое количество встроенных возможностей библиотеки.
В Puppeteer парсинг организовать проще и быстрее, но есть ряд ограничений: по языку разработки и по масштабированию. Зато отработка запросов к headless-браузеру занимает меньше времени и потребляет меньше вычислительных ресурсов. Чтобы создать сложные скрипты, придётся потрудиться больше, так как готовых решений на базе Puppeteer пока не так много.
Это и есть ключевые различия библиотек.
Лучшие практики для повышения эффективности парсинга с помощью любого инструмента
Если вам нужно написать качественный парсер, который сможет успешно избегать блокировок, нужно учесть следующие моменты:
- Не забывайте о технических заголовках. Часто антифрод-системы отслеживают признаки headless-браузеров и намеренно их блокируют. Чтобы этого избежать, нужно следить за user-агентом и другими параметрами, передаваемыми в HTTP-заголовках. Для скрытия следов есть готовые решения, такие как playwright-stealth или puppeteer-extra-plugin-stealth. Они скрывают особые флаги, например, headless: true, navigator.webdriver: true и другие. А также позволяют тонко настроить параметры кодеков, размера окна, языка, валюты и прочего.
- Следите за частотой запросов и таймингом между ними. Не стоит отправлять запросы слишком часто (это быстро выдаёт работу скрипта, так как люди не способны так быстро переходить от страницы к странице). Если запросы будут отправляться к целевому сайту через равные промежутки времени, то это тоже будет прямо указывать на попытку парсинга. Ни один человек не сможет открывать страницы с одинаковой периодичностью. Обязательно добавляйте задержки с элементами случайности.
- Используйте асинхронный подход. Если в Puppeteer свойство асинхронности активно по умолчанию, то в Playwright асинхронные запросы нужно указывать в явном виде. Не забудьте этого сделать.
- Опирайтесь на отображение определённого элемента страницы. Так как многие современные web-сайты и PWA-приложения используют динамический код, структура страницы может подгружаться постепенно. Самый логичный выход – дождаться отображения определённого элемента, чтобы убедиться, что загрузка завершена, и только потом приступать к парсингу. И Puppeteer, и Playwright имеют необходимый функционал.
- Следите за соблюдением правил сайта и директив robots.txt. Не нужно обходить страницы, посещение которых явно запрещено в robots.txt, так вы сами напрашиваетесь на бан. Плюс многие крупные площадки детально оговаривают ограничения и политику честного использования, вплоть до количества запросов, которое может делать клиент в единицу времени. Следите за их соблюдением и к вам не будет никаких вопросов.
- Уделите внимание цифровым отпечаткам. Особенно, если вы используете одновременно несколько аккаунтов на одном и том же сайте или параллельно запускаете несколько экземпляров браузеров. Чтобы имитировать уникальный отпечаток, нужно задать свой набор кук, разрешение экрана, модель видеокарты, часовой пояс, список установленных плагинов в браузере, версию и разрядность операционной системы и т.п. Полный список параметров в нашей статье про цифровые отпечатки.
- Работайте через прокси и обязательно ротируйте IP-адреса. Первый параметр, по которому защитные механизмы идентифицируют пользователей – это IP-адрес. По IP можно отследить владельца пула и примерное местоположение пользователя. На основе георасположения могут отдаваться разные версии страниц и сайтов. IP могут прогонятся по чёрным-спискам и спам-базам. Чтобы не вызывать никаких вопросов у антифрод-систем, нужно использовать качественные прокси – мобильные или резидентные. Если у вас большой объём запросов, то нагрузку логично распараллелить, а запросы от одного потока периодически отправлять с нового IP (чтобы избежать блокировки текущего адреса). Для этого нужно следить за ротацией прокси. Самый простой и надёжный вариант – приобрести ротируемые прокси. Они подключаются один раз, вся остальная логика настраивается в личном кабинете провайдера: таргетинг до города/оператора связи, время удержания, ротация при каждом новом запросе и т.п.
Полный гайд о том, как парсить сайты без блокировок.
Итоги и рекомендации
Обе библиотеки по-своему хороши. Playwright поддерживает работу с разными языками программирования, обеспечивает быструю установку headless-браузеров из специального репозитория, имеет массу встроенных функций и легко расширяется за счёт каталога официальных и неофициальных дополнений. С Playwright можно реализовывать серьёзные корпоративные решения.
Puppeteer лёгкая и быстрая библиотека, напрямую взаимодействует с уже установленным браузером Google Chrome по протоколу Chrome Devtools Protocol (CDP). Тоже расширяется и подходит для серьёзных задач. Но с ней объём кода в крупных проектах может быть больше, так как на базе Puppeteer пока мало готовых нишевых решений, да и документация откровенно слабая (рассчитана исключительно на профи).
Какую бы библиотеку вы ни выбрали, важно помнить о механизмах защиты целевых сайтов – чтобы избежать блокировок.
Ключевой аспект при массовом парсинге – обязательная работа через прокси с ротацией. Приобрести качественные ротируемые прокси (серверные, мобильные и резидентные) можно у нас. Froxy – это 10+ млн. IP по всему миру. Точность таргетинга до города и/или оператора связи. Ротация возможна по времени или при каждом новом запросе.