Настройка прокси в 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() до первого перехода:
Это и есть решение классической проблемы «proxy authentication»: логин:пароль@ в адресе --proxy-server не работает — Chrome отбрасывает данные для входа. page.authenticate() вместо этого отвечает на запрос авторизации прокси через протокол DevTools. Вызывайте его на каждой странице, которая ходит через прокси, до goto(), а сами данные храните в переменных окружения, а не в коде.
Свой прокси на каждый контекст
Контекст браузера — это изолированный «профиль инкогнито» со своими куками и хранилищем, а начиная с Puppeteer 22 — и со своим прокси. Так один браузер может работать с несколькими аккаунтами или локациями одновременно:
В старых версиях Puppeteer (до 22-й) метод называется createIncognitoBrowserContext() и принимает ту же опцию proxyServer.
Прокси SOCKS5
Чтобы использовать SOCKS5, поменяйте схему во флаге:
Важное ограничение: Chrome не поддерживает авторизацию для SOCKS5-прокси, и page.authenticate() тут не поможет — запроса логина, на который можно ответить, просто не будет. Поэтому для SOCKS5 используйте порт 1085 с привязкой по IP. Впрочем, для большинства задач в Puppeteer проще взять HTTP-прокси.
В мануалах по curl и Python requests встречается схема socks5h:// — там дополнительная «h» заставляет прокси резолвить доменные имена вместо вашей машины, чтобы DNS-запросы не уходили мимо прокси. Chrome такую схему не распознаёт, и она ему не нужна: по документации Chromium с обычной socks5:// резолвинг имён всегда выполняется на стороне прокси.
Как пустить часть хостов мимо прокси
Опция proxyBypassList перечисляет хосты, к которым нужно ходить напрямую — например, ваши собственные тестовые серверы:
Для прокси уровня запуска аналог — флаг --proxy-bypass-list рядом с --proxy-server в args.
Загрузка прокси из списка и ротация
С пакетом прокси адреса никто не вписывает в код руками: выгрузите весь список из личного кабинета в файл — по одному IP:порт на строку, порядок полей и разделитель настраиваются при выгрузке — и загружайте его в начале скрипта. Контексты создаются дёшево, поэтому «один контекст на прокси из списка» — стандартный паттерн ротации:
Если список работает на портах с логином и паролем (8080 для HTTP), новая выгрузка не нужна — задайте логин и пароль один раз константами и вызывайте page.authenticate() до первого перехода в каждом контексте:
А если файл выгружен уже с данными для входа (строки вида логин:пароль@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 с привязкой. Если дело не в этом — напишите нам в онлайн-чат прямо на этой странице, поможем подключиться.