Volver al blog

Navegador de huellas dactilares no detectado de Node.js: Puppeteer y Playwright

Ava Wilson
Ava Wilson

Expert in Web Scraping Technologies

09-Jul-2026

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/browser es un punto final CDP — puppeteer.connect({ browserWSEndpoint }) y chromium.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.webdriver como false y 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.

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 proxyCountry elige la región de salida residencial.
  • Envía una huella digital consistente — un objeto fingerprint mantiene coherente el agente de usuario, la plataforma, la pantalla y la zona horaria.
  • Persiste el estado — un profileId lleva 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.

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-core y/o playwright-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 Copy
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 Copy
// 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 Copy
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 Copy
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() a puppeteer.connect({ browserWSEndpoint }). Nada más cambia.
  • ¿Ya estás en Playwright? Cambia chromium.launch() a chromium.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.

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.webdriver es false en ambos, así que la primera verificación que un sitio realiza se lee como un Chrome real.
  • sessionTTL está 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.

Artículos más populares

Catalogar