Reseña de Puppeteer 24.16: automatización de navegador centrada en Chrome, sin orquestación de rastreo

Última actualización: August 18, 2026
Reseña de Puppeteer 24.16: automatización de navegador centrada en Chrome, sin orquestación de rastreo
Resumen con IA
Puppeteer es la librería Node de Google para controlar un Chrome real desde JavaScript: tú escribes la automatización, el Chrome DevTools Protocol transporta las instrucciones y un navegador completo renderiza la página antes de que leas un solo byte. Vive en puppeteer/puppeteer en GitHub: Apache-2.0, escrita en TypeScript y con unas 95,3k estrellas (95.307 el día que tomé la captura). Su posicionamiento oficial es deliberadamente acotado: "una API de JavaScript para controlar Chrome (y experimentalmente Firefox)", lo que te dice qué es y, igual de útil, qué no es.

Puppeteer es la librería Node de Google para controlar un Chrome real desde JavaScript: tú escribes la automatización, el Chrome DevTools Protocol transporta las instrucciones y un navegador completo renderiza la página antes de que leas un solo byte. Vive en puppeteer/puppeteer en GitHub: licencia Apache-2.0, escrita en TypeScript y con unas 95,3k estrellas (95.307 el día que tomé la captura). Su posicionamiento oficial es deliberadamente acotado: "una API de JavaScript para controlar Chrome (y experimentalmente Firefox)", lo que te dice qué es y, igual de útil, qué no es.

Probé Puppeteer 24.16.0 con el mismo servidor de pruebas y las demos públicas que usamos para cada librería de automatización de navegador: un catálogo estático con paginación, un artículo, un catálogo renderizado con JavaScript, una API JSON, una ruta que devuelve 500, un pequeño grafo de rastreo, además de Books to Scrape y Quotes to Scrape. Hizo el trabajo de renderizado sin problemas y sin florituras. También me dejó exactamente una tarea sobre la mesa —la misma que deja cualquier librería de navegador sin interfaz— y ser honestos con esa limitación es, en gran parte, lo que separa una reseña útil de una nota de prensa.

Hubo una cifra que destacó más que las tasas de acierto. En una página cuyos datos llegan desde un endpoint JSON, Puppeteer extrajo los 8 registros sin raspar el DOM en absoluto: ejecutó fetch dentro de la página y leyó directamente el objeto de respuesta. Eso, sumado al renderizado nativo con capturas funcionando, define bien la herramienta: un renderizador Chrome maduro, no un framework de rastreo; y esa diferencia importa antes de escribir la primera línea.

Qué es realmente Puppeteer (y con qué compite)

La etiqueta de la categoría aquí sí importa, así que empecemos por ahí. Puppeteer es una librería de automatización de navegador. Abre Chrome, carga páginas, deja que corra el JavaScript de la página y te entrega el resultado renderizado para leerlo o capturarlo. Esa es la razón de usarlo en lugar de un cliente HTTP con un parser HTML: quieres la página después de que se ejecuten sus scripts, no el esqueleto vacío que envía primero el servidor.

Por su diseño compite con otras librerías de navegador real —Playwright y Selenium—, no con frameworks de rastreo como Scrapy ni con herramientas Markdown para LLM. Si apuntas Puppeteer a mil URLs y esperas que las ponga en cola, elimine duplicados, limite la velocidad con cortesía y escriba un conjunto de datos, has llevado un renderizador a un problema de crawling. Renderizará cada página de forma excelente, pero no gestionará la orquestación. (Eso es un límite de alcance, no un fallo —volveré sobre ello, porque es lo más importante que debes interiorizar antes de adoptar la herramienta.)

System diagram: Browser Automation Is Not a Crawler

Puppeteer nació del equipo de Chrome de Google, por eso está pensado primero para Chrome y por eso su API se siente como un guante fino y bien usado sobre el protocolo de depuración del propio navegador. Lleva suficiente tiempo como para que eso sea una virtud: las funciones que necesitas han sido estables durante años, la documentación es completa y el ecosistema alrededor es amplio.

Renderizado nativo y patrón de fetch dentro de la página

Hay dos comportamientos que conviene destacar de la tabla de resultados porque definen cómo usarías realmente esta herramienta.

Primero, el renderizado nativo. El catálogo renderizado con JavaScript —una página que construye su cuadrícula de productos del lado del cliente después de cargar— devolvió 8/8, con una captura de pantalla completa guardada en disco. La configuración fue mínima, pero sí incluyó esperar al contenido objetivo después de goto. La página pública de Quotes to Scrape en JS devolvió las diez citas con el mismo patrón. Estos son resultados de fixtures, no una puntuación general de recall de renderizado.

Segundo, el fixture de API JSON cargó productos desde /api/dynamic-products. Ejecutar un fetch del mismo origen a través de page.evaluate devolvió los ocho registros sin analizar filas renderizadas. Es un patrón general de evaluación en navegador, no un descubrimiento específico de Puppeteer. Puede simplificar la extracción cuando el endpoint y el contrato de la petición son conocidos; aun así, los encabezados de autenticación, tokens en tiempo de ejecución, la política de credenciales, CORS/CSP, service workers y la paginación pueden hacer que una solicitud de la aplicación sea distinta.

La tercera idea que conviene llevarse no es una cifra, sino el marco conceptual: Puppeteer es un renderizador Chrome maduro y no es un crawler. Ambas partes son ciertas, y la segunda es la que suelen omitir las reseñas.

Cómo se comunica Puppeteer con Chrome

System diagram: How Puppeteer Talks to Chrome

En Chrome, Puppeteer usa el Chrome DevTools Protocol (CDP), el canal JSON sobre WebSocket que utilizan las DevTools del navegador. puppeteer.launch() inicia Chrome y abre esa conexión de protocolo; llamadas como goto, $$eval y screenshot exponen operaciones del navegador a través de una API de nivel superior. El soporte para Firefox sigue la ruta WebDriver BiDi que se describe más abajo, así que no todas las operaciones de Puppeteer son universalmente comandos CDP.

page.evaluate ejecuta una función dentro del contexto de la página, por lo que un fetch('/api/...') relativo usa el origen de esa página y puede reutilizar cookies y estado de sesión válidos. No reproduce automáticamente encabezados de autorización creados por la aplicación, opciones de solicitud, tokens ni comportamiento de service workers. En este fixture del mismo origen devolvió JSON directamente; las solicitudes de producción necesitan revisar su contrato real.

También por eso Puppeteer es pesado. Cada página es una pestaña real de navegador con un motor de renderizado real detrás. Eso te da corrección en páginas cargadas de JavaScript y, a cambio, consume más memoria y tiempo de arranque que una extracción solo con HTTP. No existe renderizado gratis; CDP solo hace que la factura sea visible.

La pregunta del motor, dicha sin rodeos

Hay una simplificación popular que dice que Puppeteer es "solo para Chrome". Para la versión que probé, eso es incorrecto, y corregirlo cambia la comparación.

MotorCómo lo controla Puppeteer 24.16.0Probado en estas pruebas
ChromeEnfocado primero en Chrome mediante CDP — el valor predeterminado, así que las automatizaciones existentes siguen funcionando
FirefoxSoporte documentado mediante WebDriver BiDi desde v23no
WebKitNo lo controla en absoluto

Tanto Chrome for Developers como Mozilla explicaron el cambio para Firefox cuando llegó. La versión que ejecuté, 24.16.0, está bastante por encima de v23, así que decir "solo Chrome" se queda corto frente a lo que realmente incluye. La ausencia de WebKit, sumada a que su historia multiengine es más joven que la de Playwright, es la diferencia real de cobertura, no "un motor frente a tres".

La ruta Firefox/BiDi está documentada y disponible en la versión que probé, pero no ejecuté mis fixtures sobre ella, así que informo de una capacidad, no de una medición. Si Firefox es determinante para tus objetivos, verifica esto con tus propias páginas antes de comprometerte. Para quien quiera la comparación completa entre motores y alcance de lenguajes, nuestra comparativa Playwright vs Puppeteer pasa ambas librerías por estas mismas pruebas y resuelve allí la pregunta de "cuál usar"; aquí el tema es solo Puppeteer.

Instalación y puesta en marcha: lo pesado es el navegador

La ruta predeterminada npm install puppeteer descarga una build compatible de Chrome for Testing. Ese comportamiento puede omitirse o redirigirse mediante configuración, y el usuario puede apuntar Puppeteer a otro ejecutable, así que el ajuste de versiones depende de la decisión de despliegue. La descarga del navegador fue la parte más pesada de esta instalación; una instantánea de auditoría del gestor de paquetes no se considera una propiedad de seguridad duradera.

Ese empaquetado automático es una ventaja real de usabilidad y también un coste real de huella, y vale la pena nombrar ambos lados. La ventaja: no tienes que buscar un navegador compatible ni fijar versiones a mano; npm install te entrega un par funcional. El coste: estás descargando un navegador, así que reserva disco y ancho de banda, especialmente en CI, donde una caché fría paga ese precio en cada runner nuevo.

También contrasta claramente con Playwright, que separa los dos pasos: instalas la librería y luego ejecutas npx playwright install para traer sus compilaciones de navegador. Ningún enfoque es doloroso; simplemente fallan de forma distinta. El comando único de Puppeteer puede sorprenderte por su tamaño en una conexión limitada, mientras que el segundo paso de Playwright puede sorprenderte por olvidarse. Conviene saber cuál estás usando.

Resultados prácticos

Measured results chart: Three data paths exercised

Cada prueba se ejecutó contra un servidor local de fixtures en 127.0.0.1 más dos sitios públicos de práctica, sobre Node v22.22.3, macOS arm64, con Puppeteer 24.16.0 y su Chrome incluido. La verdad de referencia de cada fixture se anotó antes de ejecutar, así que el recall se mide contra un conjunto esperado fijo y no contra lo que Puppeteer imprimiera ese día.

El paquete público de investigación incluye el servidor de fixtures, el runner de pruebas y la verdad de referencia. El bloqueo de dependencias y el resumen bruto de ejecución se omitieron deliberadamente del paquete de publicación porque la revisión de seguridad estricta rechazó los datos del lockfile y el material de endpoints específico del entorno. Para reproducir el fixture local seguro, ejecuta npm install y luego node run_puppeteer_material_tests.mjs dentro de tools/puppeteer/tests, y compara el resultado con la verdad de referencia publicada. Las páginas públicas de demo pueden cambiar, así que el fixture local es la base estable para verificar los conteos esperados.

Para una reconstrucción histórica exacta de dependencias, crea y audita localmente un lockfile nuevo en lugar de tratar un lockfile no publicado como evidencia pública.

PruebaObjetivoResultado
Catálogo estático + paginaciónfixture local12/12, recall 1.0
Extracción de artículofixture localtítulo + 3/3 párrafos, boilderplate separado
Página dinámica JS (renderizado nativo)fixture local8/8, recall 1.0, captura de página completa guardada
API JSON dinámica (fetch dentro de la página)fixture local8/8, recall 1.0, sin scraping del DOM
Manejo de HTTP 500fixture localestado 500 inspeccionable, sin lanzar error
Grafo de rastreo (BFS escrita a mano)fixture local12 páginas, profundidades {0:1, 1:4, 2:7}
Books to Scrapedemo pública20 productos
Quotes JSdemo pública10 citas, renderizado nativo

Algunas de estas merecen una frase más allá de la tabla.

El código de paginación escrito a mano recuperó los 12 elementos esperados del catálogo. El selector del artículo recuperó el título y los tres párrafos del cuerpo esperados; el boilderplate circundante siguió disponible en el DOM. Puppeteer proporcionó el DOM renderizado, mientras que la lógica de selectores —no Puppeteer en sí— definió qué contaba como contenido del artículo.

En la ruta HTTP 500 probada, goto devolvió un objeto de respuesta con estado 500 inspeccionable y no lanzó excepción. Eso no dice nada sobre timeouts, fallos de DNS, caídas del navegador, frames desprendidos u otros errores de navegación, que siguen necesitando manejo explícito.

El grafo de rastreo es el que cuenta la historia completa. Recorrer los enlaces internos del fixture hasta 12 páginas, llevando la profundidad para no volver a visitar URLs, requirió una búsqueda en anchura escrita a mano porque Puppeteer no tiene cola de rastreo integrada. Encontró las 12 páginas en las profundidades {0:1, 1:4, 2:7}, es decir, mi BFS funcionó. Pero la BFS era mía. Puppeteer renderizaba cada página; la lógica para recorrer el sitio era código que yo escribí. Para doce páginas, eso son una docena de líneas y no pasa nada. Para miles de URLs con deduplicación, reintentos y retrasos de cortesía, esa docena de líneas se convierte en un proyecto.

Repito una advertencia porque es fácil abusar de ella: los artefactos incluyen tiempos por prueba, pero son observaciones de una sola ejecución y una sola máquina, no benchmarks. No estoy comparando la velocidad de Puppeteer con nada basándome en un solo portátil y una sola ejecución. Lo que sí respaldan los números es el recall y el comportamiento en ocho tipos distintos de página, no una afirmación de cronómetro.

Lo que no probé

Para que los resultados no se lean como algo más amplio de lo que son, esto quedó fuera de la ejecución y, por tanto, fuera de estas cifras:

Fuera de la ejecución de pruebasEstado
Firefox mediante WebDriver BiDiDocumentado, disponible en 24.16.0, no probado aquí
Proxy y bloqueo/intercepción de solicitudesNo probado; ambas son funciones soportadas que no ejecuté
Escala con páginas en paraleloHice pruebas pequeñas; el comportamiento con flotas de navegadores bajo concurrencia real no está medido
Reejecución en la versión más recienteProbé 24.16.0; npm latest es 25.3.0, una versión mayor completa por delante, a fecha de 2026-07-09. Las APIs que ejercité (launch, goto, $$eval, screenshot, fetch dentro de la página) son estables entre 24→25, pero lo honesto es volver a ejecutar en 25.3.0 antes de apostar cifras exactas sobre ella

Nada de esto es un reproche. Son los límites de lo que una sola ejecución de fixtures puede afirmar con honestidad.

Pros y contras

Pros:

  • Renderizado nativo de JavaScript con espera explícita de contenido: 8/8 en el fixture dinámico y las diez citas en la demo pública, con capturas de pantalla.
  • La paginación escrita a mano y los selectores del artículo recuperaron los elementos esperados del fixture.
  • fetch dentro de la página devolvió los ocho registros del endpoint conocido del mismo origen sin parsear el DOM.
  • El HTTP 500 probado volvió como una respuesta inspeccionable sin excepción.
  • La instalación predeterminada descarga una build compatible de Chrome for Testing; siguen siendo posibles configuraciones para omitir la descarga o usar otro ejecutable.
  • API madura, centrada en Chrome y construida sobre CDP, con ecosistema amplio y documentación completa. Apache-2.0.
  • Más amplia de lo que su fama sugiere: soporte documentado para Firefox vía WebDriver BiDi desde v23.

Contras:

  • Sin cola de rastreo, escritor de datasets ni limitador integrados: para crawling a escala necesitas tu propio código o un envoltorio.
  • Sin motor WebKit, y su historia multiengine es más joven que la de Playwright.
  • El peso de un navegador real: un Chrome incluido que descargar y un coste de memoria por página frente a herramientas solo HTTP.
  • Basada en Node; usarla desde otro lenguaje implica construir y mantener un puente.
  • La versión que ejecuté (24.16.0) queda por detrás de npm latest (25.3.0) en una versión mayor; vuelve a verificar en la actual antes de confiar en cifras exactas.

Para quién es y quién debería saltárselo

Elige Puppeteer si trabajas en Node, tus objetivos se renderizan bien en Chrome (la mayoría) y quieres una librería madura y enfocada que convierta "la página después de que corre su JavaScript" en algo que puedas leer y capturar. Para raspar un conjunto de páginas dinámicas, o extraer una API JSON con la propia sesión de la página, o guardar capturas renderizadas como prueba, es una opción sólida y sin drama. La opción Firefox vía BiDi está ahí si la necesitas más adelante, y el ecosistema hace que la mayoría de problemas ya hayan sido resueltos por alguien antes.

Piénsalo dos veces si tu problema es la orquestación del rastreo y no el renderizado. Si necesitas recorrer cientos o miles de URLs con deduplicación, reintentos y límites de tasa, Puppeteer por sí solo te obligará a reconstruir un crawler a mano; esa no es su capa adecuada. Tampoco merece la pena un navegador sin cabeza si tus páginas no necesitan JavaScript para mostrar sus datos; cuando una petición HTTP y un parser ya devuelven el contenido, un navegador real es un exceso caro que solo consume memoria y tiempo de preparación. Y si necesitas fidelidad de WebKit o un cliente en un lenguaje que no sea JavaScript, esta no es la herramienta para ese eje.

Alternativas y dónde encaja Thunderbit

Primero, el encuadre honesto: Puppeteer es gratuito, Apache-2.0, autoalojado, y tú te encargas de cada parte de su operación —la flota de navegadores, el código de rastreo que añades y la carrera continua contra los sistemas antibot. Para muchos proyectos, esa propiedad es exactamente la correcta, y ningún servicio gestionado renderizará una página autorizada más barato que un navegador que ya tienes.

Dentro del mundo open source, las comparaciones útiles se hacen por trabajo, no por marca. Para crawling a escala, Crawlee es el complemento natural: su PuppeteerCrawler envuelve Puppeteer con la cola de solicitudes, el dataset y el control de ritmo que la librería omite a propósito, de modo que conservas el renderizado y ganas la orquestación. Si tu objetivo de salida es Markdown limpio para una canalización LLM en lugar de un DOM renderizado, Crawl4AI controla un navegador real y produce exactamente eso. Si tus páginas no necesitan navegador, un framework HTTP-first como Scrapy pertenece a otra categoría, más ligera. Cuando comparas varias de estas a la vez, nuestro resumen de scrapers open source pone las categorías una al lado de la otra.

Un servicio gestionado como Thunderbit traslada la operación del navegador y la extracción detrás de una API. No se ejecutó sobre estos fixtures de Puppeteer, así que esta reseña no hace ninguna afirmación equivalente sobre renderizado, bloqueo, calidad de extracción o coste. La frontera de decisión es operativa: gestionar tú mismo el navegador y el código de rastreo, o pagar a un proveedor para operar parte de esa capa.

Con Puppeteer no hay una tarifa de uso de proveedor, pero el cómputo, el ancho de banda, el mantenimiento del navegador, la orquestación y las operaciones siguen siendo tuyos. Una ruta gestionada cobra por uso y traslada parte de esa responsabilidad al proveedor. Este experimento no comparó los resultados.

Prueba Thunderbit para extraer datos web

Veredicto

Puppeteer 24.16.0 merece evaluarse si trabajas en Node y necesitas automatización de navegador centrada en Chrome. El código del fixture recuperó 12 elementos estáticos, ocho elementos dinámicos y diez citas de la demo pública; la API conocida del mismo origen devolvió ocho registros a través de page.evaluate; las capturas funcionaron; y el HTTP 500 probado siguió siendo inspeccionable. Estos resultados pertenecen a los fixtures nombrados y a una versión mayor anterior, no al recall de extracción en general.

Aun así, dimensiona bien las afirmaciones. Puppeteer es un renderizador, no un crawler: mi recorrido de 12 páginas necesitó una BFS escrita a mano porque no hay cola integrada, y a escala ese vacío es trabajo real —delegarlo a Crawlee o construir la maquinaria tú mismo. Está centrado en Chrome, con soporte documentado para Firefox vía BiDi pero sin WebKit, así que no sirve para amplitud multiengine. Además, arrastra el peso de un navegador real. Y probé 24.16.0 contra un latest 25.3.0, así que vuelve a ejecutarlo en la versión actual antes de fiarte de cifras exactas. Si partes de esas cuatro ideas, Puppeteer es una excelente librería de automatización para Chrome. Si esperas que rastree un sitio por ti, acabarás escribiendo el crawler que creías estar descargando.

Prueba Thunderbit para extraer datos web Get Started Free

Preguntas frecuentes

¿Puppeteer renderiza páginas con JavaScript o necesito un complemento? Las renderiza de forma nativa, sin complemento. En mi fixture dinámico devolvió 8 de 8 productos construidos del lado del cliente con recall 1.0 y una captura de página completa, y la página pública Quotes to Scrape en JS devolvió las 10 citas del mismo modo: un goto normal y luego leer el DOM renderizado. Como Puppeteer controla un Chrome real mediante el DevTools Protocol, los scripts de la página se ejecutan de verdad antes de que leas nada.

¿Puppeteer puede raspar una API JSON sin analizar el HTML? Sí, cuando el endpoint y el contrato de la solicitud lo permiten. page.evaluate puede lanzar una petición desde el origen de la página y puede reutilizar cookies válidas, pero no reproduce automáticamente encabezados, tokens, opciones o comportamiento de service worker de la aplicación. En el fixture del mismo origen devolvió los ocho registros sin parsear el DOM.

¿Puppeteer es un crawler web? No: es una librería de automatización de navegador, no un framework de rastreo. No tiene cola de solicitudes, escritor de datasets ni limitador integrados, así que mi crawl de 12 páginas (profundidades {0:1, 1:4, 2:7}) necesitó una búsqueda en anchura escrita a mano. Eso es un límite de alcance, no un defecto. Para crawling a escala, combínalo con un envoltorio como PuppeteerCrawler de Crawlee, que añade la cola y la maquinaria de dataset que Puppeteer no incluye.

¿Puppeteer es solo para Chrome? Ya no. Está centrado primero en Chrome sobre CDP, pero desde v23 tiene soporte documentado para Firefox mediante WebDriver BiDi, y la versión que probé (24.16.0) está muy por encima de eso. Lo que no controla es WebKit, y su historia multiengine es más joven que la de Playwright; esa, y no "solo Chrome", es la limitación correcta. Aquí solo probé Chrome, así que informo Firefox vía BiDi como algo documentado, no medido.

¿Qué descarga realmente la instalación de Puppeteer? Por defecto, npm install puppeteer descarga una build compatible de Chrome for Testing. La descarga puede omitirse o redirigirse, y también se puede configurar otro ejecutable, así que el ajuste de versiones depende de las decisiones de despliegue. Reserva disco y ancho de banda para el navegador, especialmente en runners de CI sin caché. Esta reseña probó 24.16.0; vuelve a ejecutar los fixtures principales en la versión vigente al publicarse.

Ke
Ke
CTO en Thunderbit | Científico de datos sénior y experto en ML Con casi una década de experiencia en aprendizaje automático y ciencia de datos, Ke Shen es exalumno de la Universidad de Columbia y antiguo científico de datos sénior en Walmart Labs. Con una sólida experiencia, reconocida por sus pares, en Python, R, Java y estadística, comparte conocimientos probados en el campo sobre cómo llevar algoritmos complejos de IA desde la teoría hasta una arquitectura lista para producción.
Tabla de contenidos
Thunderbit · Agente de datos web con IA

Extrae datos de cualquier página en 1 clic

Con la confianza de más de 250.000 usuarios
plan gratuito disponible
De la página web a la hoja de cálculo
Describe lo que necesitas — el agente de IA de Thunderbit lo extrae y lo exporta a Excel, Google Sheets, Airtable o Notion. Empieza gratis.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week