Настройка прокси в Puppeteer

Прокси в Puppeteer: аргумент --proxy-server, логин через page.authenticate(), отдельный фиксированный порт для каждого браузера и экономия трафика.

Обновлено · Редакция Prokso

Данные для подключения
Хост
gw.prokso.com
Порт
823 HTTP · 824 SOCKS5 — новый IP на каждый запрос · 10000–20000 фиксированный IP (sticky-сессия), HTTP(S) и SOCKS5
Логин и пароль
в кабинете, на странице плана

Готовые строки в нужном формате генерирует кабинет: выберите страну, тип IP и протокол.

Коротко
  • Хост — gw.prokso.com, порты 823 (HTTP), 824 (SOCKS5), 10000–20000 (фиксированный IP, HTTP или SOCKS5)
  • Логин и пароль — в кабинете на странице плана
  • Проверяйте IP в ответе самого запроса через прокси: страница «Мой IP» в браузере ваш скрипт не проверяет
Прокси в Puppeteer: короткая видеоинструкция · 0:34

Пошаговая инструкция, как подключить прокси Prokso в Puppeteer. Займёт несколько минут.

Шаг 1. Возьмите данные прокси в кабинете

Откройте план и скопируйте хост gw.prokso.com, порт, логин и пароль. Порт 823 — HTTP, 824 — SOCKS5 (оба дают новый IP на каждый запрос); порты 10000–20000 — фиксированный IP до 120 минут, работают и как HTTP, и как SOCKS5 (каждый порт — отдельный адрес). Страну задают в логине: логин__cr.ua.

Блок «Доступ» на странице плана: хост, порты, логин и пароль для строки прокси
Блок «Доступ» на странице плана: хост, порты, логин и пароль для строки прокси

Шаг 2. Передайте прокси при запуске

Chromium в Puppeteer берёт прокси из аргумента --proxy-server. Укажите только хост и порт — без логина.

Шаг 3. Авторизуйтесь на странице

Логин и пароль передайте через page.authenticate() до первого перехода. Пример ниже откроет страницу и выведет IP прокси.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({ args: ["--proxy-server=http://gw.prokso.com:823"] });
const page = await browser.newPage();
await page.authenticate({ username: "USERNAME", password: "PASSWORD" });
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

Сохраните код как check.mjs и запустите node check.mjs.

Шаг 4. Один IP на сессию

Для работы с аккаунтами запускайте каждый браузер на своём фиксированном порту 10000–20000: так cookies и IP не перемешаются.

Шаг 5. Проверьте IP в запущенном браузере

Пример из шага 3 открывает https://api.ipify.org в браузере Puppeteer и печатает в консоль IP, который видит сайт, — он должен отличаться от вашего. Можно открыть и https://prokso.com/ru/tools/my-ip через page.goto(): там видна ещё и страна. Ваш обычный Chrome идёт без прокси и покажет ваш адрес.

Пример запуска: в выводе — IP прокси, а не ваш. На порту 823 каждый запуск даёт новый адрес
Пример запуска: в выводе — IP прокси, а не ваш. На порту 823 каждый запуск даёт новый адрес

Как сократить расход трафика

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

await page.setRequestInterception(true);
page.on("request", (req) => {
  // skip heavy resources: they are not needed for data collection
  const skip = ["image", "media", "font"].includes(req.resourceType());
  skip ? req.abort() : req.continue();
});

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

Отдельный IP для каждого браузера

Аргумент --proxy-server задаётся при запуске и действует на весь браузер. Сменить прокси у работающего браузера нельзя. Чтобы получить другой IP, запустите ещё один браузер с другим фиксированным портом или перезапустите текущий.

Для аккаунтов добавьте к прокси отдельную папку профиля через userDataDir: тогда у каждого аккаунта свои cookie и свой IP.

Если страница не открывается

  • net::ERR_PROXY_CONNECTION_FAILED. Браузер не достучался до прокси: проверьте хост и порт в аргументе запуска.
  • net::ERR_TUNNEL_CONNECTION_FAILED. Прокси ответил отказом: неверные логин и пароль или закончился трафик.
  • net::ERR_INVALID_AUTH_CREDENTIALS. page.authenticate() вызван после перехода или с опечаткой. Вызывайте его до первого page.goto().
  • Тайм-аут навигации. Через резидентские адреса страницы грузятся дольше. Увеличьте тайм-аут в page.goto().

Разбор первых двух ошибок — на страницах ERR_PROXY_CONNECTION_FAILED и ERR_TUNNEL_CONNECTION_FAILED.

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

Нужно ли вызывать page.authenticate() для каждой вкладки?

Да. Авторизация задаётся для страницы, поэтому вызывайте её для каждой новой вкладки до перехода.

Можно ли обойтись без логина и пароля?

Да. Добавьте IP компьютера или сервера в блок «Доступ по IP без пароля» на странице плана — тогда <code>page.authenticate()</code> не нужен.

Работает ли прокси в headless-режиме?

Да, одинаково в обоих режимах.