Реферальная программа
Разработка

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

Добавьте ротационные прокси в скрапинг на headless Chrome с Puppeteer.

Puppeteer управляет headless Chrome для скрапинга страниц с обилием JavaScript. Задайте прокси при запуске браузера - все страницы, открываемые этим экземпляром браузера, пойдут через SotaProxy.

Руководство по настройке

1

Установите Puppeteer

bash
npm install puppeteer

Puppeteer автоматически устанавливает встроенную версию Chromium.

2

Запуск с прокси

javascript
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    args: ['--proxy-server=http://proxy.sotaproxy.com:10000'],
  });

  const page = await browser.newPage();

  // Authenticate the proxy
  await page.authenticate({
    username: 'YOUR_USERNAME',
    password: 'YOUR_PASSWORD',
  });

  await page.goto('https://httpbin.org/ip');
  const content = await page.content();
  console.log(content);
  await browser.close();
})();

Задайте --proxy-server в аргументах запуска и вызовите page.authenticate() с вашими учётными данными. Puppeteer требует задавать учётные данные на каждую страницу, а не на браузер.

3

Гео-таргетинг

javascript
const browser = await puppeteer.launch({
  args: ['--proxy-server=http://proxy.sotaproxy.com:10000'],
});

const page = await browser.newPage();
await page.authenticate({
  username: 'YOUR_USERNAME_c_FR',  // French IP
  password: 'YOUR_PASSWORD',
});

Добавьте _c_XX к имени пользователя в page.authenticate() для таргетинга на конкретную страну.

Автоматизируй через SotaProxy API

Всё описанное выше работает без открытия дашборда. С API-ключом Puppeteer может получать свежие данные прокси, покупать новые и продлевать истекающие - прямо из кода.

javascript
const API = 'https://api.sotaproxy.com/api/v1'
const H = { Authorization: 'Bearer sk_live_your_key' }

// Every active proxy on your account - no copy-pasting credentials
const { proxies } = await (await fetch(`${API}/proxies`, { headers: H })).json()
const p = proxies[0]
const proxyUrl = `http://${p.login}:${p.password}@${p.ip}:${p.portHttp}`

// Buy more when you scale (price-check first with POST /quote)
await fetch(`${API}/orders`, {
  method: 'POST',
  headers: { ...H, 'Content-Type': 'application/json', 'Idempotency-Key': 'my-unique-order-id' },
  body: JSON.stringify({ product: 'ipv4', countryId: 565, periodId: '1m', quantity: 5 }),
})
Документация API

Почему Puppeteer требует двух шагов

Chromium берёт прокси из флага запуска, а в этом флаге нет места для учётных данных. Авторизация происходит потом и на каждой странице:

Ротация резидентки
login:password@proxy.sotaproxy.com:10000
Привязка к стране
login_c_US:password@proxy.sotaproxy.com:10000
Липкая на 15 минут
login_c_US_s_42_ttl_15m:password@proxy.sotaproxy.com:10000
Статический адрес (ISP, датацентр)
login:password@ваш-ip:50100, SOCKS5 на 50101

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

Один браузер на адрес

Запускайте с точкой входа, затем вызывайте page.authenticate до первого перехода:

Node: браузер на личность

const puppeteer = require('puppeteer');

async function browserFor(sessionId) {
  const browser = await puppeteer.launch({
    args: ['--proxy-server=http://proxy.sotaproxy.com:10000'],
  });
  const page = await browser.newPage();
  await page.authenticate({
    username: `login_c_US_s_${sessionId}_ttl_1h`,
    password: 'password',
  });
  return { browser, page };
}

const { page } = await browserFor(7);
await page.goto('https://example.com', { timeout: 30000 });
  • Вызывайте authenticate на каждой новой странице, а не один раз на браузер. Открытая позже страница стартует без авторизации, и первый запрос вернётся с 407.
  • Используйте отдельную папку профиля на каждый браузер. Иначе профили делят куки, и разделение адресов не даёт ничего.
  • Закрывайте браузеры, с которыми закончили. Каждый держит открытое соединение с нашей точкой входа, и утечка здесь потом выглядит как упор в лимит.
  • Для многих параллельных личностей контексты Playwright дешевле браузеров Puppeteer. Присмотритесь к этому, когда счёт переваливает за десяток.

Особенности Puppeteer

Учётные данные во флаге запуска не работают

--proxy-server принимает только хост и порт. Всё, что стоит до собаки, молча отбрасывается, и вы получаете 407.

Один прокси на процесс браузера

Прокси на контекст здесь не существует. Ротация означает запуск ещё одного браузера, и поэтому тяжёлой ротации место в Playwright.

authenticate действует на страницу

Новым вкладкам и всплывающим окнам нужен свой вызов, и потоки OAuth со всплывающим окном без него ломаются.

Определение headless это отдельная задача

Прокси чинит адрес, а не отпечаток. Дополняйте его стелс-мерами или антидетект-браузером, если работаете с аккаунтами.

Заметки и советы

  • Puppeteer требует page.authenticate() для каждой новой страницы. Playwright обрабатывает аутентификацию на уровне браузера (проще для многостраничных сессий).
  • Рассмотрите puppeteer-extra и puppeteer-extra-plugin-stealth для снижения детекции по отпечатку.
  • Для высоконагруженного скрапинга рассмотрите Playwright - он чище обрабатывает конфигурацию прокси на несколько контекстов.

FAQ

В чём разница между Puppeteer и Playwright для работы с прокси?

Playwright поддерживает конфигурацию прокси на уровне контекста браузера (чище для мультисессионных сетапов). Puppeteer требует аутентификации на каждую страницу. Оба работают с SotaProxy.

Может ли Puppeteer справляться с CAPTCHA?

Puppeteer не решает CAPTCHA нативно. Резидентные прокси снижают частоту CAPTCHA. Для оставшихся задач интегрируйте сервис решения CAPTCHA (2Captcha, Anti-Captcha).

Получи учётные данные прокси

Зарегистрируйся, пополни баланс и скопируй эндпоинт в Puppeteer. Займёт менее 5 минут.

Начать