Skip to content
Beginner / 3 min read

Как использовать резидентные прокси Dataimpulse с Node.js и Axios для веб-скрапинга (руководство для начинающих для Windows, macOS и Linux)

Понятное для начинающих руководство с готовыми примерами для маршрутизации запросов Node.js через резидентные прокси Dataimpulse с оплатой по факту использования при помощи Axios и Cheerio, включая проверку выходного IP, повторные попытки, ограничения параллелизма и вариант с SOCKS5.

Windows macOS HTTP(S) Веб-скрейпинг

Обзор

Dataimpulse — это провайдер прокси с оплатой по факту использования, предлагающий резидентные и мобильные IP из пула более 90 млн адресов по HTTP и SOCKS5. Поскольку оплата зависит от фактически использованного трафика, а не от фиксированного месячного плана, он подходит для высокообъёмного веб-скрапинга и крупномасштабного сбора данных с неравномерной нагрузкой.

В этом руководстве запросы Node.js направляются через резидентный эндпоинт Dataimpulse с использованием Axios и Cheerio, а затем скрипт укрепляется повторными попытками и ограничением параллелизма. Код одинаково работает в Windows, macOS и Linux; различаются только команды оболочки для настройки переменных окружения. Тот же шаблон подходит для любого провайдера, который выдаёт хост шлюза, порт и имя пользователя/пароль.

К концу руководства вы сможете:

  1. Установить пакеты Node.js, необходимые для скрапинга с поддержкой прокси.
  2. Не хранить учётные данные Dataimpulse в исходных файлах.
  3. Убедиться, что запросы выходят через прокси.
  4. Собирать и разбирать страницу с помощью Cheerio.
  5. Добавить повторные попытки, экспоненциальную задержку и ограничение параллелизма.
  6. Переключить тот же клиент с HTTP на SOCKS5.

Что вам понадобится

  • Node.js 18 или новее с npm
  • Аккаунт Dataimpulse с балансом для оплаты по факту использования
  • Хост шлюза, порт и имя пользователя/пароль из вашей панели Dataimpulse
  • Целевая страница, которую вам разрешено собирать

Выберите тип эндпоинта

Эндпоинт Лучше всего подходит для Пакет агента Node.js
HTTP(S)-прокси Axios, Fetch и большинство библиотек для HTTP-скрапинга https-proxy-agent
SOCKS5 Инструменты, которые ожидают SOCKS, или один агент для всего исходящего трафика socks-proxy-agent

Начните с HTTP-эндпоинта, если только библиотека не отказывается принимать конфигурацию прокси.

Шаги

1. Создайте проект

mkdir dataimpulse-axios-scraper
cd dataimpulse-axios-scraper
npm init -y

2. Установите зависимости

npm install axios cheerio https-proxy-agent

Добавьте SOCKS5-агент, только если планируете использовать шаг 7:

npm install socks-proxy-agent

3. Задайте учётные данные Dataimpulse как переменные окружения

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

macOS и Linux:

export PROXY_HOST="your-gateway-host"
export PROXY_PORT="your-gateway-port"
export PROXY_USER="your-username"
export PROXY_PASS="your-password"

Windows PowerShell:

$env:PROXY_HOST = "your-gateway-host"
$env:PROXY_PORT = "your-gateway-port"
$env:PROXY_USER = "your-username"
$env:PROXY_PASS = "your-password"

Эти значения действуют только в текущем сеансе терминала. Если ваш пароль содержит @, : или /, приведённый ниже скрипт кодирует его с помощью encodeURIComponent, поэтому вы можете вставить его как есть.

4. Проверьте выходной IP

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

const axios = require('axios');
const { HttpsProxyAgent } = require('https-proxy-agent');

const proxyUrl = `http://${process.env.PROXY_USER}:${encodeURIComponent(process.env.PROXY_PASS)}@${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`;

const client = axios.create({
  httpsAgent: new HttpsProxyAgent(proxyUrl),
  proxy: false,
  timeout: 20000,
});

(async () => {
  const { data } = await client.get('https://api.ipify.org?format=json');
  console.log('Exit IP:', data.ip);
})();

Запустите его несколько раз:

node check-ip.js

Если шлюз меняет выходной IP, при каждом запуске вы увидите другой адрес — это нормальное поведение для резидентного трафика. Если нужно, чтобы несколько запросов исходили с одного адреса, используйте формат параметра сессии или sticky, описанный в вашей панели Dataimpulse, вместо попытки зафиксировать IP внутри скрипта. Установка proxy: false сделана намеренно: туннелированием управляет явно заданный агент, а включённое автоопределение прокси в Axios может с ним конфликтовать.

5. Соберите страницу и разберите её

Создайте scrape.js. В этой версии добавляются описательный User-Agent, заголовок Accept-Language и помощник для повторных попыток:

const axios = require('axios');
const { load } = require('cheerio');
const { HttpsProxyAgent } = require('https-proxy-agent');

const proxyUrl = `http://${process.env.PROXY_USER}:${encodeURIComponent(process.env.PROXY_PASS)}@${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`;

const client = axios.create({
  httpsAgent: new HttpsProxyAgent(proxyUrl),
  proxy: false,
  timeout: 20000,
  headers: {
    'User-Agent': 'Mozilla/5.0 (compatible; ProxyScoutExample/1.0)',
    'Accept-Language': 'en-US,en;q=0.9',
  },
});

async function getWithRetry(url, attempts = 3) {
  for (let i = 1; i <= attempts; i++) {
    try {
      return await client.get(url);
    } catch (error) {
      const status = error.response && error.response.status;
      const retryable = !status || status === 429 || status >= 500;
      if (!retryable || i === attempts) throw error;
      const backoff = 1000 * 2 ** (i - 1);
      console.warn(`Attempt ${i} failed (${status || error.code}); retrying in ${backoff} ms`);
      await new Promise((resolve) => setTimeout(resolve, backoff));
    }
  }
}

(async () => {
  const { data: html } = await getWithRetry('https://example.com/');
  const $ = load(html);
  console.log('Title:', $('title').text().trim());
  $('a').slice(0, 5).each((index, element) => {
    console.log('Link:', $(element).attr('href'));
  });
})();
node scrape.js

Ошибки аутентификации (HTTP 407) и большинство ответов 4xx считаются неповторяемыми, поскольку повтор того же запроса с теми же учётными данными обычно даёт тот же результат. Временные сетевые ошибки, ответы 429 и ответы 5xx повторяются с экспоненциальной задержкой.

6. Добавьте ограничение параллелизма вместо запуска всего сразу

Ротационный шлюз сам управляет сменой IP, поэтому главный риск для вашей задачи — слишком быстро нагружать одну цель. Обрабатывайте URL небольшими пакетами и уменьшите размер пакета, если начнёте получать ответы 403 или 429:

async function scrapeAll(urls, concurrency = 4) {
  const results = [];
  for (let i = 0; i < urls.length; i += concurrency) {
    const batch = urls.slice(i, i + concurrency);
    const settled = await Promise.allSettled(batch.map((url) => getWithRetry(url)));
    results.push(...settled);
  }
  return results;
}

Для новой цели начните с параллелизма 2–4, следите за долей ошибок и только потом увеличивайте. Более медленный, но завершившийся запуск дешевле быстрого, который блокируется, особенно при оплате по факту использования, где неудачные запросы всё равно расходуют трафик.

7. Необязательно: переключите тот же клиент на SOCKS5

Если библиотека или CLI-инструмент принимает только SOCKS, замените агент. Используйте порт SOCKS5 из вашей панели Dataimpulse, а не HTTP-порт:

const { SocksProxyAgent } = require('socks-proxy-agent');

const socksUrl = `socks5://${process.env.PROXY_USER}:${encodeURIComponent(process.env.PROXY_PASS)}@${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`;
const agent = new SocksProxyAgent(socksUrl);

const client = axios.create({
  httpAgent: agent,
  httpsAgent: agent,
  proxy: false,
  timeout: 20000,
});

Назначение одного и того же агента и для httpAgent, и для httpsAgent обеспечивает единообразие для обычных HTTP- и HTTPS-целей, что важно, когда скрапер следует за перенаправлениями между обоими схемами.

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

Симптом Вероятная причина Решение
407 Proxy Authentication Required Неверное или отсутствующее имя пользователя/пароль Перепроверьте учётные данные в панели и убедитесь в URL-кодировании специальных символов
ECONNREFUSED или мгновенный тайм-аут при подключении Неверный порт или HTTP-порт, использованный для SOCKS5-запроса Сопоставьте порт с выбранным протоколом
HTTP-URL работают, HTTPS-URL не работают Axios использует встроенную обработку прокси вместо агента Используйте https-proxy-agent и установите proxy: false
Частые 403 или 429 от целевого сайта Слишком высокая частота запросов для этого хоста Уменьшите параллелизм до 1 или 2, увеличьте задержку, сохраняйте реалистичные заголовки
Запросы работают в браузере, но не работают в Node В браузере и терминале разные настройки прокси Повторно экспортируйте переменные окружения в терминале, где запущен скрипт
Появляются предупреждения о сертификате или TLS Перехваченный или несовпадающий TLS Не отключайте проверку сертификатов; проверьте целевой URL и конфигурацию прокси

Итог

Вы настроили проект Node.js, который отправляет запросы Axios через резидентный прокси Dataimpulse, проверили выходной IP, разобрали HTML с помощью Cheerio и добавили повторные попытки, экспоненциальную задержку и ограничение параллелизма. Поскольку шлюз сам меняет выходные IP, инженерные усилия следует направлять на темп запросов, обработку ошибок и наблюдаемость, а не на ручное переключение IP. Для первого запуска проверьте выходной IP, соберите одну страницу, затем постепенно увеличивайте параллелизм, следя за долей ошибок и расходом трафика. Всегда соблюдайте условия обслуживания целевого сайта, директивы robots и применимое законодательство при сборе данных.

Дополнительное чтение на ProxyScout.net: ротационные резидентные прокси при больших объёмах, скрапинг на Python с Dataimpulse и настройка прокси Dataimpulse с Proxifier в Windows.