[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-es-guia-got-scraping-nodejs-proxy-residencial":3},{"success":4,"payload":5,"related":64,"errors":128},true,{"id":6,"slug":7,"title":8,"excerpt":9,"body_html":10,"meta_title":11,"meta_description":12,"canonical_url":13,"canonical_override":14,"og_title":15,"og_description":16,"og_image_url":17,"faq_json":18,"key_takeaways":14,"allow_index":31,"noindex_google_only":31,"allow_follow":4,"published_at":32,"updated_at":32,"content_updated_at":33,"featured_image_url":34,"featured_image_alt":35,"card_image_url":36,"reading_time_minutes":37,"author":38,"categories":42,"tags":49,"alternates":50,"locale_paths":59,"views":63},176,"guia-got-scraping-nodejs-proxy-residencial","Guía de got-scraping en Node.js con proxies residenciales","Una guía práctica para desarrolladores sobre cómo usar got-scraping en Node.js: generador de cabeceras, HTTP\u002F2, proxies residenciales y patrones de producción con reintentos, concurrencia y Crawlee.","\u003Cp>Si has intentado hacer got-scraping en Node.js con \u003Ccode>got\u003C\u002Fcode> o \u003Ccode>axios\u003C\u002Fcode> puro y te has encontrado con respuestas 403, desafíos de CAPTCHA o bloqueos silenciosos, no estás solo. Los sitios modernos no solo inspeccionan tu User-Agent: analizan el orden de las cabeceras, las pistas \u003Ccode>sec-ch-ua\u003C\u002Fcode>, la huella TLS y la reputación de tu IP. \u003Cstrong>got-scraping\u003C\u002Fstrong>, el cliente HTTP de Apify basado en \u003Ccode>got\u003C\u002Fcode>, fue diseñado específicamente para resolver la mitad de esa ecuación — las cabeceras y el transporte — mientras que un \u003Cstrong>got-scraping proxy\u003C\u002Fstrong> residencial resuelve la otra mitad.\u003C\u002Fp>\n\u003Cp>Esta guía es para desarrolladores que scrapean a escala en Node.js. Cubrimos el generador de cabeceras, la superficie idiomática de la API, el enrutamiento a través de proxies residenciales en \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode>, un ejemplo completo con rotación y reintentos, y los patrones de producción que necesitas cuando pasas de prototipo a miles de peticiones por minuto.\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Aviso legal y ético.\u003C\u002Fstrong> Esta guía asume que recolectas datos públicos, respetas \u003Ccode>robots.txt\u003C\u002Fcode>, los términos de servicio aplicables y normativas como el \u003Ca href=\"https:\u002F\u002Fgdpr.eu\u002Farticle-5-how-to-process-personal-data\u002F\" rel=\"noopener noreferrer\">GDPR\u003C\u002Fa> y la CFAA en EE. UU. Si un sitio ofrece una API oficial o datos abiertos, úsala primero. El scraping no exime de cumplir la ley.\u003C\u002Fp>\u003C\u002Fblockquote>\n\n\u003Ch2>Por qué las peticiones con got\u002Faxios puro son detectadas\u003C\u002Fh2>\n\u003Cp>Cuando usas \u003Ccode>got\u003C\u002Fcode> o \u003Ccode>axios\u003C\u002Fcode> sin personalización, tu petición HTTP\u002F1.1 envía cabeceras en un orden predecible y minimalista: \u003Ccode>Host\u003C\u002Fcode>, \u003Ccode>User-Agent\u003C\u002Fcode> (a menudo \u003Ccode>got\u002F14.4.5\u003C\u002Fcode> o el de Node por defecto), \u003Ccode>Accept\u003C\u002Fcode> y poco más. Un navegador Chromium real, en cambio, envía más de una docena de cabeceras en un orden específico, incluyendo \u003Ccode>sec-ch-ua\u003C\u002Fcode>, \u003Ccode>sec-fetch-site\u003C\u002Fcode>, \u003Ccode>accept-language\u003C\u002Fcode> y \u003Ccode>priority\u003C\u002Fcode>. Los sistemas anti-bot como Cloudflare, Datadome y PerimeterX comparan tu conjunto de cabeceras con el esperado para tu User-Agent declarado. Si declaras Chrome pero no envías \u003Ccode>sec-ch-ua\u003C\u002Fcode>, la petición se marca como sospechosa en milisegundos.\u003C\u002Fp>\n\u003Cp>El problema se agrava con TLS. La huella JA3\u002FJA4 de tu handshake TLS depende de la librería subyacente. Node.js usa OpenSSL, que produce una huella distinta a la de Chrome. Aunque las cabeceras sean perfectas, un WAF avanzado puede comparar la huella TLS con el navegador declarado y bloquearte. Por eso, incluso con cabeceras impecables, necesitas un \u003Cstrong>nodejs scraping proxy\u003C\u002Fstrong> residencial para que, al menos, la reputación de la IP no te delate.\u003C\u002Fp>\n\u003Cp>Los datos lo confirman: un estudio de \u003Ca href=\"https:\u002F\u002Fwww.zenrows.com\u002Fblog\u002Fbypass-cloudflare\" rel=\"noopener noreferrer\">ZenRows\u003C\u002Fa> sobre evasión de Cloudflare muestra que la coherencia entre User-Agent, cabeceras y huella TLS es el factor número uno que determina si una petición pasa el desafío inicial. Y según la documentación de \u003Ca href=\"https:\u002F\u002Fcrawlee.dev\u002Fjs\u002Fdocs\u002Fguides\u002Fproxy-management\" rel=\"noopener noreferrer\">Crawlee\u003C\u002Fa>, la gestión de proxies y cabeceras es la pieza más subestimada en pipelines de scraping de producción.\u003C\u002Fp>\n\n\u003Ch2>got-scraping y su generador de cabeceras: coherencia sin esfuerzo\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>got-scraping\u003C\u002Fstrong> extiende \u003Ccode>got\u003C\u002Fcode> con un got scraping header generator que emite conjuntos de cabeceras coherentes para un navegador, dispositivo y sistema operativo determinados. No se trata de pegar un User-Agent estático: el generador produce \u003Cem>todas\u003C\u002Fem> las cabeceras que ese navegador enviaría, en el orden correcto, con valores consistentes entre sí. Si dices que eres Chrome 124 en Windows, el generador emite el \u003Ccode>sec-ch-ua\u003C\u002Fcode> correspondiente, el \u003Ccode>accept-language\u003C\u002Fcode> plausible y las cabeceras \u003Ccode>sec-fetch-*\u003C\u002Fcode> apropiadas.\u003C\u002Fp>\n\u003Cp>Además, got-scraping soporta HTTP\u002F2 de forma nativa. HTTP\u002F2 permite multiplexar múltiples peticiones sobre una sola conexión TCP, reduciendo latencia y huella de conexión. Esto importa porque los WAF también observan patrones de conexión: abrir una nueva conexión TCP por cada petición es un comportamiento más típico de un script que de un navegador que reutiliza conexiones.\u003C\u002Fp>\n\u003Ch3>Superficie idiomática de la API\u003C\u002Fh3>\n\u003Cp>La API de got-scraping se construye sobre \u003Ccode>got.extend()\u003C\u002Fcode>, el mecanismo estándar de \u003Ccode>got\u003C\u002Fcode> para crear instancias con configuración compartida. Los puntos clave son:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>useHeaderGenerator\u003C\u002Fcode>: activa el generador de cabeceras para que cada petición reciba un conjunto coherente.\u003C\u002Fli>\n\u003Cli>\u003Ccode>headerGeneratorOptions\u003C\u002Fcode>: define el perfil del navegador (\u003Ccode>browsers\u003C\u002Fcode>, \u003Ccode>devices\u003C\u002Fcode>, \u003Ccode>operatingSystems\u003C\u002Fcode>, \u003Ccode>locales\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Ccode>proxyUrl\u003C\u002Fcode>: soporta proxies HTTP\u002F1.1 y HTTP\u002F2, así como SOCKS5 con el prefijo \u003Ccode>socks5:\u002F\u002F\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>http2\u003C\u002Fcode>: habilita HTTP\u002F2 cuando el servidor lo soporta.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Veamos la configuración base:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import { gotScraping } from &apos;got-scraping&apos;;\n\nconst client = gotScraping.extend({\n  useHeaderGenerator: true,\n  headerGeneratorOptions: {\n    browsers: [&apos;chrome&apos;],\n    devices: [&apos;desktop&apos;],\n    operatingSystems: [&apos;windows&apos;, &apos;macos&apos;],\n    locales: [&apos;es-ES&apos;, &apos;en-US&apos;],\n  },\n  http2: true,\n  timeout: { request: 30000 },\n  retry: { limit: 3 },\n});\n\nconst res = await client.get(&apos;https:\u002F\u002Fexample.com&apos;);\nconsole.log(res.statusCode, res.headers[&apos;content-type&apos;]);\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Aquí cada petición recibe un User-Agent y un conjunto completo de cabeceras \u003Ccode>sec-ch-ua\u003C\u002Fcode>, \u003Ccode>accept-language\u003C\u002Fcode> y \u003Ccode>sec-fetch-*\u003C\u002Fcode> consistentes entre sí. El generador elige aleatoriamente dentro de las opciones que le diste, de modo que dos peticiones consecutivas pueden tener cabeceras ligeramente distintas — como ocurriría con navegadores reales.\u003C\u002Fp>\n\n\u003Ch2>Enrutando a través de proxies residenciales en ProxyHat\u003C\u002Fh2>\n\u003Cp>Las cabeceras resuelven la capa HTTP. La reputación de la IP resuelve la capa de red. Un got-scraping proxy residencial usa direcciones IP asignadas por ISPs a hogares reales, por lo que para un WAF son indistinguibles de un visitante legítimo. Los proxies datacenter, en cambio, provienen de rangos ASN conocidos (AWS, DigitalOcean, OVH) que muchos sitios bloquean por defecto o someten a desafíos adicionales.\u003C\u002Fp>\n\u003Cp>ProxyHat expone un gateway único en \u003Ccode>gate.proxyhat.com\u003C\u002Fcode> con puerto \u003Ccode>8080\u003C\u002Fcode> para HTTP y \u003Ccode>1080\u003C\u002Fcode> para SOCKS5. El geo-targeting y el control de sesión se codifican en el nombre de usuario, lo que te permite rotar IPs por petición o mantener una sesión pegajosa sin cambiar la URL base.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Parámetro\u003C\u002Fth>\u003Cth>Formato\u003C\u002Fth>\u003Cth>Ejemplo\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>HTTP proxy\u003C\u002Ftd>\u003Ctd>\u003Ccode>http:\u002F\u002FUSER:PASS@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Rotación automática por petición\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>SOCKS5 proxy\u003C\u002Ftd>\u003Ctd>\u003Ccode>socks5:\u002F\u002FUSER:PASS@gate.proxyhat.com:1080\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Útil para ciertos WAF que inspeccionan proxies HTTP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Geo-país\u003C\u002Ftd>\u003Ctd>\u003Ccode>user-country-US\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>IP residencial de EE. UU.\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Geo-ciudad\u003C\u002Ftd>\u003Ctd>\u003Ccode>user-country-DE-region-state_of_berlin-city-berlin\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Berlín, Alemania\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Sesión pegajosa\u003C\u002Ftd>\u003Ctd>\u003Ccode>user-sid-abc123\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Mantiene la misma IP entre peticiones\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>En got-scraping, pasas la URL del proxy a \u003Ccode>proxyUrl\u003C\u002Fcode> y la librería se encarga del resto, incluyendo el túnel CONNECT para HTTPS. Para SOCKS5, simplemente usa el prefijo \u003Ccode>socks5:\u002F\u002F\u003C\u002Fcode> y got-scraping delegará en el agente SOCKS apropiado.\u003C\u002Fp>\n\n\u003Ch2>Ejemplo completo: rotación residencial con reintentos en Node.js\u003C\u002Fh2>\n\u003Cp>El siguiente ejemplo integra got-scraping con ProxyHat, rotando IPs residenciales de EE. UU. por petición mediante un identificador de sesión único. Cada petición genera un \u003Ccode>sessionId\u003C\u002Fcode> distinto, lo que fuerza una IP nueva sin perder la coherencia de cabeceras. El hook \u003Ccode>beforeRequest\u003C\u002Fcode> inyecta el proxy dinámicamente, y \u003Ccode>afterResponse\u003C\u002Fcode> comprueba si la respuesta indica un bloqueo para forzar un reintento.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import { gotScraping } from &apos;got-scraping&apos;;\nimport { randomUUID } from &apos;node:crypto&apos;;\n\nconst PROXYHAT_USER = process.env.PROXYHAT_USER;\nconst PROXYHAT_PASS = process.env.PROXYHAT_PASS;\n\nfunction buildProxyUrl(sessionId, country = &apos;US&apos;) {\n  const username = `${PROXYHAT_USER}-country-${country}-sid-${sessionId}`;\n  const auth = Buffer.from(`${username}:${PROXYHAT_PASS}`).toString(&apos;base64&apos;);\n  return `http:\u002F\u002F${username}:${PROXYHAT_PASS}@gate.proxyhat.com:8080`;\n}\n\nconst scraper = gotScraping.extend({\n  useHeaderGenerator: true,\n  headerGeneratorOptions: {\n    browsers: [&apos;chrome&apos;],\n    devices: [&apos;desktop&apos;],\n    operatingSystems: [&apos;windows&apos;],\n    locales: [&apos;en-US&apos;],\n  },\n  http2: true,\n  timeout: { request: 30000 },\n  retry: { limit: 4, statusCodes: [403, 429, 500, 502, 503] },\n  hooks: {\n    beforeRequest: [\n      (options) =&gt; {\n        const sessionId = randomUUID().slice(0, 8);\n        options.proxyUrl = buildProxyUrl(sessionId);\n      },\n    ],\n    afterResponse: [\n      (response, retryWithMergedOptions) =&gt; {\n        const body = response.body?.toLowerCase?.() ?? &apos;&apos;;\n        if (\n          response.statusCode === 403 ||\n          body.includes(&apos;captcha&apos;) ||\n          body.includes(&apos;access denied&apos;)\n        ) {\n          return retryWithMergedOptions({\n            proxyUrl: buildProxyUrl(randomUUID().slice(0, 8)),\n          });\n        }\n        return response;\n      },\n    ],\n  },\n});\n\nconst res = await scraper.get(&apos;https:\u002F\u002Fexample.com&apos;);\nconsole.log(res.statusCode, res.body.slice(0, 120));\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>El hook \u003Ccode>beforeRequest\u003C\u002Fcode> construye una URL de proxy nueva en cada intento, forzando rotación. El hook \u003Ccode>afterResponse\u003C\u002Fcode> detecta bloqueos por contenido o por código de estado y reintenta con una IP distinta. Esta combinación de cabeceras coherentes + IP residencial fresca por intento es lo que maximiza la tasa de éxito frente a WAFs agresivos.\u003C\u002Fp>\n\u003Cp>Para SOCKS5, sustituye la URL del proxy por \u003Ccode>socks5:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:1080\u003C\u002Fcode>. Algunos sitios inspeccionan proxies HTTP intermedios; SOCKS5 opera a nivel de transporte y puede evadir esa inspección, a costa de una ligera sobrecarga.\u003C\u002Fp>\n\n\u003Ch2>Patrones de producción: concurrencia, cookies y Crawlee\u003C\u002Fh2>\n\u003Ch3>Concurrencia limitada con p-limit\u003C\u002Fh3>\n\u003Cp>Abrir 1000 peticiones simultáneas agota los sockets de Node, dispara rate limits del destino y satura tu pool de proxies. \u003Ccode>p-limit\u003C\u002Fcode> te permite fijar un techo de concurrencia razonable — típicamente entre 20 y 50 peticiones en vuelo — sin perder paralelismo.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import pLimit from &apos;p-limit&apos;;\n\nconst limit = pLimit(30);\nconst urls = [&apos;https:\u002F\u002Fexample.com\u002Fa&apos;, &apos;https:\u002F\u002Fexample.com\u002Fb&apos;, \u002F* ... *\u002F];\n\nconst results = await Promise.all(\n  urls.map((url) =&gt; limit(() =&gt; scraper.get(url).then((r) =&gt; r.body).catch((e) =&gt; null)))\n);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Cookies persistentes con cookie jars\u003C\u002Fh3>\n\u003Cp>Muchos sitios requieren mantener cookies entre peticiones — tokens anti-bot, tokens de sesión, cookies de preferencia. \u003Ccode>got\u003C\u002Fcode> soporta \u003Ccode>tough-cookie\u003C\u002Fcode> de forma nativa mediante la opción \u003Ccode>cookieJar\u003C\u002Fcode>. Puedes compartir un jar entre peticiones que pertenezcan a la misma sesión lógica.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import { CookieJar } from &apos;tough-cookie&apos;;\n\nconst jar = new CookieJar();\nconst sessionClient = scraper.extend({ cookieJar: jar });\n\nawait sessionClient.get(&apos;https:\u002F\u002Fexample.com\u002Flogin&apos;);\nawait sessionClient.post(&apos;https:\u002F\u002Fexample.com\u002Fapi&apos;, { json: { q: &apos;test&apos; } });\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Integración con Crawlee y CheerioCrawler\u003C\u002Fh3>\n\u003Cp>Cuando tu scraping crece más allá de un puñado de endpoints, \u003Ca href=\"https:\u002F\u002Fcrawlee.dev\u002F\" rel=\"noopener noreferrer\">Crawlee\u003C\u002Fa> — del mismo equipo que got-scraping — ofrece colas de URLs, gestión de proxies, deduplicación y extracción con Cheerio. \u003Ccode>CheerioCrawler\u003C\u002Fcode> usa got-scraping por debajo, por lo que heredas cabeceras coherentes y HTTP\u002F2 gratis.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import { CheerioCrawler, ProxyConfiguration } from &apos;crawlee&apos;;\n\nconst proxyConfiguration = new ProxyConfiguration({\n  proxyUrls: [\n    `http:\u002F\u002F${process.env.PROXYHAT_USER}-country-US-sid-s1:${process.env.PROXYHAT_PASS}@gate.proxyhat.com:8080`,\n    `http:\u002F\u002F${process.env.PROXYHAT_USER}-country-US-sid-s2:${process.env.PROXYHAT_PASS}@gate.proxyhat.com:8080`,\n  ],\n});\n\nconst crawler = new CheerioCrawler({\n  proxyConfiguration,\n  maxConcurrency: 30,\n  requestHandler: async ({ $, request }) =&gt; {\n    const title = $(&apos;title&apos;).text();\n    console.log(request.url, title);\n  },\n});\n\nawait crawler.run([&apos;https:\u002F\u002Fexample.com\u002Fpage1&apos;, &apos;https:\u002F\u002Fexample.com\u002Fpage2&apos;]);\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Crawlee rota entre las URLs de proxy que le pasas, reintenta automáticamente y gestiona la cola de peticiones. Es el siguiente paso natural cuando pasas de un script a un pipeline de scraping de producción. Consulta más detalles sobre nuestra infraestructura de proxies en \u003Ca href=\"\u002Fes\u002Flocations\">\u002Fes\u002Flocations\u003C\u002Fa> y sobre casos de uso en \u003Ca href=\"\u002Fes\u002Fuse-cases\u002Fweb-scraping\">\u002Fes\u002Fuse-cases\u002Fweb-scraping\u003C\u002Fa> y \u003Ca href=\"\u002Fes\u002Fuse-cases\u002Fserp-tracking\">\u002Fes\u002Fuse-cases\u002Fserp-tracking\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Cuándo un navegador headless es inevitable (y cuándo no)\u003C\u002Fh2>\n\u003Cp>got-scraping resuelve la capa HTTP, pero no ejecuta JavaScript. Si el sitio renderiza contenido crítico en el cliente — SPAs con React\u002FVue, contenido detrás de un desafío JS complejo, o huellas de canvas\u002FWebGL — necesitarás un navegador headless como Playwright o Puppeteer. La regla práctica: intenta primero con got-scraping + proxies residenciales; si el contenido no aparece en el HTML inicial, entonces escala a headless.\u003C\u002Fp>\n\u003Cp>Un navegador headless consume entre 150 y 300 MB de RAM por instancia, frente a los ~5 MB de un proceso got-scraping. Para fleet a escala, conteneriza con Docker y orquesta con Kubernetes, limitando el número de pestañas concurrentes por instancia. Puedes seguir usando proxies residenciales de ProxyHat dentro de Playwright mediante \u003Ccode>context.route()\u003C\u002Fcode> o el parámetro \u003Ccode>--proxy-server\u003C\u002Fcode> de Chromium, apuntando a \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Ch2>Consideraciones éticas y legales\u003C\u002Fh2>\n\u003Cp>Antes de lanzar cualquier crawler a escala, revisa estos puntos:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Robots.txt. Léelo y respétalo. Es una señal de cortesía, pero también puede ser considerado en disputas legales.\u003C\u002Fli>\n\u003Cli>Términos de servicio. Algunos sitios prohíben explícitamente el scraping. Violar los ToS puede tener consecuencias bajo la CFAA en EE. UU. o cláusulas contractuales en la UE.\u003C\u002Fli>\n\u003Cli>GDPR y CCPA. Si recolectas datos personales de usuarios europeos o californianos, aplica los principios de minimización y propósito del \u003Ca href=\"https:\u002F\u002Fgdpr.eu\u002Farticle-5-how-to-process-personal-data\u002F\" rel=\"noopener noreferrer\">Artículo 5 del GDPR\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>Rate limits. Limita tu concurrencia para no degradar el servicio del objetivo. Un buen vecino del scraping no satura el servidor.\u003C\u002Fli>\n\u003Cli>APIs oficiales primero. Si el sitio ofrece una API pública o datos abiertos, úsala. Es más estable, más rápido y legalmente más seguro.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Para más detalles técnicos sobre configuración de proxies, consulta la \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentación oficial de ProxyHat\u003C\u002Fa> y nuestra página de \u003Ca href=\"\u002Fes\u002Fpricing\">precios\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Puntos clave\u003C\u002Fh2>\n\u003Cblockquote>\n\u003Cp>Key Takeaways\u003C\u002Fp>\n\u003Cul>\n\u003Cli>got-scraping en Node.js resuelve la coherencia de cabeceras y HTTP\u002F2; un proxy residencial resuelve la reputación de IP. Necesitas ambos para evadir WAFs modernos.\u003C\u002Fli>\n\u003Cli>El got scraping header generator emite conjuntos completos y consistentes (\u003Ccode>sec-ch-ua\u003C\u002Fcode>, \u003Ccode>accept-language\u003C\u002Fcode>, \u003Ccode>sec-fetch-*\u003C\u002Fcode>) para el navegador declarado, eliminando la principal causa de bloqueos a nivel HTTP.\u003C\u002Fli>\n\u003Cli>Usa \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode> para HTTP y \u003Ccode>:1080\u003C\u002Fcode> para SOCKS5, con geo-targeting y sesión en el nombre de usuario.\u003C\u002Fli>\n\u003Cli>Limita la concurrencia con \u003Ccode>p-limit\u003C\u002Fcode> (20–50), persiste cookies con \u003Ccode>tough-cookie\u003C\u002Fcode>, y escala a Crawlee cuando necesites colas y deduplicación.\u003C\u002Fli>\n\u003Cli>Reserva el navegador headless para contenido que requiere ejecución JS; consume 30–60× más memoria por instancia.\u003C\u002Fli>\n\u003Cli>Respeta \u003Ccode>robots.txt\u003C\u002Fcode>, ToS, GDPR\u002FCFAA y los rate limits del objetivo. Prefiere siempre APIs oficiales cuando existan.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>","Guía de got-scraping en Node.js con proxies | ProxyHat","Aprende got-scraping en Node.js: generador de cabeceras, HTTP\u002F2, proxies residenciales en gate.proxyhat.com y patrones de producción con reintentos y Crawlee.","\u002Fes\u002Fblog\u002Fguia-got-scraping-nodejs-proxy-residencial",null,"got-scraping en Node.js con proxies residenciales | ProxyHat","Guía práctica de got-scraping en Node.js: cabeceras coherentes, HTTP\u002F2, proxies residenciales y patrones de producción para scraping a escala.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fguia-got-scraping-nodejs-proxy-residencial-og.webp",[19,22,25,28],{"question":20,"answer":21},"¿Qué es got-scraping en Node.js?","got-scraping es un cliente HTTP para Node.js construido por Apify sobre la librería got. Añade un generador de cabeceras que produce conjuntos coherentes de cabeceras de navegador (User-Agent, sec-ch-ua, accept-language, sec-fetch-*), soporte nativo de HTTP\u002F2 y una opción proxyUrl que acepta proxies HTTP y SOCKS5. Está diseñado específicamente para scraping, a diferencia de got o axios puro, que envían cabeceras minimalistas fácilmente detectables por WAFs.",{"question":23,"answer":24},"¿Por qué importa got-scraping en Node.js para usuarios de proxies?","Porque las cabeceras y la IP son las dos capas que los WAFs inspeccionan. Un proxy residencial con buena reputación es inútil si tus cabeceras delatan que eres un script. got-scraping garantiza que tus cabeceras sean coherentes con un navegador real, mientras que el proxy residencial garantiza que tu IP no pertenezca a un ASN bloqueado. Ambos componentes son complementarios, no sustitutivos.",{"question":26,"answer":27},"¿Cómo evitas bloqueos al implementar got-scraping en Node.js?","Combina cabeceras coherentes del generador, rotación de IPs residenciales por petición o por sesión, reintentos en códigos 403\u002F429, concurrencia limitada entre 20 y 50 peticiones, cookies persistentes cuando el sitio lo requiera y respeto a robots.txt y rate limits. Usa el hook afterResponse para detectar respuestas de bloqueo por contenido y forzar un reintento con una IP nueva. Si el sitio requiere ejecución de JavaScript, escala a un navegador headless con Playwright.",{"question":29,"answer":30},"¿Puedo usar SOCKS5 con got-scraping y ProxyHat?","Sí. got-scraping soporta el prefijo socks5:\u002F\u002F en proxyUrl. En ProxyHat, usa socks5:\u002F\u002FUSERNAME:PASSWORD@gate.proxyhat.com:1080. SOCKS5 opera a nivel de transporte y puede evadir la inspección de proxies HTTP intermedios que algunos WAFs realizan, aunque con una ligera sobrecarga respecto a HTTP.",false,"2026-08-04T16:05:06+00:00","2026-10-03T08:29:58+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fguia-got-scraping-nodejs-proxy-residencial-master.webp","got-scraping in Node.js: A Developer's Guide with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fguia-got-scraping-nodejs-proxy-residencial-card.webp",12,{"name":39,"slug":40,"bio":41,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[43],{"id":44,"slug":45,"name":46,"description":14,"meta_title":47,"meta_description":48,"parent_id":14},4,"guias-desarrolladores","Guías para Desarrolladores","Guías para Desarrolladores | Blog ProxyHat","Tutoriales de código y SDK para integrar proxies en tus aplicaciones.",[],{"ru":51,"en":52,"it":53,"zh":54,"fr":55,"pl":56,"ko":57,"ja":58,"x-default":52},"\u002Fru\u002Fblog\u002Fgot-scraping-nodejs-residential-proxies","\u002Fblog\u002Fgot-scraping-nodejs-residential-proxies","\u002Fit\u002Fblog\u002Fguida-got-scraping-nodejs-proxy","\u002Fcn\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide","\u002Ffr\u002Fblog\u002Fgot-scraping-nodejs-proxy-residentiel-1","\u002Fpl\u002Fblog\u002Fgot-scraping-nodejs-proxy","\u002Fko\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide-1","\u002Fja\u002Fblog\u002Fgot-scraping-nodejs-purokishi",{"pt":60,"ru":51,"en":52,"it":53,"de":61,"es":13,"zh":54,"fr":55,"pl":56,"ko":57,"ja":58,"tr":62},"\u002Fpt\u002Fblog\u002Fguia-got-scraping-nodejs-proxies-residenciais","\u002Fde\u002Fblog\u002Fgot-scraping-nodejs-proxy-guide","\u002Ftr\u002Fblog\u002Fnodejs-got-scraping-proxy-rehberi",123,[65,81,97,113],{"id":66,"slug":67,"title":68,"excerpt":69,"featured_image_url":70,"featured_image_alt":71,"card_image_url":72,"og_image_url":73,"published_at":74,"updated_at":74,"content_updated_at":75,"reading_time_minutes":37,"is_featured":31,"indexable":31,"views":76,"author":77,"categories":78,"tags":80},175,"rotacion-proxies-colly-golang-1","Rotación de proxies en Colly: guía completa para scraping en Go","Aprende a integrar rotación de proxies residenciales en Colly con RoundRobinProxySwitcher, switchers personalizados y patrones de producción para scraping en Go.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Frotacion-proxies-colly-golang-1-master.webp","Rotating Proxies in Colly: A Framework-Idiomatic Guide for Go Developers","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Frotacion-proxies-colly-golang-1-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Frotacion-proxies-colly-golang-1-og.webp","2026-08-04T10:05:34+00:00","2026-10-03T23:53:00+00:00",73,{"name":39,"slug":40,"bio":41,"avatar_url":14,"website_url":14,"social_links":14},[79],{"id":44,"slug":45,"name":46,"description":14,"meta_title":47,"meta_description":48,"parent_id":14},[],{"id":82,"slug":83,"title":84,"excerpt":85,"featured_image_url":86,"featured_image_alt":87,"card_image_url":88,"og_image_url":89,"published_at":90,"updated_at":90,"content_updated_at":91,"reading_time_minutes":37,"is_featured":31,"indexable":4,"views":92,"author":93,"categories":94,"tags":96},195,"scrapear-api-mercado-bybit-v5-proxies","Cómo extraer datos de mercado cripto con proxies rotativos: límites, geobloqueos y paginación (ejemplo: API V5 de Bybit)","Guía de desarrollo para extraer datos de mercado de Bybit V5 usando proxies residenciales rotativos. Cubre endpoints, rate limits, geo-bloqueos, sesiones sticky y ejemplos en Python y Node.js con ProxyHat.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fscrapear-api-mercado-bybit-v5-proxies-master.webp","How to Scrape the Bybit V5 Market API with Rotating Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fscrapear-api-mercado-bybit-v5-proxies-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fscrapear-api-mercado-bybit-v5-proxies-og.webp","2026-08-03T16:09:16+00:00","2026-10-04T01:29:51+00:00",88,{"name":39,"slug":40,"bio":41,"avatar_url":14,"website_url":14,"social_links":14},[95],{"id":44,"slug":45,"name":46,"description":14,"meta_title":47,"meta_description":48,"parent_id":14},[],{"id":98,"slug":99,"title":100,"excerpt":101,"featured_image_url":102,"featured_image_alt":103,"card_image_url":104,"og_image_url":105,"published_at":106,"updated_at":106,"content_updated_at":107,"reading_time_minutes":37,"is_featured":31,"indexable":31,"views":108,"author":109,"categories":110,"tags":112},194,"scrapear-api-binance-proxies","Cómo scrapear la API REST de Binance con proxies: guía para desarrolladores","Guía técnica con código ejecutable para extraer datos públicos de mercado de la API REST de Binance a escala usando proxies residenciales rotativos. Cubre endpoints, rate limits, weight headers y estrategias de rotación de IP.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fscrapear-api-binance-proxies-master.webp","How to Scrape the Binance REST API with Proxies: A Developer Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fscrapear-api-binance-proxies-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fscrapear-api-binance-proxies-og.webp","2026-08-03T10:04:04+00:00","2026-10-03T08:21:32+00:00",82,{"name":39,"slug":40,"bio":41,"avatar_url":14,"website_url":14,"social_links":14},[111],{"id":44,"slug":45,"name":46,"description":14,"meta_title":47,"meta_description":48,"parent_id":14},[],{"id":114,"slug":115,"title":116,"excerpt":117,"featured_image_url":118,"featured_image_alt":119,"card_image_url":120,"og_image_url":121,"published_at":122,"updated_at":122,"content_updated_at":75,"reading_time_minutes":37,"is_featured":31,"indexable":31,"views":123,"author":124,"categories":125,"tags":127},172,"usar-proxies-en-swift-urlsession-1","Usar proxies en Swift con URLSession: guía práctica para iOS y macOS","Guía completa para configurar proxies residenciales en Swift usando URLSession, con ejemplos de código async\u002Fawait, autenticación, SOCKS5 y mejores prácticas de producción.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fusar-proxies-en-swift-urlsession-1-master.webp","Using Proxies in Swift: A Code-First Guide to URLSession, SOCKS5 & Residential IPs","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fusar-proxies-en-swift-urlsession-1-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fes\u002Fusar-proxies-en-swift-urlsession-1-og.webp","2026-07-26T16:03:44+00:00",235,{"name":39,"slug":40,"bio":41,"avatar_url":14,"website_url":14,"social_links":14},[126],{"id":44,"slug":45,"name":46,"description":14,"meta_title":47,"meta_description":48,"parent_id":14},[],[]]