Puppeteer или Playwright: что выбрать для работы с прокси

Чем отличаются Puppeteer и Playwright: браузеры, языки, настройка прокси, экономия трафика и выбор портов для многошаговых сценариев.

Редакция Prokso 6 мин чтения Гайды
Puppeteer или Playwright: что выбрать для работы с прокси
Коротко
  • Puppeteer — библиотека для Chrome и Firefox на JavaScript и TypeScript; Playwright поддерживает Chromium, Firefox и WebKit и языки JS/TS, Python, Java, .NET
  • В Puppeteer прокси обычно задают при запуске браузера, а логин и пароль передают через page.authenticate
  • В Playwright прокси с логином и паролем указывают при запуске или для отдельного контекста — удобно для нескольких профилей в одном браузере
  • Для входа в аккаунт и других многошаговых сценариев берите фиксированный порт 10000–20000, для независимых запросов — ротацию на 823 или 824
  • Блокировка картинок, шрифтов и видео через перехват запросов заметно сокращает расход трафика в обеих библиотеках

Puppeteer и Playwright решают одну задачу: управляют настоящим браузером из кода. Скрипт открывает страницы, нажимает кнопки, заполняет формы и забирает данные. Обе библиотеки умеют работать через прокси, но делают это по-разному.

Ниже — чем они отличаются, как в каждой подключить прокси, как сэкономить трафик и какие порты брать для разных сценариев. В конце — простое правило выбора.

Две библиотеки с общими корнями

Puppeteer появился раньше и развивается командой Chrome в Google. Долгое время он работал только с Chrome и Chromium, сейчас поддерживает ещё и Firefox. Пишут на нём на JavaScript или TypeScript в Node.js.

Playwright создан в Microsoft, и часть его авторов раньше работала над Puppeteer. Поэтому синтаксис похож, но Playwright с самого начала задумывался шире: несколько браузеров, несколько языков, встроенные инструменты для тестов.

Сравнение в одной таблице

Что сравниваемPuppeteerPlaywright
БраузерыChrome и Chromium, FirefoxChromium, Firefox, WebKit
ЯзыкиJavaScript, TypeScriptJavaScript, TypeScript, Python, Java, .NET
Где задаётся проксиАргумент --proxy-server при запуске браузераОпция proxy при запуске браузера или для отдельного контекста
Логин и пароль проксиpage.authenticate() на страницеПоля username и password в опции proxy
Разные IP в одном браузереОбычно один прокси на запуск, для разных IP — разные браузерыКаждый контекст со своим портом
Ожидание элементовЧаще пишется вручнуюАвтоожидание перед действиями
Тесты и запись действийНужен отдельный тест-раннерСвой раннер Playwright Test и генератор кода codegen
Перехват запросовpage.setRequestInterception()page.route() или context.route()

Браузеры и языки: с чего начинается выбор

Если ваша команда пишет на Python, Java или C#, вопрос почти решён. У Playwright есть официальные версии для этих языков с тем же набором функций. У Puppeteer официально только JavaScript и TypeScript, а сторонние порты на другие языки развиваются отдельно и отстают.

С браузерами похожая история. Puppeteer хорошо покрывает Chrome и Firefox. Playwright добавляет WebKit — движок, на котором работает Safari. Это важно, если вы тестируете сайт так, как его видят пользователи iPhone и Mac.

Как подключается прокси в Puppeteer

Chromium в Puppeteer берёт прокси из аргумента --proxy-server при запуске. В нём указывают только протокол, хост и порт — без логина. Логин и пароль передают отдельно, через page.authenticate(), до первого перехода на странице.

Главное следствие: прокси привязан к запуску браузера. Если нужны три разных адреса, обычно запускают три браузера, каждый на своём порту. В новых версиях прокси можно задать и для отдельного контекста, но авторизация всё равно идёт через страницу. Пошаговая настройка — в инструкции Puppeteer.

Пример ниже запускает браузер на фиксированном порту, отключает картинки, шрифты и видео и выводит адрес, который видит сайт:

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({ args: ["--proxy-server=http://gw.prokso.com:10001"] });
const page = await browser.newPage();
await page.authenticate({ username: "ЛОГИН", password: "ПАРОЛЬ" });

await page.setRequestInterception(true);
page.on("request", (req) => {
  if (["image", "font", "media"].includes(req.resourceType())) req.abort();
  else req.continue();
});

await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

Как подключается прокси в Playwright

Playwright принимает прокси вместе с логином и паролем в опции proxy: поля server, username и password. Отдельная авторизация на странице не нужна. Опцию можно передать при запуске браузера, и тогда прокси общий для всех страниц.

Второй вариант — задать прокси для контекста: browser.newContext({ proxy }). Контекст похож на отдельный профиль: свои cookies, хранилище и свой адрес. Так в одном браузере работают несколько профилей на разных фиксированных портах, и браузер не нужно запускать заново для каждого. В Python синтаксис такой же. Подробности — в инструкции Playwright.

import { chromium } from "playwright";

const browser = await chromium.launch();
const ports = [10001, 10002, 10003];

for (const port of ports) {
  const context = await browser.newContext({
    proxy: { server: `http://gw.prokso.com:${port}`, username: "ЛОГИН", password: "ПАРОЛЬ" },
  });
  await context.route("**/*", (route) =>
    ["image", "font", "media"].includes(route.request().resourceType()) ? route.abort() : route.continue()
  );
  const page = await context.newPage();
  await page.goto("https://api.ipify.org");
  console.log(port, await page.textContent("body"));
  await context.close();
}
await browser.close();

Каждый контекст здесь выходит через свой порт и получает свой адрес. Если открыть в них страницу проверки IP, вы увидите три разных IP одной страны.

Ограничение SOCKS5, общее для обеих

Chromium не принимает пароль для SOCKS5-прокси, и это касается и Puppeteer, и Playwright. Поэтому с логином и паролем удобнее работать по HTTP: порт 823 или фиксированные порты 10000–20000. Если нужен именно SOCKS5, включите в кабинете доступ по IP — до 5 адресов на план, без логина.

Что ещё даёт Playwright

Автоожидание — самое заметное отличие в работе. Перед кликом или вводом текста Playwright сам ждёт, пока элемент появится, станет видимым и доступным. Скрипты получаются короче и реже падают на медленных страницах, а через прокси страницы иногда грузятся дольше обычного.

Ещё два инструмента идут в комплекте. Playwright Test — тест-раннер с параллельным запуском, отчётами и трассировкой. Codegen записывает ваши действия в браузере и превращает их в готовый код, что сильно ускоряет первые шаги.

Зрелость и сообщество

У Puppeteer долгая история, поэтому на типовые вопросы много готовых ответов, примеров и сторонних модулей. Многие инструменты, которые подключаются к уже открытому браузеру, исторически предлагают примеры именно для Puppeteer.

Playwright моложе, но быстро вырос и активно развивается. Документация у него подробная, а примеры есть сразу для всех языков. Для новых проектов, особенно с тестами, его выбирают всё чаще.

Как сэкономить трафик в любой из них

Трафик в Prokso считается в обе стороны и оплачивается за гигабайты. Браузер загружает страницу целиком, и основную часть объёма часто съедают картинки, видео и шрифты. Если вам нужен только текст или данные, их можно не загружать.

  • В Puppeteer включите page.setRequestInterception(true) и отменяйте запросы с типами image, font и media.
  • В Playwright используйте page.route() или context.route() и вызывайте route.abort() для тех же типов.
  • Не открывайте одну и ту же страницу несколько раз за прогон: сохраняйте результат и берите его из кэша.
  • Закрывайте контексты и браузеры после задачи, чтобы фоновые запросы не тратили трафик впустую.

Прикинуть расход заранее поможет калькулятор трафика. Цены за гигабайт для каждого типа прокси — на странице тарифы.

Фиксированный порт или ротация

Выбор порта не зависит от библиотеки, он зависит от сценария. Если скрипт проходит несколько шагов на одном сайте — вход, подтверждение, корзина, — адрес не должен меняться посреди пути. Иначе сайт увидит, что один пользователь за минуту оказался в разных местах.

  • Многошаговый сценарий — фиксированный порт от 10000 до 20000 на gw.prokso.com. Он держит один адрес от 1 до 120 минут, по умолчанию 30. Время удержания выставьте с запасом на весь сценарий.
  • Независимые страницы, например сбор карточек товаров, — ротация: порт 823 для HTTP или 824 для SOCKS5, новый адрес на каждый запрос.
  • Несколько профилей параллельно — каждому свой фиксированный порт: отдельный браузер в Puppeteer или отдельный контекст в Playwright.

Учтите, что фиксированный резидентский или мобильный адрес может смениться раньше срока, если устройство ушло из сети. Порт тогда получит новый адрес той же страны. Хорошо, если скрипт умеет продолжить шаг после такой смены, а не падает с ошибкой. Подробнее о режимах — в глоссарии: sticky-сессия.

Как выбрать: короткое правило

  • Пишете не на JavaScript — берите Playwright.
  • Нужен WebKit или тесты в нескольких браузерах — Playwright.
  • Много профилей с разными адресами в одном процессе — удобнее Playwright с контекстами.
  • Уже есть рабочий код на Puppeteer или нужен только Chrome — смысла переписывать нет, Puppeteer справится.
  • Проект уже на Selenium и всё устраивает — оставайтесь на нём, прокси подключается и там.

Если вы на Selenium, посмотрите инструкцию Selenium. А если браузером управляет ИИ-агент, полезна статья прокси для ИИ-агентов: там те же правила про порты и трафик, только с поправкой на то, что агент действует сам.

В обоих случаях начните с малого: один скрипт, один порт, проверка адреса на странице мой IP. Когда всё работает, добавляйте профили и потоки. И помните, что прокси не отменяют правил сайта: темп запросов и условия площадки действуют на любом адресе.

Вопросы и ответы

Какую библиотеку выбрать новичку?

Если вы пишете на Python, Java или .NET, выбор простой — Playwright: у Puppeteer официальной поддержки этих языков нет. На JavaScript начать можно с любой. Playwright проще в тестах благодаря автоожиданию и встроенному раннеру, Puppeteer — когда нужна только автоматизация Chrome.

Можно ли в Puppeteer задать разный прокси для разных вкладок?

Классический способ — один прокси на запуск браузера через аргумент --proxy-server. В новых версиях можно указать прокси и для отдельного контекста браузера, но логин и пароль по-прежнему передают на странице. Если нужно много профилей с разными адресами, в Playwright это делается проще.

Почему не работает SOCKS5 с логином и паролем?

Chromium не принимает пароль для SOCKS5-прокси, и это касается обеих библиотек. Используйте HTTP-порты с логином и паролем или включите в кабинете доступ по IP — тогда SOCKS5 работает без пароля.

Какой порт брать для входа в аккаунт?

Фиксированный, из диапазона 10000–20000. Он держит один адрес от 1 до 120 минут, по умолчанию 30, поэтому вход, подтверждение и следующие шаги идут с одного IP. Порты 823 и 824 меняют адрес на каждый запрос и подходят для сбора независимых страниц.

Сколько браузеров можно запускать параллельно?

Со стороны Prokso ограничение — до 1000 одновременных соединений на план. На практике раньше упрётесь в память и процессор своей машины: каждый браузер тяжёлый. Начните с нескольких экземпляров и увеличивайте число, следя за ошибками.

Читайте также