Гайд по Puppeteer · 1 мин чтения

Настройка прокси в Puppeteer с аутентификацией

Puppeteer принимает адрес прокси как флаг запуска, а логин и пароль передаются совсем иначе — через page.authenticate(). Показываем правильный паттерн для прокси s4m с полным кодом на Node.

Почему одного флага мало

Chromium — браузер, которым управляет Puppeteer, — принимает прокси через флаг командной строки --proxy-server. Загвоздка в том, что формат этого флага не принимает учётные данные внутри: написать --proxy-server=http://USER:PASS@host:3128 и надеяться, что сработает, не выйдет. Когда прокси требует аутентификацию, Chromium поднимает системное окно запроса пароля, на которое headless-браузер сам ответить не может.

Ответ Puppeteer — page.authenticate({ username, password }). Во флаге запуска вы указываете только хост и порт, учётные данные отдаёте странице, и дальше Puppeteer сам отвечает на вызов прокси 407 Proxy Authentication Required. Для s4m это значит запуск с --proxy-server=http://proxy.s4m.online:3128 и аутентификацию вашими USER:PASS. HTTP-эндпоинт (порт 3128) здесь правильный выбор: прокси-флаг Chromium понимает и HTTP, и SOCKS, но аутентифицированный SOCKS5 в браузере — сплошная морока, поэтому HTTP надёжнее. Смотрите обзор прокси и гайд по аутентификации на прокси.

Запуск Puppeteer с аутентификацией

Хост прокси идёт во флаг запуска, USER:PASS — через page.authenticate(). Перед запуском подставьте свои учётные данные.

javascript
// npm install puppeteer
const puppeteer = require("puppeteer");

const HOST = "proxy.s4m.online";
const PORT = 3128;             // HTTP proxy endpoint
const USER = "USER";
const PASS = "PASS";

(async () => {
  const browser = await puppeteer.launch({
    headless: "new",
    args: [
      `--proxy-server=http://${HOST}:${PORT}`,
      // credentials are NOT allowed here — see page.authenticate below
      "--no-sandbox",
    ],
  });

  const page = await browser.newPage();

  // This answers the proxy's 407 challenge:
  await page.authenticate({ username: USER, password: PASS });

  await page.goto("https://api.ipify.org?format=json", {
    waitUntil: "networkidle0",
    timeout: 30000,
  });
  console.log("Exit IP:", await page.evaluate(() => document.body.innerText));

  await browser.close();
})();

То, на чём люди спотыкаются

Ошибки, которые оборачиваются пустой страницей или 407.

Учётные данные — странице

Никогда не пишите USER:PASS в --proxy-server: Chromium их игнорирует. Всегда вызывайте page.authenticate() перед первым переходом, один раз на страницу.

Берите HTTP-эндпоинт

Аутентифицированный SOCKS5 в браузере работает ненадёжно. Направьте --proxy-server на http://proxy.s4m.online:3128, а вход оставьте page.authenticate.

Аутентификация до goto

Вызывайте page.authenticate() до page.goto(), иначе первый запрос придёт на прокси без учётных данных и вернёт 407.

Один контекст — одна идентичность

Каждый контекст браузера несёт собственную аутентификацию. Если нужно несколько идентичностей, поднимайте отдельные контексты, а не переаутентифицируйте общую страницу.

Блокировки, отпечатки и честность

Прокси прячет ваш IP, но не прячет того, что вы автоматизируете браузер. Современные анти-бот системы смотрят ещё и на свойства navigator, тайминги и отпечатки TLS. Если цель распознала headless Chromium, одним прокси это не починить: придётся выставлять реалистичные viewport и User-Agent, держать человеческий темп — да и тогда часть сайтов для автоматизации просто закрыта.

Будьте честны и насчёт типа прокси: у s4m они серверные, и это отлично для тестов, мониторинга и умеренно защищённых сайтов, но цели с серьёзной защитой могут блокировать серверные диапазоны. Когда нужен один стабильный выход для логина или белого списка, добавьте выделенный персональный IP. Предпочитаете Playwright? Схема почти та же — смотрите гайд по прокси в Playwright. Проверить свой выход можно инструментами, а прототипировать — на бесплатном списке прокси.

FAQ

Ответы на вопросы

Почему мой запрос из Puppeteer возвращает 407?

Потому что прокси требует аутентификацию, а вы на неё не ответили. Вызовите page.authenticate({ username, password }) до первого page.goto() — учётные данные во флаге --proxy-server Chromium игнорирует.

Может ли Puppeteer работать через SOCKS5?

Прокси-флаг Chromium умеет указывать на SOCKS, но аутентифицированный SOCKS5 в браузере работает ненадёжно. Для предсказуемой настройки берите HTTP-эндпоинт на порту 3128 вместе с page.authenticate().

Нужно ли аутентифицировать каждую страницу?

Да — вызывайте page.authenticate() один раз на страницу (или на контекст браузера) перед переходом. Каждый контекст несёт собственные учётные данные.

Спасёт ли прокси от обнаружения бота?

Нет. Прокси меняет только ваш IP. Анти-бот системы смотрят ещё и на отпечатки браузера и поведение, поэтому прокси — условие необходимое, но недостаточное против агрессивного обнаружения.

Запускайте headless Chrome через прокси

Аутентифицированные серверные прокси на proxy.s4m.online, готовые к page.authenticate() в Puppeteer. Оплата за потраченное, а для стабильных логинов есть выделенный IP.

Эту страницу нашли по запросу

Реальные поисковые фразы, на которые отвечает эта страница — по ссылкам откроются материалы, раскрывающие тему глубже.