Что такое 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/429 —
beforeRequestснова сработает при ретрае, подставив новыйproxyUrl, поэтому повторная попытка пойдёт с другого IP. - Bounded concurrency —
p-limit(10)предотвращает исчерпание файловых дескрипторов и сглаживает нагрузку на целевой сайт.
Продакшен-паттерны: retry, afterResponse, cookie jars, Crawlee
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;
},
],
},
});
Cookie jars
Для сайтов, требующих сохранения сессии (логин, корзина), используйте 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 проще в отладке и достаточен.






