Как использовать резидентные прокси Dataimpulse с Node.js и Axios для веб-скрапинга (руководство для начинающих для Windows, macOS и Linux)
Понятное для начинающих руководство с готовыми примерами для маршрутизации запросов Node.js через резидентные прокси Dataimpulse с оплатой по факту использования при помощи Axios и Cheerio, включая проверку выходного IP, повторные попытки, ограничения параллелизма и вариант с SOCKS5.
Обзор
Dataimpulse — это провайдер прокси с оплатой по факту использования, предлагающий резидентные и мобильные IP из пула более 90 млн адресов по HTTP и SOCKS5. Поскольку оплата зависит от фактически использованного трафика, а не от фиксированного месячного плана, он подходит для высокообъёмного веб-скрапинга и крупномасштабного сбора данных с неравномерной нагрузкой.
В этом руководстве запросы Node.js направляются через резидентный эндпоинт Dataimpulse с использованием Axios и Cheerio, а затем скрипт укрепляется повторными попытками и ограничением параллелизма. Код одинаково работает в Windows, macOS и Linux; различаются только команды оболочки для настройки переменных окружения. Тот же шаблон подходит для любого провайдера, который выдаёт хост шлюза, порт и имя пользователя/пароль.
К концу руководства вы сможете:
- Установить пакеты Node.js, необходимые для скрапинга с поддержкой прокси.
- Не хранить учётные данные Dataimpulse в исходных файлах.
- Убедиться, что запросы выходят через прокси.
- Собирать и разбирать страницу с помощью Cheerio.
- Добавить повторные попытки, экспоненциальную задержку и ограничение параллелизма.
- Переключить тот же клиент с 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.