Navegador de huellas dactilares no detectado de Node.js: Puppeteer y Playwright
Expert in Web Scraping Technologies
TL;DR:
- En Node.js, el navegador es lo que te hace detectable — no tu código. Puppeteer y Playwright controlan Chromium a través del Protocolo DevTools, y ambos se conectan a un navegador remoto con una URL, por lo que la solución es cambiar dónde se ejecuta el navegador, no reescribir el script.
- Un navegador local de Node.js filtra automatización en tres ejes a la vez: el flag
navigator.webdriver, una huella digital predeterminada en headless, y tu propia IP de salida. Los detectores puntúan los tres juntos, razón por la cual parchear uno a la vez nunca funciona del todo. - Un punto final sirve a ambas bibliotecas.
wss://browser.scrapeless.com/api/v2/browseres un punto final CDP —puppeteer.connect({ browserWSEndpoint })ychromium.connectOverCDP()ambos se conectan a él y obtienen Chromium real, una huella digital limpia por sesión, y salida residencial en más de 195 países. - Escribe la conexión una vez, reutilízala en todas partes. Un único helper que construye el punto final mantiene cada script — Puppeteer o Playwright — apuntando a la misma sesión gestionada.
- Verificado en vivo: tanto una conexión de Puppeteer como de Playwright leen
navigator.webdrivercomofalsey devuelven el título real de la página objetivo, y la ejecución de Puppeteer reportó una IP de salida residencial en EE.UU. - Gratis para empezar. Nuevas cuentas de Scrapeless incluyen tiempo de ejecución gratuito del Navegador de Scraping — regístrate en app.scrapeless.com.
Introducción: el navegador es la pista, no el script
Un stack de scraping en Node.js generalmente comienza local: instalar Puppeteer o Playwright, lanzar Chromium, controlar la página. Funciona hasta que el objetivo comienza a puntuar el navegador. Entonces, los mismos tres señales aparecen independientemente de qué biblioteca elegiste — el script anuncia automatización a través de la propiedad navigator.webdriver, la construcción en headless envía fuentes y comportamientos predeterminados, y el tráfico sale de una IP que los servicios de reputación ya conocen.
Esos son problemas a nivel de navegador y de red, no problemas lógicos. Tanto Puppeteer como Playwright ya saben cómo conectarse a un navegador que no lanzaron — a través de el Protocolo DevTools de Chrome — y el Navegador de Scraping Scrapeless es exactamente eso: un punto final CDP alcanzado a través de una URL WebSocket. Apunta cualquiera de las bibliotecas a él y la huella digital, el comportamiento y la IP de salida se mueven del lado del servidor mientras tu código de Node.js permanece intacto.
Lo que puedes hacer con ello
- Mantén tu biblioteca — Puppeteer y Playwright ambos se conectan al mismo punto final; sin reescritura.
- Ejecuta en sitios protegidos contra bots — los desafíos se resuelven durante el renderizado, de modo que la navegación alcanza contenido.
- Localiza la sesión — un valor
proxyCountryelige la región de salida residencial. - Envía una huella digital consistente — un objeto
fingerprintmantiene coherente el agente de usuario, la plataforma, la pantalla y la zona horaria. - Persiste el estado — un
profileIdlleva cookies y almacenamiento local a través de ejecuciones. - Escala fuera de tu laptop — las sesiones se ejecutan en la nube, por lo que los lotes no están limitados a un Chromium local.
Por qué el Navegador de Scraping Scrapeless
El Navegador de Scraping Scrapeless es un navegador en la nube personalizable y anti-detección diseñado para arañas web y agentes de IA. Para un stack de Node.js específicamente, trae:
- Chromium real desarrollado por nosotros que ejecuta JavaScript de página exactamente como Chrome, por lo que los SPAs y desafíos se resuelven.
- Una huella digital consistente por sesión — sin pistas de
navigator.webdriver, sin predeterminados en headless que filtran. - Salida residencial en más de 195 países, seleccionada por sesión con un único valor
proxyCountry. - Una superficie CDP para ambas bibliotecas — Puppeteer y Playwright se conectan al mismo punto final WebSocket.
- Persistencia de sesión a través de
profileId, por lo que un flujo autenticado mantiene su estado.
Obtén tu clave API en el plan gratuito en app.scrapeless.com.
Requisitos previos
- Node.js 18 o más reciente
puppeteer-corey/oplaywright-core(ambos evitan la descarga del navegador local — te conectas a uno remoto)- Una cuenta de Scrapeless y clave API — regístrate en app.scrapeless.com
Los detalles completos de conexión están en la documentación del Navegador de Scraping.
Instalación
Instala la biblioteca que tu proyecto ya utiliza — o ambas.
bash
npm install puppeteer-core playwright-core
export SCRAPELESS_API_KEY=tu_token_api_aquí # clave gratuita en https://app.scrapeless.com
Escribe la conexión una vez
El punto final es el mismo para ambas bibliotecas, así que constrúyelo en un solo lugar. Cada opción — proxyCountry, fingerprint, profileId — es un parámetro de consulta.
javascript
// scrapeless.js — un generador de punto final para todo el proyecto
import { URLSearchParams } from "node:url";
export function scrapelessEndpoint(extra = {}) {
const params = new URLSearchParams({
token: process.env.SCRAPELESS_API_KEY,
sessionTTL: "180", // segundos
proxyCountry: "US",
...extra,
});
return `wss://browser.scrapeless.com/api/v2/browser?${params}`;
}
Ruta A — Puppeteer
Puppeteer se conecta con puppeteer.connect(). La especificación W3C WebDriver requiere que la automatización conformante exponga la bandera webdriver; el navegador en la nube no la lleva.
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 browser = await puppeteer.connect({ browserWSEndpoint: endpoint });
const page = await browser.newPage();
await page.goto("https://www.scrapeless.com/en", { waitUntil: "domcontentloaded", timeout: 60000 });
console.log("título de puppeteer:", await page.title());
console.log("puppeteer navigator.webdriver:", await page.evaluate(() => navigator.webdriver));
await browser.close();
Una ejecución en vivo imprimió título de puppeteer: Herramienta de raspado web sin esfuerzo - Scrapeless y puppeteer navigator.webdriver: false, en una IP residencial de EE. UU.
Obtén tu clave API en el plan gratuito: app.scrapeless.com
Ruta B — Playwright
Playwright se conecta con chromium.connectOverCDP() al mismo punto final. El código que sigue es estándar de Playwright.
javascript
import { chromium } from "playwright-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 browser = await chromium.connectOverCDP(endpoint);
const page = await browser.newPage();
await page.goto("https://www.scrapeless.com/en", { waitUntil: "domcontentloaded", timeout: 60000 });
console.log("título de playwright:", await page.title());
console.log("playwright navigator.webdriver:", await page.evaluate(() => navigator.webdriver));
await browser.close();
Una ejecución en vivo imprimió título de playwright: Herramienta de raspado web sin esfuerzo - Scrapeless y playwright navigator.webdriver: false.
Elegir entre ellos
El punto final es idéntico, así que elige la biblioteca según sus propios méritos, y no por cuál de ellas evita la detección — el navegador en la nube se encarga de eso para ambas:
- ¿Ya estás en Puppeteer? Cambia
puppeteer.launch()apuppeteer.connect({ browserWSEndpoint }). Nada más cambia. - ¿Ya estás en Playwright? Cambia
chromium.launch()achromium.connectOverCDP(). Los localizadores y la espera automática permanecen sin cambios. - ¿Empezando de nuevo? Los localizadores y la espera automática de Playwright son ergonómicos para flujos complejos; Puppeteer es más ágil cuando navegas y lees principalmente. Ambos se conectan a la misma sesión.
Donde los navegadores locales de Node.js se detienen
Ejecutar Chromium en tu propia máquina está bien para páginas abiertas. La fricción comienza donde el objetivo evalúa el navegador: un desafío intersticial que se detiene en una IP de centro de datos, una página que identifica las configuraciones predeterminadas sin cabeza, o un muro de inicio de sesión que quiere una identidad estable a lo largo de las visitas. Esos son problemas de huellas digitales, comportamiento e IP — los tres que el navegador en la nube maneja del lado del servidor — y afectan a Puppeteer y Playwright de la misma manera. Conectarse a Scrapeless entrega esos casos a una sesión administrada mientras tu código de Node.js permanece idéntico.
Lo que obtienes de vuelta
Ambos caminos devuelven un objeto de navegador normal para su biblioteca — páginas de Puppeteer, localizadores de Playwright — y se comportan como cualquier sesión local. Algunas observaciones honestas:
navigator.webdriveresfalseen ambos, así que la primera verificación que un sitio realiza se lee como un Chrome real.sessionTTLestá en segundos aquí — configúralo para cubrir todo el flujo; la sesión se cierra cuando caduca.- La IP de salida coincide con
proxyCountry— las páginas con geo-restricciones se resuelven como un visitante local las ve. - Calienta la sesión para páginas obstinadas — carga la página de inicio del sitio primero antes de la página protegida, así la superficie de comportamiento se lee como una visita normal.
Conclusión: un punto final, cualquiera sea la biblioteca
En Node.js, la superficie de detección es el navegador, por lo que la solución es mover el navegador y no reescribir el scraper. Construye el endpoint una vez, luego puppeteer.connect() o chromium.connectOverCDP() contra él y mantén el resto de tu código. Asigna proxyCountry a una región residencial, pasa un fingerprint coherente y reutiliza un profileId para flujos autenticados. Para ejecutar el mismo navegador en la nube desde Python, consulta la guía de scraper de producción de Scrapling, y compara planes en la página de precios de Scrapeless.
¿Listo para construir tu pipeline de scraping en Node.js?
Únete a nuestra comunidad para reclamar un plan gratuito y conectarte con desarrolladores que construyen pipelines de scraping en Node.js: Discord · Telegram.
Regístrate en app.scrapeless.com para obtener el runtime de Scraping Browser gratuito y apunta Puppeteer o Playwright al navegador en la nube que tus objetivos no pueden fingerprint.
FAQ
Q: ¿Tengo que elegir entre Puppeteer y Playwright?
No. Ambos se conectan al mismo endpoint de Scrapeless — puppeteer.connect({ browserWSEndpoint }) o chromium.connectOverCDP(). Usa el que tu proyecto ya utilice, o ambos.
Q: ¿Debo cambiar mi lógica de scraping?
No. Cambias la forma en que se obtiene el navegador; la navegación, los selectores/localizadores y la evaluación permanecen igual.
Q: ¿Por qué paquetes -core?
puppeteer-core y playwright-core omiten la descarga del navegador empaquetado porque te conectas al navegador en la nube en lugar de lanzar uno local.
Q: ¿Necesito un proxy?
No. La salida residencial está incorporada — establece proxyCountry a una región o ANY.
Q: ¿Es legal el web scraping con Node.js?
Acceder a datos públicamente disponibles 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 a un abogado para 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.



