Cómo resolver Cloudflare con Node.js (Puppeteer + Scrapeless)
Advanced Bot Mitigation Engineer
TL;DR:
- Cloudflare puntúa el navegador, no al visitante. Lee la consistencia de la huella digital, señales de comportamiento y la IP de salida, y luego establece una cookie
cf_clearancepara un navegador de confianza; por lo tanto, limpiarla en Node.js significa ser un navegador de confianza, no resolver un rompecabezas. - Un navegador local de Node.js falla en esa puntuación en tres ejes: la señal de
navigator.webdriver, una huella digital predeterminada sin cabeza y una IP de salida de centro de datos. Apilar complementos sigilosos para arreglar los tres es una cinta de mantenimiento. - El Scrapeless Scraping Browser resuelve el desafío durante el renderizado — verdadero Chromium desarrollado internamente, una huella digital consistente por sesión, y salida residencial en más de 195 países, alcanzada a través de un único punto final de WebSocket.
- Tu Node.js sigue siendo Puppeteer estándar. Conéctate con
puppeteer.connect(), espera el contenido posterior al desafío y lee la página; el único cambio es la URL de conexión. - Verificado en vivo: una sesión de Puppeteer a través del navegador en la nube superó la página de desafío de Cloudflare, leyó el marcador de éxito
¡Superaste el desafío de Cloudflare! :D, y recibió una cookiecf_clearance. - Gratis para empezar. Las nuevas cuentas de Scrapeless incluyen tiempo de ejecución gratuito de Scraping Browser — regístrate en app.scrapeless.com.
Introducción: limpiar Cloudflare en Node.js es un problema de navegador
Un desafío de Cloudflare no es un CAPTCHA de imagen que decodificas. Se ejecuta en segundo plano y evalúa el navegador que cargó la página — si la huella digital es internamente consistente, si las señales de interacción parecen humanas, y si la IP de salida tiene una buena reputación. Cuando la puntuación pasa, Cloudflare establece una cookie cf_clearance y se carga la página real. Cuando no, obtienes un intersticial en lugar de contenido.
Eso reestructura la tarea de Node.js. No hay ninguna respuesta que enviar; el trabajo es presentar un navegador en el que Cloudflare ya confía. Un Chromium sin cabeza local impulsado por Puppeteer no puede: anuncia automatización a través de la propiedad navigator.webdriver, envía fuentes predeterminadas sin cabeza y comportamientos de lienzo, y sale desde una IP que los servicios de reputación ya conocen. Puedes agregar un complemento sigiloso y luego seguir parcheando a medida que Chromium y los detectores avanzan. Esta guía toma el camino más corto: utiliza el Scrapeless Scraping Browser desde Puppeteer estándar, para que la huella digital, el comportamiento y la IP de salida se manejen del lado del servidor y el desafío se resuelva durante un renderizado normal.
Qué verifica realmente Cloudflare
La propia documentación de Cloudflare describe un paso de verificación que se ejecuta sin interrumpir al visitante. En la práctica, evalúa tres cosas y concede una cookie cf_clearance — una cookie estándar HTTP — cuando pasan:
| Lo que Cloudflare lee | Por qué un navegador local de Node.js falla |
|---|---|
| Consistencia de huella digital | los elementos predeterminados sin cabeza y la bandera webdriver contradicen a un verdadero Chrome |
| Señales de comportamiento | temporización programada sin una superficie de navegador coherente |
| Reputación de IP de salida | las IP de centros de datos tienen una puntuación peor que las residenciales |
Un navegador coherente y de confianza importa más que cualquier evasión individual, por lo que mover los tres del lado del servidor es más durable que apilar complementos sigilosos.
Por qué Scrapeless Scraping Browser
El Scrapeless Scraping Browser es un navegador en la nube personalizable y anti-detección diseñado para crawlers web y agentes de IA. Para Cloudflare específicamente, ofrece:
- Un verdadero Chromium desarrollado internamente que ejecuta el JavaScript del desafío exactamente como Chrome, por lo que se resuelve en lugar de estancarse.
- Una huella digital consistente por sesión — sin la señal de
navigator.webdriver, sin elementos predeterminados sin cabeza filtrándose. - Salida residencial en más de 195 países — Cloudflare puntúa la IP de salida, y una región residencial se ve limpia donde no lo es una IP de centro de datos.
- Persistencia de sesión para que una concesión de
cf_clearancepueda reutilizarse en múltiples solicitudes dentro de la misma sesión. - Una superficie de conexión — cada opción es un parámetro de consulta en el mismo punto final de WebSocket.
Obtén tu clave de API en el plan gratuito en app.scrapeless.com.
Prerrequisitos
- Node.js 18 o más reciente
puppeteer-coreinstalado (no se necesita Chromium empaquetado, te conectas a uno remoto)- Una cuenta de Scrapeless y clave de API — regístrate en app.scrapeless.com
Aquí tienes la traducción al español:
Detalles de conexión completos viven en la documentación del Navegador de Scraping.
Instalar
Te conectas a un navegador remoto, así que puppeteer-core (sin Chromium incluido) es todo lo que necesitas.
bash
npm install puppeteer-core
export SCRAPELESS_API_KEY=tu_token_api_aquí # clave gratuita en https://app.scrapeless.com
Conectar y resolver el desafío
Construye el endpoint, conéctate con puppeteer.connect(), navega y espera a que el contenido posterior al desafío se adjunte. El desafío se resuelve durante el renderizado; no hay una llamada de solución separada.
javascript
import puppeteer from "puppeteer-core";
import { URLSearchParams } from "node:url";
const params = new URLSearchParams({
token: process.env.SCRAPELESS_API_KEY,
sessionTTL: "180",
proxyCountry: "US",
});
const endpoint = `wss://browser.scrapeless.com/api/v2/browser?${params}`;
const TARGET = "https://www.scrapingcourse.com/cloudflare-challenge";
const browser = await puppeteer.connect({ browserWSEndpoint: endpoint });
const page = await browser.newPage();
await page.goto(TARGET, { waitUntil: "domcontentloaded", timeout: 90000 });
// El navegador en la nube elimina Cloudflare durante el renderizado; espera el contenido real.
await page.waitForSelector("#challenge-title", { timeout: 90000 });
console.log("eliminado:", await page.$eval("#challenge-title", (el) => el.innerText));
const cookies = await page.cookies();
console.log("cf_clearance:", cookies.some((c) => c.name === "cf_clearance"));
await browser.close();
Una ejecución en vivo de este script imprimió eliminado: ¡bypassaste el desafío de Cloudflare! :D y cf_clearance: true — Puppeteer estándar, obtenido a través del navegador en la nube.
Obtén tu clave API en el plan gratuito: app.scrapeless.com
Confirmar el paso y llevar la autorización
La señal confiable es el contenido real que se adjunta; una vez que el elemento posterior al desafío está presente, la página está despejada. Cloudflare también establece una cookie cf_clearance en la sesión que ha pasado, que puedes leer para llevar la autorización a otras solicitudes en la misma sesión. La especificación W3C WebDriver requiere que la automatización conforme exponga la bandera webdriver; el navegador en la nube no la lleva, por eso la primera verificación aparece limpia.
javascript
const cookies = await page.cookies();
const clearance = cookies.find((c) => c.name === "cf_clearance");
console.log("cf_clearance presente:", Boolean(clearance));
if (clearance) console.log("dominio:", clearance.domain);
Fijar la región para una autorización confiable
Cloudflare puntúa la IP de salida, así que fija proxyCountry a una región residencial. Cámbiala a cualquier código de país ISO.
javascript
const params = new URLSearchParams({
token: process.env.SCRAPELESS_API_KEY,
sessionTTL: "180",
proxyCountry: "US", // o "DE", "JP", "CUALQUIERA"
});
Dónde se detienen los navegadores locales de Node.js
Un scraper local de Puppeteer está bien hasta que Cloudflare comienza a puntuar el navegador. Luego, la huella dactilar sin cabeza, la bandera webdriver, y la IP del centro de datos fallan en una verificación diferente, y el intersticial reemplaza el contenido. Esos son problemas de huella dactilar, comportamiento e IP — los tres que el navegador en la nube maneja del lado del servidor. Conectarse a Scrapeless los entrega a una sesión administrada mientras tu código de Puppeteer permanece estándar.
Lo que obtienes de vuelta
La sesión se comporta como cualquier sesión de Puppeteer — page.goto, page.waitForSelector, page.content(), y las cookies funcionan. Algunas observaciones honestas de la eliminación de Cloudflare a través del navegador en la nube:
navigator.webdriverestá ausente, por lo que la primera verificación que realiza Cloudflare se lee como un Chrome real.- La IP de salida coincide con
proxyCountry— una región residencial limpia más confiablemente que una IP de centro de datos. cf_clearanceestá presente después de un pase — reutiliza la misma sesión para llevar la autorización a las solicitudes posteriores.- Calienta la sesión para páginas obstinadas — carga la página principal del sitio primero en la misma sesión antes de la página protegida, para que la superficie de comportamiento se vea como una visita normal.
Conclusión: eludir Cloudflare, mantener tu Node.js.
Limpiar Cloudflare en Node.js no se trata de decodificar un desafío, sino de presentar un navegador en el que Cloudflare confía. El Navegador de Scraping Sin Residuos maneja las tres cosas que puntúa (huella digital, comportamiento, IP de salida) del lado del servidor, por lo que tu código de Puppeteer solo cambia su URL de conexión. Fija proxyCountry a una región residencial, espera el contenido posterior al desafío y lee cf_clearance para confirmar el paso. Para ejecutar el mismo navegador en la nube desde Python, consulta la guía de producción de Scraping, y compara planes en la página de precios de Scrapeless.
¿Listo para construir tu pipeline que limpia Cloudflare?
Únete a nuestra comunidad para reclamar un plan gratuito y conectarte con desarrolladores que scrapean sitios protegidos por Cloudflare: Discord · Telegram.
Regístrate en app.scrapeless.com para obtener un tiempo de ejecución gratuito del Navegador de Scraping y apunta Puppeteer al navegador en la nube que limpia Cloudflare durante la renderización.
FAQ
P: ¿Necesito un servicio separado para resolver CAPTCHA?
No en un navegador que pasa. Cloudflare generalmente puntúa la huella digital, el comportamiento y la IP en segundo plano y emite una cookie cf_clearance. El navegador en la nube está diseñado para pasar esa puntuación durante una renderización normal, por lo que no hay un paso separado de rompecabezas que configurar.
P: ¿puppeteer o puppeteer-core?
Usa puppeteer-core. Evita la descarga de Chromium empaquetado porque te conectas al navegador en la nube en lugar de iniciar uno local.
P: ¿Necesito un proxy?
No. La salida residencial está integrada: establece proxyCountry en una región o ANY. Cloudflare puntúa la IP de salida, por lo que una región residencial se limpia de manera más confiable que una dirección de centro de datos.
P: El desafío aún aparece en algunas páginas — ¿qué ayuda?
Fija proxyCountry a una región residencial y calienta la sesión cargando la página principal del sitio primero en la misma sesión antes de la página protegida, para que la superficie de comportamiento se vea como una visita normal.
P: ¿Es legal limpiar Cloudflare?
Acceder a datos disponibles públicamente generalmente está permitido, pero las reglas varían según la jurisdicción y el sitio. Revisa los términos de servicio del objetivo, respeta las directivas de robots y consulta con un abogado por cualquier asunto sensible.
En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.



