Skip to content
Intermediate / 2 min read

ProxyScrape + Puppeteer: Как маршрутизировать Node.js-скраперы через HTTP- и SOCKS5-прокси

Пошаговое руководство по настройке резидентных и датацентровых прокси ProxyScrape в Puppeteer, включая аутентификацию для HTTP-прокси и локальный релей для SOCKS5.

Windows macOS Linux Веб-скрейпинг

Обзор

Puppeteer — это библиотека Node.js для управления headless Chrome или Chromium. При масштабном скрапинге маршрутизация запросов через прокси необходима, чтобы избежать блокировок по IP и получить доступ к контенту с геоограничениями. В этом руководстве показано, как настроить резидентные и датацентровые прокси ProxyScrape в Puppeteer для протоколов HTTP и SOCKS5. Поскольку Chromium не поддерживает аутентифицированные SOCKS5-прокси напрямую, вы также узнаете, как настроить локальный релей с помощью gost, чтобы связать HTTP-аутентификацию с SOCKS5.

Предварительные требования

  • Node.js 18 или новее, установленный на Windows, macOS или Linux.
  • Аккаунт ProxyScrape с резидентными или датацентровыми прокси. Запишите хост, порт, имя пользователя и пароль прокси из панели управления ProxyScrape.
  • Базовое знакомство с JavaScript и командной строкой.

Шаг 1: Создание нового проекта Node.js

  1. Создайте новый каталог и инициализируйте проект:
    mkdir puppeteer-proxyscrape && cd puppeteer-proxyscrape
    npm init -y
    
  2. Установите Puppeteer:
    npm install puppeteer
    
    Это загрузит совместимую сборку Chromium.

Шаг 2: Настройка HTTP-прокси с аутентификацией

HTTP-прокси ProxyScrape поддерживают аутентификацию по имени пользователя и паролю. Puppeteer может передавать учётные данные прокси с помощью метода page.authenticate().

Создайте файл с именем http-proxy.js:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: true,
    args: [
      '--proxy-server=http://proxy.proxyscrape.com:12345' // Замените на ваш хост и порт ProxyScrape
    ]
  });

  const page = await browser.newPage();

  // Замените на ваше имя пользователя и пароль ProxyScrape
  await page.authenticate({
    username: 'your-username',
    password: 'your-password'
  });

  await page.goto('https://httpbin.org/ip', { waitUntil: 'networkidle2' });
  const content = await page.content();
  console.log(content);

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

Запустите скрипт:

node http-proxy.js

Вывод должен показать IP-адрес прокси, подтверждая правильность настройки.

Шаг 3: Ротация HTTP-прокси для каждого запроса

Для больших объёмов скрапинга ротируйте прокси для каждой страницы или запроса. Храните массив прокси и выбирайте один случайным образом или последовательно.

const proxies = [
  { host: 'proxy1.proxyscrape.com', port: 12345, username: 'user', password: 'pass' },
  { host: 'proxy2.proxyscrape.com', port: 12345, username: 'user', password: 'pass' }
];

function getRandomProxy() {
  return proxies[Math.floor(Math.random() * proxies.length)];
}

(async () => {
  const proxy = getRandomProxy();
  const browser = await puppeteer.launch({
    args: [`--proxy-server=http://${proxy.host}:${proxy.port}`]
  });
  const page = await browser.newPage();
  await page.authenticate({ username: proxy.username, password: proxy.password });
  await page.goto('https://httpbin.org/ip');
  // ...
  await browser.close();
})();

Если ваш тариф ProxyScrape предоставляет ротационный эндпоинт (один хост:порт, который меняет IP для каждого запроса), используйте его вместо управления списком.

Шаг 4: Использование SOCKS5-прокси через локальный релей

Chromium поддерживает SOCKS5-прокси, но не поддерживает аутентификацию по имени пользователя и паролю для них. Чтобы использовать SOCKS5-прокси ProxyScrape с аутентификацией, запустите локальный релей, который принимает HTTP без аутентификации и перенаправляет на аутентифицированный SOCKS5-прокси.

  1. Установите gost (простой прокси-релей). В macOS с Homebrew:

    brew install gost
    

    В Linux скачайте бинарный файл со страницы релизов gost. В Windows скачайте .exe с той же страницы.

  2. Запустите gost с HTTP-листенером и SOCKS5-форвардером:

    gost -L http://:8080 -F socks5://your-username:[email protected]:1080
    

    Замените имя пользователя, пароль, хост и порт на ваши данные SOCKS5 от ProxyScrape.

  3. Направьте Puppeteer на локальный HTTP-релей:

    const browser = await puppeteer.launch({
      args: ['--proxy-server=http://127.0.0.1:8080']
    });
    

    page.authenticate() не требуется, так как локальный релей выполняет аутентификацию.

  4. Проверьте с помощью той же проверки httpbin.org/ip.

Шаг 5: Проверка работы прокси

Используйте надёжный сервис эха IP, чтобы убедиться, что прокси активен и не раскрывает ваш реальный IP:

await page.goto('https://api.ipify.org?format=json');
const body = await page.evaluate(() => document.body.innerText);
console.log(JSON.parse(body).ip);

Сравните возвращённый IP с вашим фактическим IP.

Устранение неполадок

  • 407 Proxy Authentication Required: Убедитесь, что page.authenticate() вызывается перед page.goto(). Для SOCKS5 проверьте правильность учётных данных релея.
  • ERR_PROXY_CONNECTION_FAILED: Проверьте хост и порт прокси. Для SOCKS5 убедитесь, что релей gost запущен и доступен.
  • Ошибки SSL: Некоторые прокси могут не поддерживать туннелирование HTTPS. Используйте HTTP-прокси для HTTPS-целей или убедитесь, что ваш SOCKS5-прокси поддерживает CONNECT.
  • Медленные ответы: Резидентные прокси могут быть медленнее. Увеличьте тайм-ауты с помощью page.setDefaultNavigationTimeout(60000).
  • IP не меняется: Если используется статический список прокси, проверьте логику ротации. Если используется ротационный эндпоинт, проверьте, включена ли ротация ProxyScrape в вашей панели управления.

Итог

Вы успешно настроили HTTP- и SOCKS5-прокси ProxyScrape с Puppeteer. Для HTTP-прокси используйте --proxy-server и page.authenticate(). Для SOCKS5 запустите локальный релей с gost для обработки аутентификации. Ротируйте прокси для каждого запроса, чтобы распределить трафик и избежать блокировок. Всегда проверяйте ваш исходящий IP перед запуском большого скрапинга.