К содержимому

Puppeteer: ротация прокси на страницу, контекст или браузер

Выберите, что именно ротируется, и проверяйте выходной IP каждого запуска.

Три способа ротации

Три способа ротации
ПунктКак задаётся проксиЧто получаетеЦена
Контекст на проксиcreateBrowserContext({ proxyServer }) и page.authenticateОтдельные cookie и хранилище у каждого контекста, один процесс браузераНужно вести список прокси
Браузер на прокси--proxy-server при запуске (с proxy-chain, если у прокси есть логин)Полная изоляция, по процессу на каждыйБольше памяти на каждый прокси
Один ротируемый шлюзОдин --proxy-server и один логинНовый IP на каждое новое соединениеСписок не нужен; без сессии одна страница может выходить с нескольких IP

По страницам API Puppeteer и README proxy-chain (прочитано 13 ноября 2026) и фактам о продуктах Proxy302.

Почему нет прокси на страницу

В справочнике Puppeteer proxyServer указан как параметр контекста браузера: прокси для всех запросов этого контекста. Аргумент запуска действует на весь браузер. Открытую страницу нельзя перевести на другой прокси, поэтому наименьшая единица ротации — контекст.

Учётные данные передаёт Page.authenticate. Puppeteer предупреждает, что для этого в фоне включается перехват запросов, что может влиять на производительность, поэтому вызывайте его только на нужных страницах и до первого перехода.

Контекст на каждый прокси

import puppeteer from 'puppeteer'

const proxies = [
  { server: 'http://HOST1:2222', username: 'LOGIN1', password: 'PASSWORD1' },
  { server: 'http://HOST2:2222', username: 'LOGIN2', password: 'PASSWORD2' },
]

const browser = await puppeteer.launch()
for (const p of proxies) {
  const context = await browser.createBrowserContext({ proxyServer: p.server })
  const page = await context.newPage()
  await page.authenticate({ username: p.username, password: p.password })
  await page.goto('https://ipinfo.io/json')
  console.log(await page.evaluate(() => document.body.innerText))
  await context.close()
}
await browser.close()

Только пример. Замените HOST, LOGIN и PASSWORD значениями из «Мои активы». Каждый запуск печатает данные IP этого прокси.

Браузер на каждый прокси, с proxy-chain

Когда нужен целый браузер на прокси, флаг запуска принимает URL, но Chrome не берёт из него логин и пароль. Библиотека proxy-chain запускает небольшой локальный прокси с логином и возвращает локальный URL для --proxy-server; по окончании работы браузера его закрывают.

Chrome не поддерживает методы аутентификации SOCKS5, поэтому браузеру нужен HTTP-адрес.

Браузер на каждый прокси

import puppeteer from 'puppeteer'
import { anonymizeProxy, closeAnonymizedProxy } from 'proxy-chain'

const localUrl = await anonymizeProxy('http://LOGIN:PASSWORD@HOST:2222')
const browser = await puppeteer.launch({ args: [`--proxy-server=${localUrl}`] })
const page = await browser.newPage()
await page.goto('https://ipinfo.io/json')
console.log(await page.evaluate(() => document.body.innerText))
await browser.close()
await closeAnonymizedProxy(localUrl, true)

Только пример. Нужно сначала выполнить npm install puppeteer proxy-chain. Замените HOST, LOGIN и PASSWORD.

Один ротируемый шлюз

С динамическими резидентными прокси задаётся один прокси — proxy.proxy302.com, HTTP порт 2222, — а выходной IP меняется сам. Без сессии каждое новое соединение получает новый IP, а повторно используемое сохраняет его. Страница открывает несколько соединений, поэтому разные запросы одной страницы могут выходить с разных IP.

Если странице нужен один IP, создайте прокси с сессией; на Бюджетной линии в консоли есть 10, 30, 60 и 120 минут или своё число минут от 1 до 120. Для адреса, неизменного несколько дней, берите статический IP. Бюджетная линия стоит $1,50 за ГБ.

Один браузер, один шлюз

import puppeteer from 'puppeteer'

const browser = await puppeteer.launch({
  args: ['--proxy-server=http://proxy.proxy302.com:2222'],
})
for (let i = 0; i < 3; i++) {
  const page = await browser.newPage()
  await page.authenticate({ username: 'LOGIN', password: 'PASSWORD' })
  await page.goto('https://ipinfo.io/json')
  console.log(await page.evaluate(() => document.body.innerText))
  await page.close()
}
await browser.close()

Только пример. Замените LOGIN и PASSWORD значениями из «Мои активы». Если две страницы печатают один IP, соединение было использовано повторно: для следующей задачи возьмите новый контекст или браузер.

Выбор и проверка за 4 шага

  1. Шаг 1

    Решите, что должно оставаться вместе. Процессу входа нужен один IP на весь запуск: берите контекст или браузер на прокси либо сессию. Независимые загрузки страниц можно вести через шлюз.

  2. Шаг 2

    Скопируйте хост, порт, логин и пароль из «Мои активы» и выберите протокол HTTP, потому что в Chrome нет логина SOCKS5.

  3. Шаг 3

    Запустите один из примеров с двумя прокси или двумя запусками и сравните поле ip в ipinfo.io/json.

    Ожидаемый результат Разные IP у разных контекстов или запусков и один IP внутри сессии.

  4. Шаг 4

    Только после этого добавляйте реальную задачу. Соблюдайте условия сайтов и держите разумную частоту запросов.

Если ротация не работает

Каждый контекст печатает ваш собственный IP

Проверьте Страница создана из контекста, а не из браузера?

Решение Используйте context.newPage() и печатайте ipinfo.io/json для каждого контекста.

407 или бесконечный запрос логина

Проверьте page.authenticate должен выполняться до первого goto и с верным логином.

Решение Заново скопируйте логин и пароль из «Мои активы».

Шлюз даёт один и тот же IP на каждой странице

Проверьте Повторно используемое соединение сохраняет IP, а сессия закрепляет один IP намеренно.

Решение Закрывайте контекст или браузер между задачами либо создайте прокси без сессии.

Когда остановиться Если адрес прокси не подключается совсем, отправьте номер заказа в поддержку, а не продолжайте ротацию.

Частые вопросы

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

Для уже открытых страниц нет. Прокси задаётся на браузер при запуске или на контекст, наименьшая единица — контекст.

Как передать логин и пароль прокси?

Вызовите page.authenticate с логином и паролем до первого перехода или используйте proxy-chain, чтобы логин хранился в локальном прокси.

Меняет ли ротируемый прокси IP на каждый запрос?

Нет. Новый IP выдаётся на каждое новое соединение; повторно используемое соединение сохраняет IP.

Можно ли в Puppeteer использовать SOCKS5 с логином?

В Chrome нет: методы аутентификации SOCKS5 не поддерживаются. Используйте HTTP-адрес.

Какой продукт Proxy302 подходит для ротации?

Динамические резидентные — если нужен шлюз со сменой IP; список статических ISP-IP — если каждой задаче нужен постоянный адрес.

Ссылки и источники

5
  1. API Puppeteer: BrowserContextOptions

    Официальная документация · Проверено:

    Прочитано 13 ноября 2026: proxyServer — прокси-сервер (порт необязателен) для всех запросов контекста, логин и пароль задаются в Page.authenticate; proxyBypassList — список хостов без прокси.

  2. API Puppeteer: Page.authenticate

    Официальная документация · Проверено:

    Прочитано 13 ноября 2026: передаёт учётные данные для HTTP-аутентификации; для этого в фоне включается перехват запросов, что может влиять на производительность.

  3. README proxy-chain (apify/proxy-chain)

    Сторонний источник · Проверено:

    Прочитано 13 ноября 2026: anonymizeProxy запускает локальный открытый прокси, пересылающий на HTTP/HTTPS-прокси с аутентификацией, и возвращает его URL; closeAnonymizedProxy его закрывает; в примере Puppeteer запускается с --proxy-server, равным этому локальному URL.

  4. Заметки Chromium о настройке прокси

    Официальная документация · Проверено:

    Прочитано 13 ноября 2026: Chrome не поддерживает методы аутентификации SOCKSv5; --proxy-server принимает URI вида http:// или socks5://.

  5. Факты о продуктах и прайс Proxy302

    Наблюдение за продуктом · Проверено:

    Файл фактов сайта и описание линий, проверено 10 и 11 ноября 2026: вход динамических резидентных proxy.proxy302.com, HTTP порт 2222 и SOCKS5 порт 3333; Бюджетная линия $1,50 за ГБ; новый IP на каждое новое соединение, если не задана сессия; повторно используемые (keep-alive) соединения сохраняют IP; сессии Бюджетной линии от 1 до 120 минут; статические ISP-IP не меняются весь срок аренды.

Готовы попробовать?

Создайте аккаунт, пополните баланс и выберите ротируемый резидентный, статический ISP или дата-центр IP — настроить его в браузере можно за несколько минут.