got-scraping в Node.js: руководство по парсингу с резидентными прокси

Практическое руководство для Node.js-разработчиков: как использовать got-scraping с генератором заголовков, HTTP/2 и резидентными прокси ProxyHat для масштабного парсинга без блокировок.

got-scraping in Node.js: A Developer's Guide with Residential Proxies
В этой статье

Что такое got-scraping в Node.js и зачем он нужен

got-scraping в Node.js — это библиотека от Apify, построенная поверх HTTP-клиента got, специально оптимизированная для веб-скрапинга. Она решает главную проблему: современные антибот-системы (Cloudflare, Datadome, PerimeterX, Akamai) легко отличают «голые» запросы got или axios от реальных браузеров по заголовкам, TLS-отпечаткам и поведенческим паттернам. Библиотека got-scraping добавляет генератор связных браузерных заголовков, поддержку HTTP/2 и удобные хуки для ретраев — всё в идиоматичном API, совместимом с got.

Если вы парсите публичные данные в Node.js и сталкиваетесь с 403/429 после 50–200 запросов, проблема почти всегда в том, что got отправляет заголовки в «неправильном» порядке, с пропущенными sec-ch-ua, или использует HTTP/1.1 там, где Chrome уже давно работает по HTTP/2. got-scraping proxy — это связка, которая закрывает оба уровня: правдоподобные заголовки на уровне клиента и резидентные IP-адреса на сетевом уровне.

Почему raw got/axios запросы попадают под флаг

Антибот-системы используют несколько сигналов. Один из самых недооценённых — порядок HTTP-заголовков. Chrome, Firefox и Safari отправляют заголовки в предсказуемом порядке: host, connection, sec-ch-ua, sec-ch-ua-mobile, upgrade-insecure-requests, user-agent, accept, sec-fetch-site, sec-fetch-mode, sec-fetch-user, sec-fetch-dest, accept-encoding, accept-language. Библиотеки вроде got и axios по умолчанию не соблюдают этот порядок и часто пропускают sec-ch-ua целиком.

Второй сигнал — несоответствие User-Agent и набора заголовков. Если вы ставите user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/120, но не отправляете sec-ch-ua и sec-ch-ua-platform, антибот сразу видит подделку. Третий — TLS-отпечаток (JA3/JA4): Node.js по умолчанию использует cipher suites и extensions, отличные от Chrome. got-scraping не меняет TLS-отпечаток напрямую, но поддержка HTTP/2 через http2 опцию got приближает поведение к браузеру.

Четвёртый сигнал — IP-репутация. Дата-центровые IP (AWS, DigitalOcean, OVH) помечены в большинстве антибот-баз. Даже идеальные заголовки не спасут, если запрос идёт с подсети, известной как «хостинг». Поэтому заголовки и резидентные прокси нужно комбинировать.

Идиоматичная поверхность got-scraping: got.extend, useHeaderGenerator, proxyUrl

Библиотека построена так, чтобы расширять got идиоматично — через got.extend() и плагины. Ключевые элементы API:

  • gotScraping — расширенный экземпляр got с подключённым генератором заголовков.
  • headerGeneratorOptions — объект, передаваемый в @apify/header-generator: browsers, devices, operatingSystems, locales.
  • useHeaderGenerator — флаг включения генератора (по умолчанию true в got-scraping).
  • proxyUrl — строка вида http://user:pass@host:port, работает и для HTTP/1.1, и для HTTP/2 CONNECT-туннелей.
  • http2 — булева опция got, включающая HTTP/2 поверх ALPN.

Пример базовой конфигурации:

import { gotScraping } from 'got-scraping';

const client = gotScraping.extend({
  headerGeneratorOptions: {
    browsers: ['chrome'],
    devices: ['desktop'],
    operatingSystems: ['windows', 'macos'],
    locales: ['en-US', 'en'],
  },
  http2: true,
  timeout: { request: 30000 },
  retry: { limit: 3 },
});

const res = await client('https://example.com');
console.log(res.statusCode, res.headers['content-type']);

Здесь got.extend создаёт переиспользуемый клиент с фиксированным профилем заголовков. Каждый запрос получает новый связный набор: user-agent + sec-ch-ua + accept-language + sec-fetch-*, согласованный между собой. Это и есть got scraping header generator в действии.

Маршрутизация через резидентные прокси ProxyHat

Когда заголовки и HTTP/2 выглядят правдоподобно, следующим слабым звеном становится IP-адрес. Дата-центровые прокси дешевы, но их ASN легко детектируются. Резидентные прокси используют IP реальных домашних провайдеров (Comcast, AT&T, Deutsche Telekom, Orange), что делает запрос неотличимым от обычного пользователя.

ProxyHat предоставляет шлюз gate.proxyhat.com с HTTP-портом 8080 и SOCKS5-портом 1080. Гео-таргетинг и сессии задаются прямо в имени пользователя через дефисы:

  • user-country-US — любой IP в США.
  • user-country-DE-city-berlin — IP в Берлине.
  • user-country-US-session-abc123 — «липкая» сессия: один и тот же IP для всех запросов с этим идентификатором.

Пример HTTP-прокси:

const proxyUrl = 'http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080';

const res = await gotScraping({
  url: 'https://httpbin.org/ip',
  proxyUrl,
  headerGeneratorOptions: {
    browsers: ['chrome'],
    operatingSystems: ['windows'],
    locales: ['en-US'],
  },
});
console.log(res.body);

Для SOCKS5 используйте порт 1080:

const proxyUrl = 'socks5://user-country-DE:pass@gate.proxyhat.com:1080';

SOCKS5 полезен, когда целевой сайт поддерживает только HTTPS и вы хотите минимизировать накладные расходы HTTP CONNECT-туннеля, или когда прокси-провайдер рекомендует SOCKS5 для UDP/WebRTC-подобных сценариев. В большинстве случаев HTTP-порт 8080 достаточен и проще в отладке.

Runnable-пример: ротация сессий с retry-хуками

В продакшене нужен ротатор, который генерирует уникальный session-* на каждый запрос и повторяет попытку при 403/429. Идиоматичный способ — обернуть gotScraping.extend и использовать хук beforeRequest для подмены proxyUrl.

import { gotScraping } from 'got-scraping';
import { randomUUID } from 'crypto';
import pLimit from 'p-limit';

const PROXYHAT_USER = 'user';
const PROXYHAT_PASS = 'pass';

function buildProxyUrl(country = 'US') {
  const session = randomUUID().slice(0, 8);
  return `http://${PROXYHAT_USER}-country-${country}-session-${session}:${PROXYHAT_PASS}@gate.proxyhat.com:8080`;
}

const scraper = gotScraping.extend({
  headerGeneratorOptions: {
    browsers: ['chrome'],
    devices: ['desktop'],
    operatingSystems: ['windows', 'macos'],
    locales: ['en-US', 'en'],
  },
  http2: true,
  timeout: { request: 30000 },
  retry: {
    limit: 4,
    statusCodes: [403, 429, 500, 502, 503],
    backoffLimit: 5000,
  },
  hooks: {
    beforeRequest: [
      (options) => {
        // Подставляем свежий proxyUrl с новой сессией
        options.proxyUrl = buildProxyUrl('US');
      },
    ],
  },
});

async function fetchUrl(url) {
  const res = await scraper(url);
  return { status: res.statusCode, body: res.body };
}

// Ограничиваем конкурентность до 10 параллельных запросов
const limit = pLimit(10);
const urls = [
  'https://httpbin.org/ip',
  'https://httpbin.org/headers',
  'https://httpbin.org/user-agent',
];

const results = await Promise.all(
  urls.map((u) => limit(() => fetchUrl(u)))
);
console.log(results);

Ключевые моменты:

  • Новая сессия на запросrandomUUID() гарантирует, что каждый запрос получит свой IP из пула ProxyHat.
  • Retry на 403/429beforeRequest снова сработает при ретрае, подставив новый proxyUrl, поэтому повторная попытка пойдёт с другого IP.
  • Bounded concurrencyp-limit(10) предотвращает исчерпание файловых дескрипторов и сглаживает нагрузку на целевой сайт.

Retry-хуки и afterResponse

got поддерживает хук afterResponse, который можно использовать для логирования, ротации прокси по статус-коду или сброса сессии. Пример: если получили 429, меняем страну и повторяем.

const scraper = gotScraping.extend({
  // ... headerGeneratorOptions, http2 ...
  hooks: {
    beforeRequest: [(o) => { o.proxyUrl = buildProxyUrl('US'); }],
    afterResponse: [
      (response, retryWithMergedOptions) => {
        if (response.statusCode === 429) {
          return retryWithMergedOptions({
            proxyUrl: buildProxyUrl('DE'),
          });
        }
        return response;
      },
    ],
  },
});

Для сайтов, требующих сохранения сессии (логин, корзина), используйте tough-cookie с опцией cookieJar. При ротации IP сохраняйте session-* идентификатор постоянным, чтобы cookies и IP не рассинхронизировались.

import { CookieJar } from 'tough-cookie';

const jar = new CookieJar();
const session = 'persistent-cart-001';

const sessionClient = gotScraping.extend({
  cookieJar: jar,
  proxyUrl: `http://user-country-US-session-${session}:pass@gate.proxyhat.com:8080`,
  headerGeneratorOptions: { browsers: ['chrome'], operatingSystems: ['windows'], locales: ['en-US'] },
});

Масштабирование: Crawlee CheerioCrawler

Когда количество URL превышает сотни, вручную управлять очередью и конкурентностью неудобно. Crawlee — фреймворк от Apify, в который got-scraping встроен как транспорт. CheerioCrawler парсит HTML на лету, а gotScraping под капотом обеспечивает заголовки и прокси.

import { CheerioCrawler } from 'crawlee';

const crawler = new CheerioCrawler({
  requestHandler: async ({ $, request }) => {
    const title = $('title').text();
    console.log(request.url, title);
  },
  requestHandlerTimeoutSecs: 30,
  maxConcurrency: 15,
  useHeaderGenerator: true,
  headerGeneratorOptions: {
    browsers: ['chrome'],
    devices: ['desktop'],
    operatingSystems: ['windows'],
    locales: ['en-US'],
  },
  proxyConfiguration: {
    proxyUrls: [
      'http://user-country-US-session-1:pass@gate.proxyhat.com:8080',
      'http://user-country-US-session-2:pass@gate.proxyhat.com:8080',
    ],
  },
});

await crawler.run(['https://example.com/page1', 'https://example.com/page2']);

Crawlee автоматически управляет очередью, ретраями, ротацией прокси из пула и логированием. Для контейнеризации Crawlee совместим с Docker — образ apify/actor-node включает все зависимости.

Сравнение: got-scraping vs raw got vs axios + proxy

Аспектraw got + проксиaxios + проксиgot-scraping + прокси
Порядок заголовковПроизвольныйПроизвольныйБраузерный порядок
sec-ch-ua / sec-fetch-*Ручная работаРучная работаАвтогенерация
HTTP/2Через опциюНет (без плагина)Встроено
Ротация проксиРучнаяРучнаяХуки + proxyUrl
Retry с новым IPРучнойРучнойbeforeRequest + retry
Совместимость с CrawleeЧерез адаптерЧерез адаптерНативная

Когда без headless-браузера не обойтись

got-scraping покрывает статичный HTML и API-эндпоинты, возвращающие JSON. Но если сайт рендерит контент через JavaScript (SPA на React/Vue) или использует продвинутый антибот с challenge-страницей (Cloudflare Turnstile, Datadome captcha), HTTP-клиент бессилен — нужен headless-браузер: Playwright или Puppeteer.

Признаки, что нужен браузер:

  • Тело ответа содержит <div id="root"></div> без контента.
  • Ответ — это JS-челлендж с setTimeout и document.cookie.
  • Сайт требует выполнения WebGL/canvas-отпечатков.

В Crawlee для этого есть PlaywrightCrawler и PuppeteerCrawler. Прокси подключаются аналогично через proxyConfiguration. Для масштабирования используют контейнеризованный fleet: несколько headless-инстансов в Docker с балансировкой через Crawlee Request Queue.

Этика и правовые аспекты

Парсинг публичных данных в большинстве юрисдикций легален, но законы варьируются. CFAA (США) и GDPR (ЕС) могут применяться при доступе к защищённым системам или персональным данным. Перед стартом проекта проконсультируйтесь с юристом.

Базовые принципы ответственного скрапинга:

  • Только публичные данные. Не обходите paywall, не используйте чужие учётные записи без разрешения.
  • Уважайте robots.txt. Проверьте /robots.txt перед парсингом; если путь запрещён — не скрапите без явного согласия.
  • Соблюдайте rate limits. Если сайт документирует лимиты (например, 1 запрос/секунду), держитесь их. p-limit и timeout помогают.
  • Предпочитайте официальные API. Если у сайта есть REST/GraphQL API — используйте его. Это стабильнее, быстрее и юридически безопаснее.
  • GDPR/CCPA. Не собирайте персональные данные без законного основания. При хранении IP-адресов или cookies учитывайте требования по хранению и удалению.

Подробнее о доступных локациях и тарифах ProxyHat — на страницах локаций и тарифов. Документация по подключению — на docs.proxyhat.com. Примеры сценариев использования — в разделах веб-скрапинг и SERP-трекинг.

Key Takeaways — что вынести из статьи

  • got-scraping закрывает уровень заголовков: связные sec-ch-ua, accept-language, sec-fetch-* в правильном порядке плюс HTTP/2.
  • Резидентные прокси закрывают уровень IP: запросы выглядят как от реальных пользователей Comcast/AT&T/Deutsche Telekom, а не из дата-центра.
  • Ротация сессий через user-country-US-session-{uuid} в имени пользователя ProxyHat даёт per-request IP без отдельного API.
  • Retry-хуки beforeRequest и afterResponse позволяют менять прокси и страну при 403/429 идиоматично, без внешних обёрток.
  • Crawlee CheerioCrawler — следующий шаг масштабирования: встроенная очередь, конкурентность, нативная интеграция с got-scraping.
  • Headless-браузер нужен только для JS-рендеринга и challenge-страниц; в 70–80% случаев статичного парсинга got-scraping достаточно.
  • Этика первична: только публичные данные, robots.txt, rate limits, официальный API как приоритет.

FAQ

Что такое got-scraping в Node.js?

got-scraping — это библиотека от Apify, расширяющая HTTP-клиент got для веб-скрапинга. Она добавляет генератор связных браузерных заголовков (sec-ch-ua, accept-language, sec-fetch-* в правильном порядке), поддержку HTTP/2, хуки для ретраев с ротацией прокси и нативную интеграцию с Crawlee. Цель — сделать запросы Node.js неотличимыми от браузерных на уровне заголовков и протокола.

Почему got-scraping в Node.js важен для пользователей прокси?

Даже с идеальными резидентными прокси запросы raw got/axios детектируются антибот-системами по заголовкам и HTTP-отпечатку. got-scraping закрывает этот пробел: связные заголовки + HTTP/2 + ротация прокси через хуки создают полное правдоподобие. Без правильных заголовков резидентный IP не спасёт от Cloudflare или Datadome, которые проверяют совокупность сигналов, а не только IP-репутацию.

Какой тип прокси лучше всего подходит для got-scraping в Node.js?

Резидентные прокси — оптимальный выбор, потому что они используют IP реальных домашних провайдеров (Comcast, AT&T, Deutsche Telekom), которые не помечены в антибот-базах как «хостинг». Дата-центровые прокси дешевле, но их ASN легко детектируется. Мобильные прокси ещё лучше по репутации, но дороже и медленнее. Для большинства задач парсинга резидентные прокси через gate.proxyhat.com:8080 — лучший баланс цены и качества.

Как избежать блокировок при использовании got-scraping в Node.js?

Комбинируйте четыре уровня: (1) включите useHeaderGenerator с реалистичными headerGeneratorOptions; (2) используйте HTTP/2 (http2: true); (3) ротируйте сессии через user-country-X-session-{uuid} в имени пользователя ProxyHat, чтобы каждый запрос шёл с нового IP; (4) настройте retry-хук beforeRequest для смены прокси при 403/429. Дополнительно ограничивайте конкурентность через p-limit и соблюдайте rate limits целевого сайта.

Можно ли использовать SOCKS5 с got-scraping и ProxyHat?

Да. ProxyHat поддерживает SOCKS5 на порту 1080: socks5://user-country-DE:pass@gate.proxyhat.com:1080. got-scraping принимает proxyUrl с socks5:// схемой. SOCKS5 полезен для минимизации накладных расходов HTTP CONNECT и в сценариях, где провайдер рекомендует SOCKS5. Для большинства задач HTTP-порт 8080 проще в отладке и достаточен.

Часто задаваемые вопросы

Что такое got-scraping в Node.js?

got-scraping — это библиотека от Apify, расширяющая HTTP-клиент got для веб-скрапинга. Она добавляет генератор связных браузерных заголовков (sec-ch-ua, accept-language, sec-fetch-* в правильном порядке), поддержку HTTP/2, хуки для ретраев с ротацией прокси и нативную интеграцию с Crawlee. Цель — сделать запросы Node.js неотличимыми от браузерных на уровне заголовков и протокола.

Почему got-scraping в Node.js важен для пользователей прокси?

Даже с идеальными резидентными прокси запросы raw got/axios детектируются антибот-системами по заголовкам и HTTP-отпечатку. got-scraping закрывает этот пробел: связные заголовки + HTTP/2 + ротация прокси через хуки создают полное правдоподобие. Без правильных заголовков резидентный IP не спасёт от Cloudflare или Datadome, которые проверяют совокупность сигналов, а не только IP-репутацию.

Какой тип прокси лучше всего подходит для got-scraping в Node.js?

Резидентные прокси — оптимальный выбор, потому что они используют IP реальных домашних провайдеров (Comcast, AT&T, Deutsche Telekom), которые не помечены в антибот-базах как «хостинг». Дата-центровые прокси дешевле, но их ASN легко детектируется. Мобильные прокси ещё лучше по репутации, но дороже и медленнее. Для большинства задач парсинга резидентные прокси через gate.proxyhat.com:8080 — лучший баланс цены и качества.

Как избежать блокировок при использовании got-scraping в Node.js?

Комбинируйте четыре уровня: (1) включите useHeaderGenerator с реалистичными headerGeneratorOptions; (2) используйте HTTP/2 (http2: true); (3) ротируйте сессии через user-country-X-session-{uuid} в имени пользователя ProxyHat, чтобы каждый запрос шёл с нового IP; (4) настройте retry-хук beforeRequest для смены прокси при 403/429. Дополнительно ограничивайте конкурентность через p-limit и соблюдайте rate limits целевого сайта.

Можно ли использовать SOCKS5 с got-scraping и ProxyHat?

Да. ProxyHat поддерживает SOCKS5 на порту 1080: socks5://user-country-DE:pass@gate.proxyhat.com:1080. got-scraping принимает proxyUrl с socks5:// схемой. SOCKS5 полезен для минимизации накладных расходов HTTP CONNECT и в сценариях, где провайдер рекомендует SOCKS5. Для большинства задач HTTP-порт 8080 проще в отладке и достаточен.

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

Резидентные, ISP и мобильные прокси в 148+ странах. Создайте бесплатный аккаунт.

Создать бесплатный аккаунт
← Вернуться в Блог