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 одночасних з'єднань на план. На практиці раніше впретеся в пам'ять і процесор своєї машини: кожен браузер важкий. Почніть із кількох екземплярів і збільшуйте кількість, стежачи за помилками.

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