Перейти к содержимому
Гайды 6 мин чтения 2 просмотров

Настройка прокси в Puppeteer для Node.js

Узнайте, как настроить прокси-серверы HTTP/S и SOCKS5 в Puppeteer для Node.js. Пошаговое руководство для повышения эффективности ваших скриптов.

Браузер

Настройка прокси в Puppeteer для Node.js осуществляется путем передачи аргумента --proxy-server при запуске браузера, что позволяет направлять сетевой трафик через указанный прокси-сервер, а для прокси с аутентификацией используются методы page.authenticate() или включение учетных данных в URL прокси.

Зачем использовать прокси с Puppeteer?

Использование прокси-серверов с Puppeteer позволяет управлять сетевым трафиком, обеспечивать анонимность и обходить географические или сетевые ограничения. Основные сценарии применения включают:

  • Ротация IP-адресов: Распределение запросов между множеством IP-адресов для предотвращения блокировок или превышения лимитов запросов на целевых веб-сайтах.
  • Обход географических ограничений: Доступ к контенту, доступному только в определенных регионах, путем маршрутизации трафика через прокси-сервер, расположенный в нужной стране.
  • Повышение анонимности: Скрытие реального IP-адреса клиента.
  • Тестирование: Симуляция различных сетевых условий или проверка доступности ресурса из разных точек мира.
  • Защита от блокировок: Маскировка активности автоматизированных ботов.

Типы прокси-серверов

Puppeteer поддерживает различные типы прокси-серверов, каждый из которых имеет свои особенности:

  • HTTP/HTTPS прокси: Работают на прикладном уровне (Layer 7). Предназначены для обработки HTTP и HTTPS трафика. Они могут изменять заголовки запросов.
  • SOCKS прокси (SOCKS4/SOCKS5): Работают на сессионном уровне (Layer 5). SOCKS5 является более универсальным, поддерживая любой тип TCP-трафика (и UDP), а также различные методы аутентификации. SOCKS4 поддерживает только TCP. SOCKS-прокси не модифицируют заголовки запросов, что делает их более "прозрачными".

Для Puppeteer, SOCKS5 прокси часто предпочтительнее из-за их универсальности и способности обрабатывать различные виды трафика без глубокого анализа содержимого.

Базовая настройка прокси

Базовая настройка прокси в Puppeteer выполняется путем передачи аргумента --proxy-server при запуске браузера Chromium.

Синтаксис аргумента --proxy-server

Формат аргумента зависит от типа прокси:

  • HTTP/HTTPS прокси: http://<IP_адрес>:<порт>
  • SOCKS4/SOCKS5 прокси: socks4://<IP_адрес>:<порт> или socks5://<IP_адрес>:<порт>

Пример настройки HTTP/HTTPS прокси

const puppeteer = require('puppeteer');

async function launchWithHttpProxy(proxyAddress) {
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${proxyAddress}`],
    headless: true, // Режим без головы
  });
  const page = await browser.newPage();
  await page.goto('https://checkip.amazonaws.com'); // Сайт для проверки IP
  const ip = await page.evaluate(() => document.body.textContent.trim());
  console.log(`IP-адрес, видимый сайтом: ${ip}`);
  await browser.close();
}

// Запуск с HTTP прокси
launchWithHttpProxy('http://192.168.1.100:8080');

Пример настройки SOCKS5 прокси

const puppeteer = require('puppeteer');

async function launchWithSocks5Proxy(proxyAddress) {
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${proxyAddress}`],
    headless: true,
  });
  const page = await browser.newPage();
  await page.goto('https://checkip.amazonaws.com');
  const ip = await page.evaluate(() => document.body.textContent.trim());
  console.log(`IP-адрес, видимый сайтом: ${ip}`);
  await browser.close();
}

// Запуск с SOCKS5 прокси
launchWithSocks5Proxy('socks5://192.168.1.101:1080');

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

Для прокси-серверов, требующих аутентификацию, Puppeteer предлагает два основных метода:

  1. Включение учетных данных непосредственно в URL прокси (только для HTTP/HTTPS).
  2. Использование метода page.authenticate().

Метод 1: Аутентификация через URL (только для HTTP/HTTPS)

Этот метод подходит для HTTP/HTTPS прокси, где учетные данные (логин и пароль) могут быть включены в URL прокси.

const puppeteer = require('puppeteer');

async function launchWithAuthenticatedHttpProxy(username, password, proxyHost, proxyPort) {
  const proxyAddress = `http://${username}:${password}@${proxyHost}:${proxyPort}`;
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${proxyAddress}`],
    headless: true,
  });
  const page = await browser.newPage();
  await page.goto('https://checkip.amazonaws.com');
  const ip = await page.evaluate(() => document.body.textContent.trim());
  console.log(`IP-адрес, видимый сайтом: ${ip}`);
  await browser.close();
}

// Запуск с HTTP прокси и аутентификацией
launchWithAuthenticatedHttpProxy('myuser', 'mypassword', '192.168.1.102', 8080);

Примечание: Использование учетных данных в URL может быть менее безопасным, так как они могут быть видны в логах или системных процессах.

Метод 2: Аутентификация через page.authenticate()

Этот метод является более безопасным и рекомендованным, особенно для SOCKS5 прокси, так как page.authenticate() работает на уровне страницы и не раскрывает учетные данные в аргументах запуска браузера.

const puppeteer = require('puppeteer');

async function launchWithAuthenticatedProxy(username, password, proxyAddress) {
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${proxyAddress}`],
    headless: true,
  });
  const page = await browser.newPage();

  // Установка учетных данных для прокси
  await page.authenticate({ username: username, password: password });

  await page.goto('https://checkip.amazonaws.com');
  const ip = await page.evaluate(() => document.body.textContent.trim());
  console.log(`IP-адрес, видимый сайтом: ${ip}`);
  await browser.close();
}

// Запуск с прокси (HTTP или SOCKS5) и аутентификацией
// Пример для HTTP:
launchWithAuthenticatedProxy('myuser', 'mypassword', 'http://192.168.1.103:8080');
// Пример для SOCKS5:
// launchWithAuthenticatedProxy('myuser', 'mypassword', 'socks5://192.168.1.104:1080');

Ротация прокси-серверов

Для крупномасштабного веб-скрейпинга или задач, требующих частой смены IP-адресов, применяется ротация прокси.

Ручная ротация прокси из списка

Простейший метод — поддерживать массив прокси-серверов и выбирать их по очереди.

const puppeteer = require('puppeteer');

const proxyList = [
  { address: 'http://proxy1.example.com:8080', auth: { username: 'user1', password: 'pass1' } },
  { address: 'socks5://proxy2.example.com:1080', auth: { username: 'user2', password: 'pass2' } },
  { address: 'http://proxy3.example.com:8080' }, // Прокси без аутентификации
];

let currentProxyIndex = 0;

async function getNextProxy() {
  const proxy = proxyList[currentProxyIndex];
  currentProxyIndex = (currentProxyIndex + 1) % proxyList.length;
  return proxy;
}

async function performTaskWithRotation(url) {
  const proxy = await getNextProxy();
  console.log(`Используем прокси: ${proxy.address}`);

  const browser = await puppeteer.launch({
    args: [`--proxy-server=${proxy.address}`],
    headless: true,
  });
  const page = await browser.newPage();

  if (proxy.auth) {
    await page.authenticate(proxy.auth);
  }

  try {
    await page.goto(url, { waitUntil: 'networkidle2' });
    const title = await page.title();
    console.log(`Заголовок страницы "${url}": ${title}`);
  } catch (error) {
    console.error(`Ошибка при доступе к ${url} через прокси ${proxy.address}:`, error.message);
  } finally {
    await browser.close();
  }
}

// Пример использования ротации прокси для нескольких задач
(async () => {
  await performTaskWithRotation('https://www.google.com');
  await performTaskWithRotation('https://www.bing.com');
  await performTaskWithRotation('https://www.yahoo.com');
})();

Для более сложных сценариев ротации, таких как использование пулов прокси с проверкой работоспособности и автоматическим переключением, рекомендуется использовать специализированные библиотеки или сервисы прокси-менеджеров.

Продвинутые сценарии

Исключение доменов из проксирования

Иногда требуется, чтобы определенные домены или локальные адреса не проходили через прокси. Это можно настроить с помощью аргумента --proxy-bypass-list.

const puppeteer = require('puppeteer');

async function launchWithProxyBypass(proxyAddress, bypassList) {
  const browser = await puppeteer.launch({
    args: [
      `--proxy-server=${proxyAddress}`,
      `--proxy-bypass-list=${bypassList}` // Например: "localhost,*.local,127.0.0.1"
    ],
    headless: true,
  });
  const page = await browser.newPage();

  // Запрос к сайту через прокси
  await page.goto('https://checkip.amazonaws.com');
  const proxyIp = await page.evaluate(() => document.body.textContent.trim());
  console.log(`IP через прокси: ${proxyIp}`);

  // Запрос к локальному хосту (должен обойти прокси)
  // Для демонстрации, предположим, что localhost не проксируется
  // В реальном сценарии нужен локальный веб-сервер
  await page.goto('http://localhost:8000'); // Этот запрос обойдет прокси
  console.log('Запрос к localhost обошел прокси.');

  await browser.close();
}

launchWithProxyBypass('http://your_proxy_ip:port', 'localhost,127.0.0.1,*.example.com');

Обработка SSL/TLS ошибок

Некоторые прокси-серверы могут вызывать ошибки SSL/TLS, особенно если они перехватывают и повторно подписывают трафик HTTPS (например, для инспекции). В таких случаях можно использовать опцию ignoreHTTPSErrors.

const puppeteer = require('puppeteer');

async function launchWithIgnoreSSLErrors(proxyAddress) {
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${proxyAddress}`],
    ignoreHTTPSErrors: true, // Игнорировать ошибки SSL/TLS
    headless: true,
  });
  const page = await browser.newPage();
  await page.goto('https://example.com'); // Сайт, который может вызвать ошибку SSL с прокси
  console.log('Страница загружена, ошибки SSL игнорированы.');
  await browser.close();
}

launchWithIgnoreSSLErrors('http://your_proxy_ip:port');

Предупреждение: Использование ignoreHTTPSErrors: true снижает безопасность, так как браузер перестает проверять подлинность SSL-сертификатов. Применяйте эту опцию с осторожностью и только для доверенных прокси или в контролируемых средах.

Сравнение типов прокси для Puppeteer

Характеристика HTTP/HTTPS Прокси SOCKS5 Прокси
Уровень работы Прикладной (Layer 7) Сессионный (Layer 5)
Типы трафика HTTP, HTTPS TCP, UDP (более универсальный)
Модификация заголовков Может модифицировать HTTP-заголовки Не модифицирует заголовки, "прозрачный"
Аутентификация Basic, Digest (через URL или page.authenticate()) Username/Password (page.authenticate() рекомендуется)
Производительность Зависит от реализации, может быть медленнее из-за парсинга HTTP Обычно быстрее для низкоуровневого трафика
Синтаксис в Puppeteer http://host:port socks5://host:port
Применимость Веб-скрейпинг, обход региональных блокировок Более гибкий, для любого сетевого взаимодействия

Устранение распространенных проблем

  • Прокси не работает / Ошибка соединения:
    • Проверьте правильность IP-адреса и порта прокси-сервера.
    • Убедитесь, что прокси-сервер доступен из вашей сети (нет блокировок фаерволом).
    • Проверьте, что прокси-сервер активен и функционирует.
  • Ошибка аутентификации:
    • Проверьте правильность логина и пароля.
    • Убедитесь, что используемый метод аутентификации (URL или page.authenticate()) соответствует типу прокси-сервера. SOCKS5 прокси обычно требуют page.authenticate().
  • SSL/TLS ошибки:
    • Если прокси перехватывает HTTPS трафик, может потребоваться ignoreHTTPSErrors: true.
    • Убедитесь, что корневой сертификат прокси-сервера установлен в системе, если это корпоративный прокси.
  • Медленная работа / Тайм-ауты:
    • Производительность прокси-сервера может быть низкой. Попробуйте другой прокси.
    • Целевой сайт может блокировать IP-адрес прокси или ограничивать скорость.
  • Прокси игнорируется:
    • Убедитесь, что аргумент --proxy-server передан корректно при запуске браузера.
    • Проверьте, не используется ли --no-proxy-server или другие конфликтующие аргументы.
Обновлено: 03.03.2026
Назад к категории

Попробуйте наши прокси

20,000+ прокси в 100+ странах мира