Socks5Proxy

Налаштування проксі у Puppeteer: підключення через --proxy-server та page.authenticate

Цей посібник пояснює, як підключити HTTP-проксі Socks5Proxy через аргумент --proxy-server та аутентифікацію page.authenticate у Puppeteer при запуску Chrome, як підключитися до SOCKS5 та запускати браузери з різними IP.

Як працює проксі у Puppeteer?

У Puppeteer проксі налаштовується через аргументи при запуску Chrome. --proxy-server визначає адресу проксі для всіх сторінок. Ім'я користувача та пароль для HTTP-проксі передаються через page.authenticate після відкриття сторінки, що дозволяє Puppeteer автоматично відповідати на запити автентифікації.

У прикладі використовується IP 198.51.100.23, HTTP порт 8000, SOCKS5 порт 1080, ім'я користувача spx_user, пароль spx_pass.

npm install puppeteer

Як підключити HTTP проксі з автентифікацією?

Додайте --proxy-server=198.51.100.23:8000 до args у launch, а одразу після створення сторінки через newPage передайте ім'я користувача та пароль до page.authenticate. Авторизацію потрібно виконувати для кожної нової сторінки.

HTTPS сайти відкриваються без проблем. Браузер створює CONNECT тунель, у якому відбувається зашифрований обмін даними.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  headless: true,
  args: ["--proxy-server=http://198.51.100.23:8000"],
});

const page = await browser.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });

await page.goto("https://api.ipify.org", { waitUntil: "domcontentloaded" });
console.log(await page.evaluate(() => document.body.innerText)); // proxy IP

await browser.close();

Як використовувати проксі SOCKS5?

Додайте адресу socks5:// до --proxy-server. Однак Chrome не підтримує автентифікацію за допомогою імені користувача та пароля для SOCKS-проксі, тому page.authenticate не працює з SOCKS5. Для підключення через SOCKS5 використовуйте IP-автентифікацію, зареєструвавши IPv4 сервера, де виконується цей код, у вашій панелі.

Якщо потрібне підключення за ім'ям/паролем, найпростіше використовувати HTTP-порт того самого IP. Цільовий сайт бачитиме ту саму IP та місцезнаходження.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  args: ["--proxy-server=socks5://198.51.100.23:1080"], // server IP is authorized in the dashboard
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

Як розділити браузери на різні IP?

Chrome використовує один проксі на один запущений браузер. Якщо потрібні різні IP, запускайте окремі вікна. Цей код отримує список ip:port:user:pass через API, відкриває 3 браузери з різними IP та виводить IP з кожної сторінки.

Відкриття багатьох вікон браузера споживає багато пам'яті. Рекомендується використовувати чергу завдань та обмежити кількість одночасних вікон.

import puppeteer from "puppeteer";

const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http", {
  headers: { Authorization: "Bearer " + KEY },
});
const lines = (await res.text()).trim().split("\n").slice(0, 3);

await Promise.all(lines.map(async (line) => {
  const [ip, port, user, pass] = line.trim().split(":");
  const browser = await puppeteer.launch({ args: ["--proxy-server=http://" + ip + ":" + port] });
  try {
    const page = await browser.newPage();
    await page.authenticate({ username: user, password: pass });
    await page.goto("https://api.ipify.org", { timeout: 30000 });
    console.log(ip, await page.evaluate(() => document.body.innerText));
  } finally {
    await browser.close();
  }
}));

Як відкривати сторінки швидше?

Проксі передають усі дані (зображення, шрифти, відео), що збільшує витрати трафіку та часу. Якщо вам потрібен лише текст, використовуйте page.setRequestInterception для блокування зайвих запитів - це прискорить роботу та зекономить трафік у спільних тарифах.

Значення waitUntil також важливе. networkidle0 чекає завершення всіх запитів, що може сповільнити роботу. Для пришвидшення використовуйте page.waitForSelector, щоб переходити до наступного кроку, як тільки з'являться необхідні елементи.

await page.setRequestInterception(true);
page.on("request", (req) => {
  const type = req.resourceType();
  if (type === "image" || type === "font" || type === "media") req.abort();
  else req.continue();
});

Чи можна використовувати різні IP для різних сторінок у одному браузері?

Параметр --proxy-server в Chrome застосовується до всього браузера, тому важко використовувати різні IP для різних сторінок. У Puppeteer 22+ можна використовувати browser.createBrowserContext з опцією proxyServer, щоб задати різні проксі для різних контекстів. Контексти мають окремі cookies та сховища, що ідеально підходить для роботи з кількома акаунтами.

Сторінки, створені в контексті, також можуть передавати логін та пароль через page.authenticate. Це вимагає менше пам'яті, ніж запуск кількох браузерів.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch();
const context = await browser.createBrowserContext({ proxyServer: "http://198.51.100.23:8000" });
const page = await context.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await context.close();
await browser.close();

Що потрібно налаштувати, щоб виглядати як користувач із цієї країни?

Встановіть Accept-Language за допомогою page.setExtraHTTPHeaders та часовий пояс за допомогою page.emulateTimezone відповідно до країни IP. Якщо мова або часовий пояс не відповідають країні IP, сторінка може відображатися некоректно.

Розмір екрана встановлюється через page.setViewport, а для емуляції мобільного пристрою використовуйте налаштування з KnownDevices у page.emulate Puppeteer.

await page.setExtraHTTPHeaders({ "Accept-Language": "ja-JP,ja;q=0.9" });
await page.emulateTimezone("Asia/Tokyo");
await page.setViewport({ width: 1366, height: 900 });

Як підтримувати стабільність браузера під час тривалих завдань?

Для стабільності краще закривати браузер після обробки певної кількості сторінок і відкривати новий, а не тримати його відкритим цілий день. Довго відкритий браузер споживає більше пам’яті, і помилка може зупинити всі наступні завдання.

Обов’язково викликайте page.close у блоках try і finally для кожної сторінки, а також додайте timeout до goto, щоб уникнути зависання на сторінках без відповіді. Якщо завдання не вдалося, спробуйте його знову з іншим проксі, відкривши новий браузер.

Фіксуйте час відгуку та помилки для кожного проксі - це допоможе виявити повільні проксі, звернутися до служби підтримки або змінити розподіл завдань.

Як вирішити поширені помилки?

Помилка net::ERR_INVALID_AUTH_CREDENTIALS або 407 виникає, якщо значення page.authenticate невірне або викликане після newPage. Переконайтеся, що виклик відбувається перед goto для кожної сторінки.

Помилка net::ERR_PROXY_CONNECTION_FAILED вказує на невірну адресу чи порт. Переконайтеся, що ви використовуєте HTTP-порт для HTTP-адрес та SOCKS5-порт для SOCKS5-адрес. Якщо підключення через SOCKS5 відхилено, перевірте, чи IP вашого сервера додано до списку дозволених для IP-авторизації.

Налаштування проксі у Puppeteer: автентифікація через page.authenticate | Socks5Proxy