Использование прокси в Node.js (Axios + Puppeteer + SDK)

Руководство по настройке прокси в Node.js с Axios, Puppeteer, Playwright и ProxyHat SDK. Примеры кода для ротации IP, геотаргетинга, обработки ошибок и параллельного парсинга.

Использование прокси в Node.js (Axios + Puppeteer + SDK)

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

Node.js — одна из самых популярных платформ для создания веб-скраперов, интеграций с API и инструментов автоматизации. Однако если вы отправляете сотни или тысячи запросов с одного IP-адреса, вы очень быстро столкнётесь с лимитами запросов, капчами и полной блокировкой IP. Прокси в Node.js решают эту проблему, направляя ваши запросы через разные IP-адреса — каждый из них выглядит как запрос от нового пользователя.

Будь то парсинг цен на товары, мониторинг позиций в поисковых системах или сбор публичных данных в больших объёмах — прокси являются ключевым элементом инфраструктуры. В этом руководстве мы подробно разберём всё, что нужно для интеграции резидентных прокси в ваши Node.js-проекты с помощью ProxyHat Node SDK, Axios, Puppeteer и Playwright.

Если вы ещё выбираете, какой тип прокси подходит для вашей задачи, ознакомьтесь с нашим сравнением резидентных, серверных и мобильных прокси.

Установка и настройка

Установка ProxyHat SDK

Самый быстрый способ начать работу — использовать официальный Node SDK. Он берёт на себя аутентификацию, ротацию и управление пулом соединений:

npm install proxyhat

Также установите HTTP-клиенты, которые планируете использовать:

npm install axios puppeteer playwright

Аутентификация

Все прокси-соединения ProxyHat аутентифицируются с помощью ваших API-ключей. Имя пользователя и пароль можно найти в панели управления ProxyHat. SDK принимает их как параметры конструктора или переменные окружения:

// Option 1: Pass credentials directly
const ProxyHat = require('proxyhat');
const client = new ProxyHat({
  username: 'your_username',
  password: 'your_password',
});
// Option 2: Use environment variables
// Set PROXYHAT_USERNAME and PROXYHAT_PASSWORD in your .env
const client = new ProxyHat();

Простой GET-запрос через SDK

SDK предоставляет высокоуровневый метод fetch, который автоматически управляет ротацией прокси:

const ProxyHat = require('proxyhat');
const client = new ProxyHat();
async function main() {
  const response = await client.fetch('https://httpbin.org/ip', {
    country: 'us',
  });
  console.log('Status:', response.status);
  console.log('Body:', await response.text());
}
main().catch(console.error);

Каждый вызов автоматически выбирает новый резидентный IP-адрес. Никакого ручного формирования URL прокси не требуется.

Использование прокси с Axios

Axios — самый популярный HTTP-клиент в экосистеме Node.js. Чтобы направить запросы Axios через ProxyHat, можно использовать либо прокси-агент из SDK, либо настроить Axios напрямую.

Способ 1: Прокси-агент SDK

const ProxyHat = require('proxyhat');
const axios = require('axios');
const client = new ProxyHat();
const agent = client.createAgent({ country: 'us' });
async function scrapeWithAxios() {
  const response = await axios.get('https://httpbin.org/ip', {
    httpAgent: agent,
    httpsAgent: agent,
    timeout: 30000,
  });
  console.log('IP:', response.data.origin);
}
scrapeWithAxios();

Способ 2: Прямой URL прокси

Если вы предпочитаете ручную настройку, используйте стандартный формат URL прокси вместе с пакетом https-proxy-agent:

const axios = require('axios');
const { HttpsProxyAgent } = require('https-proxy-agent');
const proxyUrl = 'http://USERNAME:PASSWORD@gate.proxyhat.com:8080';
const agent = new HttpsProxyAgent(proxyUrl);
async function scrapeWithAxios() {
  const response = await axios.get('https://httpbin.org/ip', {
    httpsAgent: agent,
    timeout: 30000,
  });
  console.log('IP:', response.data.origin);
}
scrapeWithAxios();

Экземпляр Axios с прокси по умолчанию

Для многократного использования создайте предварительно настроенный экземпляр Axios:

const { HttpsProxyAgent } = require('https-proxy-agent');
const agent = new HttpsProxyAgent('http://USERNAME:PASSWORD@gate.proxyhat.com:8080');
const proxyClient = axios.create({
  httpsAgent: agent,
  timeout: 30000,
  headers: {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
  },
});
// All requests now go through the proxy
const res = await proxyClient.get('https://example.com');

Использование прокси с Puppeteer

Puppeteer запускает безголовый браузер Chrome — идеальный инструмент для парсинга сайтов с активным использованием JavaScript. Прокси настраиваются на этапе запуска браузера.

const puppeteer = require('puppeteer');
async function scrapeWithPuppeteer() {
  const browser = await puppeteer.launch({
    args: ['--proxy-server=gate.proxyhat.com:8080'],
    headless: 'new',
  });
  const page = await browser.newPage();
  // Authenticate with the proxy
  await page.authenticate({
    username: 'USERNAME',
    password: 'PASSWORD',
  });
  await page.goto('https://httpbin.org/ip', {
    waitUntil: 'networkidle2',
    timeout: 60000,
  });
  const content = await page.evaluate(() => document.body.innerText);
  console.log('IP:', content);
  await browser.close();
}
scrapeWithPuppeteer();

Puppeteer с геотаргетингом

Чтобы направить трафик через конкретную страну, добавьте код страны в имя пользователя. ProxyHat использует формат USERNAME-country-XX:

await page.authenticate({
  username: 'USERNAME-country-de',  // Route through Germany
  password: 'PASSWORD',
});

Все доступные локации прокси можно посмотреть на нашей странице локаций.

Использование прокси с Playwright

Playwright поддерживает Chromium, Firefox и WebKit. Настройка прокси встроена прямо в параметры запуска, что делает конфигурацию ещё проще:

const { chromium } = require('playwright');
async function scrapeWithPlaywright() {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://gate.proxyhat.com:8080',
      username: 'USERNAME',
      password: 'PASSWORD',
    },
  });
  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('https://httpbin.org/ip');
  const body = await page.textContent('body');
  console.log('IP:', body);
  await browser.close();
}
scrapeWithPlaywright();

Playwright с прокси для каждого контекста

Playwright позволяет назначать разные прокси для каждого контекста браузера, что удобно для мультиаккаунтного или мультирегионального парсинга:

const browser = await chromium.launch();
// US context
const usContext = await browser.newContext({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME-country-us',
    password: 'PASSWORD',
  },
});
// UK context
const ukContext = await browser.newContext({
  proxy: {
    server: 'http://gate.proxyhat.com:8080',
    username: 'USERNAME-country-gb',
    password: 'PASSWORD',
  },
});
const usPage = await usContext.newPage();
const ukPage = await ukContext.newPage();
await Promise.all([
  usPage.goto('https://www.google.com/search?q=proxy+service'),
  ukPage.goto('https://www.google.co.uk/search?q=proxy+service'),
]);

Ротация IP и фиксированные сессии

ProxyHat поддерживает два режима сессий, предназначенных для разных сценариев парсинга:

ПараметрРотацияФиксированная сессия
IP на запросНовый IP каждый разОдин и тот же IP на время сессии
Подходит дляМасштабного парсингаМногошаговых сценариев, авторизации
Длительность сессииН/ДДо 30 минут
Формат имениUSERNAMEUSERNAME-session-XXXX

Пример фиксированной сессии

const { HttpsProxyAgent } = require('https-proxy-agent');
const axios = require('axios');
// Generate a random session ID
const sessionId = 'session_' + Math.random().toString(36).slice(2, 10);
const agent = new HttpsProxyAgent(
  `http://USERNAME-session-${sessionId}:PASSWORD@gate.proxyhat.com:8080`
);
// All requests with this agent use the same IP
const client = axios.create({ httpsAgent: agent, timeout: 30000 });
const res1 = await client.get('https://httpbin.org/ip');
const res2 = await client.get('https://httpbin.org/ip');
console.log(res1.data.origin === res2.data.origin); // true

Геотаргетинг запросов

Геотаргетинг критически важен для отслеживания поисковой выдачи (SERP), мониторинга локальных цен и проверки регионального контента. ProxyHat поддерживает таргетинг на уровне стран и городов через строку имени пользователя:

// Country targeting
const countryAgent = new HttpsProxyAgent(
  'http://USERNAME-country-jp:PASSWORD@gate.proxyhat.com:8080'
);
// City targeting
const cityAgent = new HttpsProxyAgent(
  'http://USERNAME-country-us-city-newyork:PASSWORD@gate.proxyhat.com:8080'
);

Полный список доступных локаций с поддерживаемыми странами и городами.

Обработка ошибок и повторные попытки

Сетевые ошибки неизбежны при работе с прокси в промышленных масштабах. Надёжная стратегия повторных попыток необходима для стабильной работы парсеров в продакшене:

const axios = require('axios');
const { HttpsProxyAgent } = require('https-proxy-agent');
async function fetchWithRetry(url, options = {}) {
  const maxRetries = options.maxRetries || 3;
  const baseDelay = options.baseDelay || 1000;
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const agent = new HttpsProxyAgent(
        'http://USERNAME:PASSWORD@gate.proxyhat.com:8080'
      );
      const response = await axios.get(url, {
        httpsAgent: agent,
        timeout: options.timeout || 30000,
      });
      if (response.status === 200) return response;
      throw new Error(`HTTP ${response.status}`);
    } catch (error) {
      console.warn(`Attempt ${attempt}/${maxRetries} failed: ${error.message}`);
      if (attempt === maxRetries) throw error;
      // Exponential backoff: 1s, 2s, 4s...
      const delay = baseDelay * Math.pow(2, attempt - 1);
      await new Promise(r => setTimeout(r, delay));
    }
  }
}
// Usage
const response = await fetchWithRetry('https://example.com', {
  maxRetries: 3,
  timeout: 20000,
});

Параллельный парсинг с контролем конкурентности

Отправка всех запросов разом через Promise.all может перегрузить как вашу машину, так и целевой сервер. Используйте ограничитель конкурентности для контроля числа параллельных соединений:

async function asyncPool(concurrency, items, iteratorFn) {
  const results = [];
  const executing = new Set();
  for (const [index, item] of items.entries()) {
    const promise = Promise.resolve().then(() => iteratorFn(item, index));
    results.push(promise);
    executing.add(promise);
    const cleanup = () => executing.delete(promise);
    promise.then(cleanup, cleanup);
    if (executing.size >= concurrency) {
      await Promise.race(executing);
    }
  }
  return Promise.all(results);
}
// Scrape 100 URLs, 10 at a time
const urls = Array.from({ length: 100 }, (_, i) =>
  `https://example.com/page/${i + 1}`
);
const results = await asyncPool(10, urls, async (url) => {
  return fetchWithRetry(url, { maxRetries: 2, timeout: 15000 });
});

Для масштабных проектов по веб-скрапингу оптимальный уровень конкурентности составляет от 5 до 20 — это хороший баланс между скоростью и надёжностью. Рекомендуем также прочитать наше руководство лучшие прокси для веб-скрапинга в 2026 году.

Советы для продакшена

Управление соединениями

  • Переиспользуйте экземпляры Axios и прокси-агенты вместо создания новых для каждого запроса — это предотвратит исчерпание сокетов.
  • Установите keepAlive: true для вашего HTTP-агента, чтобы поддерживать постоянные соединения.
  • Закрывайте браузеры Puppeteer/Playwright сразу после использования для освобождения памяти.

Память и таймауты

  • В Puppeteer используйте page.setRequestInterception(true) для блокировки изображений, CSS и шрифтов, когда вам нужен только HTML-контент. Это существенно сокращает потребление трафика и памяти.
  • Всегда устанавливайте явные таймауты для каждого запроса. Отсутствие таймаута — причина номер один зависания парсеров.
  • Отслеживайте потребление памяти Node.js через process.memoryUsage() в долгоработающих парсерах.

Перехват запросов для ускорения парсинга

const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', (req) => {
  const blocked = ['image', 'stylesheet', 'font', 'media'];
  if (blocked.includes(req.resourceType())) {
    req.abort();
  } else {
    req.continue();
  }
});
await page.goto('https://example.com');

Переменные окружения

Никогда не записывайте учётные данные прямо в код. Используйте файл .env и загружайте его с помощью dotenv:

require('dotenv').config();
const proxyUrl = `http://${process.env.PROXY_USER}:${process.env.PROXY_PASS}@gate.proxyhat.com:8080`;

Готовы начать? Ознакомьтесь с нашими тарифными планами, чтобы подобрать нужный объём трафика резидентных прокси для вашего проекта.

Ключевые выводы

  • ProxyHat Node SDK — самый быстрый способ добавить поддержку прокси. Установите через npm install proxyhat и начните работу за три строки кода.
  • Axios работает с прокси через https-proxy-agent или встроенный агент SDK. Создайте переиспользуемый экземпляр Axios для максимальной эффективности.
  • Puppeteer принимает прокси как аргумент запуска. Вызовите page.authenticate() для передачи учётных данных.
  • Playwright имеет встроенную поддержку прокси в параметрах запуска и контекста, включая отдельные прокси для каждого контекста при мультирегиональном парсинге.
  • Используйте фиксированные сессии для многошаговых сценариев и ротацию IP для масштабного сбора данных.
  • Всегда реализуйте логику повторных попыток с экспоненциальной задержкой и контроль конкурентности в продакшен-парсерах.
  • Блокируйте ненужные ресурсы в безголовых браузерах для снижения потребления трафика и повышения скорости.

Готовы начать?

Доступ к более чем 50 млн резидентных IP в 148+ странах с AI-фильтрацией.

Смотреть ценыРезидентные прокси
← Вернуться в Блог