Продукты
Безлимитные прокси от $19/мес Ротационные прокси от $49/мес ISP прокси от $33/мес Персональные прокси от $3.50/мес UDP прокси от $5/мес Попробовать прокси
По целям
Парсинг и данные ИИ-сервисы Соцсети и мессенджеры Медиа и развлечения Все задачи →
Цены
Полная таблица цен Все 20 стран Гарантия возврата
Ресурсы
Блог MCP-сервер Инструкции по настройке Частые вопросы Для бизнеса О сервисе Партнёрская программа
Русский
English Русский

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

Puppeteer управляет Chrome, поэтому прокси задаётся «по-хромовски» — флагом запуска --proxy-server. Что Puppeteer добавляет от себя — это page.authenticate(), который программно отвечает на запрос логина и пароля, и прокси на отдельный контекст через createBrowserContext(). В этом гайде — все три приёма, плюс SOCKS5 и ротация прокси по списку.

Перед настройкой: данные прокси и порты

Вам понадобятся IP-адрес прокси и порт. И то и другое есть в личном кабинете — откройте активную подписку, там указаны все данные для подключения. Порт зависит от способа авторизации:

Авторизация Порт HTTP Порт SOCKS5 Кому подходит
Логин / пароль
данные из личного кабинета
8080 1080 Любая машина — вход выполняет page.authenticate() (только для HTTP-прокси)
Привязка по IP
логин и пароль не нужны
8085 1085 Серверы со статическим IP — код авторизации не нужен, обязательна для SOCKS5

При работе с привязкой сначала добавьте IP-адрес сервера в привязку в личном кабинете. После этого прокси принимает запросы с этой машины без логина и пароля — вызовы page.authenticate() из примеров ниже можно пропустить.

Прокси для всего браузера

Передайте флаг в args и, если работаете через порт с логином и паролем, вызовите page.authenticate() до первого перехода:

import puppeteer from 'puppeteer'; const browser = await puppeteer.launch({ args: ['--proxy-server=http://123.45.67.89:8080'], }); const page = await browser.newPage(); await page.authenticate({ username: 'ваш-логин', password: 'ваш-пароль', }); await page.goto('https://api.ipify.org'); console.log(await page.evaluate(() => document.body.innerText)); // выведет IP прокси await browser.close();

Это и есть решение классической проблемы «proxy authentication»: логин:пароль@ в адресе --proxy-server не работает — Chrome отбрасывает данные для входа. page.authenticate() вместо этого отвечает на запрос авторизации прокси через протокол DevTools. Вызывайте его на каждой странице, которая ходит через прокси, до goto(), а сами данные храните в переменных окружения, а не в коде.

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

Контекст браузера — это изолированный «профиль инкогнито» со своими куками и хранилищем, а начиная с Puppeteer 22 — и со своим прокси. Так один браузер может работать с несколькими аккаунтами или локациями одновременно:

const browser = await puppeteer.launch(); const context = await browser.createBrowserContext({ proxyServer: 'http://123.45.67.89:8080', }); const page = await context.newPage(); await page.authenticate({ username: 'ваш-логин', password: 'ваш-пароль', }); await page.goto('https://example.com');

В старых версиях Puppeteer (до 22-й) метод называется createIncognitoBrowserContext() и принимает ту же опцию proxyServer.

Прокси SOCKS5

Чтобы использовать SOCKS5, поменяйте схему во флаге:

args: ['--proxy-server=socks5://123.45.67.89:1085']

Важное ограничение: Chrome не поддерживает авторизацию для SOCKS5-прокси, и page.authenticate() тут не поможет — запроса логина, на который можно ответить, просто не будет. Поэтому для SOCKS5 используйте порт 1085 с привязкой по IP. Впрочем, для большинства задач в Puppeteer проще взять HTTP-прокси.

В мануалах по curl и Python requests встречается схема socks5h:// — там дополнительная «h» заставляет прокси резолвить доменные имена вместо вашей машины, чтобы DNS-запросы не уходили мимо прокси. Chrome такую схему не распознаёт, и она ему не нужна: по документации Chromium с обычной socks5:// резолвинг имён всегда выполняется на стороне прокси.

Как пустить часть хостов мимо прокси

Опция proxyBypassList перечисляет хосты, к которым нужно ходить напрямую — например, ваши собственные тестовые серверы:

const context = await browser.createBrowserContext({ proxyServer: 'http://123.45.67.89:8085', proxyBypassList: ['localhost', '*.internal.example.com'], });

Для прокси уровня запуска аналог — флаг --proxy-bypass-list рядом с --proxy-server в args.

Загрузка прокси из списка и ротация

С пакетом прокси адреса никто не вписывает в код руками: выгрузите весь список из личного кабинета в файл — по одному IP:порт на строку, порядок полей и разделитель настраиваются при выгрузке — и загружайте его в начале скрипта. Контексты создаются дёшево, поэтому «один контекст на прокси из списка» — стандартный паттерн ротации:

import fs from 'node:fs'; import puppeteer from 'puppeteer'; // proxies.txt — по одному адресу на строку: 123.45.67.89:8085 const proxies = fs.readFileSync('proxies.txt', 'utf8') .split('\n').map(s => s.trim()).filter(Boolean); const browser = await puppeteer.launch(); for (const address of proxies) { const context = await browser.createBrowserContext({ proxyServer: `http://${address}`, }); const page = await context.newPage(); await page.goto('https://example.com'); // ... парсим ... await context.close(); } await browser.close();

Если список работает на портах с логином и паролем (8080 для HTTP), новая выгрузка не нужна — задайте логин и пароль один раз константами и вызывайте page.authenticate() до первого перехода в каждом контексте:

import fs from 'node:fs'; import puppeteer from 'puppeteer'; const LOGIN = 'ваш-логин'; const PASSWORD = 'ваш-пароль'; // proxies.txt — по одному адресу на строку: 123.45.67.89:8080 const proxies = fs.readFileSync('proxies.txt', 'utf8') .split('\n').map(s => s.trim()).filter(Boolean); const browser = await puppeteer.launch(); for (const address of proxies) { const context = await browser.createBrowserContext({ proxyServer: `http://${address}`, }); const page = await context.newPage(); await page.authenticate({ username: LOGIN, password: PASSWORD }); await page.goto('https://example.com'); // ... парсим ... await context.close(); } await browser.close();

А если файл выгружен уже с данными для входа (строки вида логин:пароль@IP:порт), разбейте каждую строку по @: адрес уходит в proxyServer, а логин и пароль — в page.authenticate(); из самого URL прокси Chromium их не прочитает.

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

Если что-то не работает

Самые частые причины: ERR_TUNNEL_CONNECTION_FAILED или ERR_PROXY_CONNECTION_FAILED обычно означают, что порт не соответствует способу авторизации (см. таблицу) — либо, на портах 8085/1085, что IP машины не добавлен в привязку; net::ERR_INVALID_AUTH_CREDENTIALS или бесконечные ответы 407 значат, что page.authenticate() не вызван до перехода, вызван на другом объекте страницы или в данных из личного кабинета опечатка; а ошибка авторизации на SOCKS5-прокси означает, что от логина и пароля ждали работы там, где Chrome их не отправляет, — перейдите на порт 1085 с привязкой. Если дело не в этом — напишите нам в онлайн-чат прямо на этой странице, поможем подключиться.