Raspado web con JavaScript y Node.js: Cheerio vs Puppeteer
Lead Scraping Automation Engineer
Puntos clave:
- La primera decisión es estática vs dinámica, y establece toda tu cadena de herramientas. Si los datos están en el HTML inicial, analízalos con Cheerio; si JavaScript los genera, necesitas un navegador real como Puppeteer.
- Cheerio es un analizador, no un navegador — y ese es el punto. Carga HTML y te ofrece selectores estilo jQuery a velocidad nativa, sin sobrecarga de renderizado, para páginas cuyo contenido ya está en el marcado.
- Puppeteer renderiza, por lo que ve lo que ven los usuarios. Para páginas renderizadas por el cliente, desplazamiento infinito y contenido detrás de interacciones, Puppeteer ejecuta el JavaScript y te entrega el DOM terminado.
- Ambos se ejecutan en la misma sesión de Scrapeless. Obtén el HTML a través del navegador en la nube, luego analiza con Cheerio o extrae en vivo con Puppeteer — mismo anti-detección y salida residencial por debajo.
- Verificado lado a lado. La misma página de catálogo a continuación genera 20 elementos a través de Cheerio y 20 a través de Puppeteer — prueba de que los dos caminos coinciden cuando el contenido está presente.
- Gratis para empezar. Las nuevas cuentas de Scrapeless incluyen un tiempo de ejecución gratuito del Navegador de Scraping — regístrate en app.scrapeless.com.
Introducción: elige la herramienta adecuada para la página
JavaScript y Node.js son una combinación natural para el web scraping — el mismo lenguaje que ejecuta el navegador, con un ecosistema maduro para HTTP y HTML. Pero "raspar con Node" se divide inmediatamente en dos trabajos muy diferentes, y elegir el incorrecto desperdicia esfuerzo.
Si los datos que deseas ya están en el HTML inicial de la página, no necesitas un navegador en absoluto — necesitas un analizador rápido. Eso es Cheerio: carga el marcado, ejecuta selectores, listo. Si los datos son generados por JavaScript después de cargar — una aplicación React, un feed de desplazamiento infinito, contenido que aparece solo después de un clic — entonces un analizador no ve nada, porque el HTML que analiza es una concha vacía. Ahí es donde entra Puppeteer (o Playwright): ejecuta el JavaScript de la página y te da el DOM renderizado.
El problema práctico subyacente a ambos es el acceso: los sitios reales tienen huellas dactilares, limitan la tasa y geocercan. Esta guía ejecuta ambos enfoques en el Navegador de Scraping de Scrapeless — un navegador en la nube anti-detección — para que la obtención tenga éxito, y luego muestra cuándo optar por Cheerio y cuándo por Puppeteer. Ambos caminos a continuación se ejecutaron en vivo contra la misma página.
Estático vs dinámico: cómo distinguir
| Estático (Cheerio) | Dinámico (Puppeteer) | |
|---|---|---|
| Dónde viven los datos | En el HTML inicial | Construido por JS después de cargar |
| Herramienta | Un analizador | Un navegador real |
| Velocidad | Rápido, baja sobrecarga | Más lento, renderiza la página |
| Usar cuando | Páginas renderizadas por el servidor, artículos, catálogos | SPAs, desplazamiento infinito, contenido posterior al clic |
La prueba rápida: ve la fuente de la página (no el inspector). Si los datos están en el HTML en bruto, Cheerio es suficiente. Si la fuente es una concha casi vacía y el contenido solo aparece en el DOM en vivo, necesitas Puppeteer.
Por qué Scrapeless Scraping Browser
Scrapeless Scraping Browser es un navegador en la nube personalizable y anti-detección diseñado para rastreadores web y agentes de IA. Para el scraping en Node específicamente, ofrece:
- Una conexión estándar de Puppeteer —
Puppeteer.connect()devuelve unBrowsernormal, por lo que tu código no cambia. - Renderizado de JS del lado de la nube — las páginas dinámicas realmente construyen su contenido, por lo que tanto
page.content()(para Cheerio) como la extracción en vivo funcionan. - Proxies residenciales en más de 195 países — fija la salida para que la obtención tenga éxito y se mantenga consistente.
- Huella dactilar anti-detección — la sesión se presenta como un navegador real, por lo que las páginas se renderizan en lugar de desafiar.
- Persistencia de sesión — mantiene las cookies activas durante una ejecución de varias páginas.
Obtén tu clave de API en el plan gratuito en app.scrapeless.com.
Requisitos previos
- Node.js 18 o más reciente
- Una cuenta de Scrapeless y una clave de API — regístrate en app.scrapeless.com
- Familiaridad básica con selectores CSS
Instalar
bash
npm install @scrapeless-ai/sdk puppeteer-core cheerio
bash
export SCRAPELESS_API_KEY="tu_token_api_aqui"
Conectar
javascript
import { Puppeteer } from '@scrapeless-ai/sdk';
const browser = await Puppeteer.connect({
apiKey: process.env.SCRAPELESS_API_KEY,
sessionName: 'js-node-scraping',
proxyCountry: 'US',
sessionTTL: 300,
});
const page = await browser.newPage();
await page.goto('https://books.toscrape.com/', {
waitUntil: 'domcontentloaded',
timeout: 60000,
});
Ruta A — Cheerio (análisis estático)
Cuando el contenido está en el HTML, captura el marcado con page.content() y analízalo con Cheerio. La API del selector es estilo jQuery, por lo que se lee de manera natural:
javascript
import * as cheerio from 'cheerio';
const html = await page.content();
const $ = cheerio.load(html);
const titles = $('.product_pod h3 a')
.map((i, el) => $(el).attr('title'))
.get();
console.log(titles.length, '—', titles[0]);
// 20 — A Light in the Attic
Cheerio no renderiza nada: solo analiza la cadena que le das. Eso lo hace rápido e ideal una vez que ya tienes el HTML. También puedes usarlo en HTML de cualquier fuente, no solo de un navegador.
Obtén tu clave API en el plan gratuito: app.scrapeless.com
Ruta B — Puppeteer (extracción dinámica)
Cuando el contenido se construye con JavaScript, extráelo del DOM en vivo dentro de la página renderizada. Mismos selectores, pero evaluados en el navegador después de que se hayan ejecutado los scripts de la página:
javascript
const titles = await page.evaluate(() =>
[...document.querySelectorAll('.product_pod h3 a')].map((a) => a.getAttribute('title')),
);
console.log(titles.length, '—', titles[0]);
// 20 — A Light in the Attic
En la misma página de catálogo, ambos caminos devuelven los mismos 20 títulos, porque el contenido está presente en el HTML, cualquiera de los enfoques funciona. La diferencia se observa en una página renderizada por el cliente: Cheerio en el HTML en bruto no encontraría nada, mientras que la ruta de Puppeteer aún devuelve los artículos porque la página se renderizó primero.
Para contenido dinámico que se carga en la interacción, conduce la página antes de extraer: desplázate para contenido perezoso, haz clic para revelar, luego waitForSelector en el resultado:
javascript
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
await page.waitForSelector('.product_pod', { timeout: 10000 });
// ...luego extrae como se mencionó anteriormente
Elegir entre ellos
- ¿Contenido en el HTML en bruto? Usa Cheerio: es más rápido y simple.
- ¿Contenido construido por JavaScript, desplazamiento infinito o detrás de un clic? Usa Puppeteer para renderizar, luego extraer.
- ¿Ambos en una página? Común: renderiza con Puppeteer, luego entrega
page.content()a Cheerio si prefieres su ergonomía de selectores para las partes estáticas.
Lo que obtienes de vuelta
Cualquiera de los caminos produce la misma lista plana cuando los datos están presentes:
json
{
"count": 20,
"first": "A Light in the Attic"
}
// Captura real: tanto Cheerio como Puppeteer devolvieron 20 títulos de la misma página.
Algunas observaciones honestas:
- No hagas renderizado cuando no tengas que hacerlo. Si el HTML ya tiene los datos, Cheerio omite completamente el costo de renderizado.
- Renderiza cuando la fuente es una concha. Un HTML en bruto casi vacío con un DOM en vivo poblado es la señal para usar Puppeteer.
- Espera en el contenido, no en el reloj. Para páginas dinámicas,
waitForSelectorsupera unsetTimeoutfijo. - Los selectores son conocimiento compartido. Los mismos selectores CSS funcionan en Cheerio y en
querySelectorAll, así que moverse entre caminos es económico.
Conclusión: una decisión, dos caminos limpios
El raspado web con JavaScript y Node.js se reduce a una sola llamada temprana: ¿están los datos en el HTML o construidos por JavaScript? Cheerio maneja el primer caso a velocidad de analizador; Puppeteer maneja el segundo renderizando la página. Ejecutar ambos en Scrapeless Scraping Browser significa que la obtención tiene éxito de cualquier manera, con salida residencial y detección anti-bots por debajo. Para un flujo de trabajo anti-bots más profundo, consulta la guía de Scrapling + Scrapeless; la página del producto de Scraping Browser y la documentación abarcan toda la superficie del SDK. Revisa primero el HTML en bruto, alcanza Cheerio cuando puedas y Puppeteer cuando debas, y espera en el contenido, no en el reloj.
¿Listo para construir tu canal de datos potenciado por IA?
Únete a nuestra comunidad para reclamar un plan gratuito y conectarte con desarrolladores que construyen raspadores en Node: Discord · Telegram.
Regístrate en app.scrapeless.com para obtener tiempo de ejecución gratuito de Scraping Browser y adapta los patrones anteriores a las páginas estáticas y dinámicas que necesita tu flujo de trabajo. Consulta precios para escalar.
Preguntas frecuentes
P: ¿Cuándo debo usar Cheerio en lugar de Puppeteer?
Cuando los datos ya estén en el HTML inicial de la página. Cheerio solo analiza el marcado, por lo que es más rápido y simple: sin renderizado. Usa Puppeteer cuando JavaScript construya el contenido.
P: ¿Cómo sé si una página es estática o dinámica?
Mira la fuente de la página en bruto (no el inspector). Si los datos están en la fuente, es estática: Cheerio funciona. Si la fuente es una concha casi vacía y el contenido solo aparece en el DOM en vivo, es dinámica: usa Puppeteer.
P: ¿Puedo usar ambos en la misma página?
Sí. Renderiza con Puppeteer, luego pasa page.content() a Cheerio si prefieres su ergonomía de selectores para las partes estáticas.
P: ¿Cheerio vs Playwright vs Puppeteer — cuál?
Cheerio para análisis estático. Puppeteer o Playwright (ambos navegadores completos) para renderizado dinámico — elige el que tu pila ya esté utilizando; la sesión de Scrapeless funciona con ambos a través de CDP.
P: ¿Necesito un proxy?
Para páginas públicas estáticas, a menudo no — pero fijar proxyCountry ofrece una IP residencial consistente que los sitios reales tratan como un visitante normal, lo cual es más importante a medida que escalas.
P: ¿Puedo ejecutar esto sin un agente de IA?
Sí. Es el SDK de Scrapeless más Puppeteer y Cheerio sin modificaciones — no se requiere agente.
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.



