---
title: "Cheerio vs. Puppeteer para raspado de datos web"
slug: cheerio-vs-puppeteer
date: 2023-02-09T10:15:11+00:00
modified: 2025-09-16T16:43:28+00:00
permalink: https://brightdata.es/blog/datos-web/cheerio-vs-puppeteer
type: blog
---

[ Blog ](https://brightdata.es/blog "Blog") / [Datos web](https://brightdata.es/blog/datos-web)







 [Datos web](https://brightdata.es/blog/datos-web)

# Cheerio vs. Puppeteer para raspado de datos web

Una mirada a las diferencias entre Puppeteer y Cheerio al construir un raspador web con ambos.

 12 min de lectura





 [ ![White number one with a flame on top.](https://media.brightdata.es/2023/03/Favicon-2-1-50x50.png) ](https://brightdata.com/blog/authors/gints-dreimanis)

 [Gints Dreimanis

 ](https://brightdata.com/blog/authors/gints-dreimanis)





 ![Cheerio vs. Puppeteer featured image](https://media.brightdata.es/2023/02/Cheerio-vs.-Puppeteer-featured-image.svg)





[Cheerio](https://cheerio.js.org/) y [Puppeteer](https://pptr.dev/) son dos librerías Node.js que te permiten navegar programáticamente por internet. Debido a esto, ambas son opciones populares para aquellos que desean construir un raspador web node.js desde cero.

Para comparar Cheerio y Puppeteer, construiremos un raspador web simple con Cheerio y un raspador web con Puppeteer. Usaremos ambas herramientas para raspar datos de todos los enlaces de blogs de In Plain English, una popular plataforma de programación.

Pero antes de empezar, veamos de qué vamos a hablar en este artículo.

- Diferencias entre Cheerio y Puppeteer
- Construir un Web Scraper con Cheerio
- Construir un Web Scraper con Puppeteer
- Conclusión

## Diferencias entre Cheerio y Puppeteer

Hay muchas diferencias entre estas 2 bibliotecas, y cada una viene con sus propias características especiales que puede aprovechar para el raspado de datos web.

### Cheerio

- Cheerio es un analizador DOM, capaz de analizar archivos HTML y XML.
- Es una implementación rápida y sencilla del núcleo de jQuery diseñada específicamente para el servidor.
- Si planea usar esto para raspar datos en un sitio web, necesitará usar Cheerio en conjunto con una librería cliente http Node.js como [Axios](https://axios-http.com/docs/intro).
- Cheerio no renderiza el sitio web como un navegador (no aplica CSS ni carga recursos externos).
- Debido a esto, le será difícil tratar de raspar datos en SPAs construidas con tecnologías frontales como React.
- Cheerio no puede interactuar con un sitio (por ejemplo, no puede hacer clic en botones) ni acceder a contenidos detrás de scripts.
- Tiene una curva de aprendizaje fácil gracias a su sintaxis simple. Los usuarios de jQuery se sentirán como en casa.
- Cheerio es rápido en comparación con Puppeteer.

### Puppeteer

- Puppeteer es una herramienta de automatización del navegador. Tiene acceso a todo el motor del navegador (normalmente Chromium).
- Esto la hace una opción más versátil, comparada con Cheerio.
- Puede ejecutar JavaScript, por lo que es capaz de raspar páginas dinámicas como aplicaciones de una sola página (SPA).
- Puppeteer puede interactuar con sitios web, lo que significa que se puede utilizar para hacer clic en botones, escribir en formularios de inicio de sesión, etc.
- Tiene una curva de aprendizaje muy inclinada, ya que tiene más funcionalidades y a menudo requiere el uso de código asíncrono (es decir, promises/async await).
- Puppeteer es lento en comparación con Cheerio.

## Construir un raspador web con Cheerio

Primero, creemos una carpeta llamada scraper para nuestro código. Dentro de scraper, ejecute `npm init -y` o `yarn init -y`, según haya optado por usar `npm` o `yarn`.

Ahora que tenemos nuestra carpeta lista y `package.json` inicializado, vamos a instalar nuestros paquetes.

***Nota**: Puedes consultar nuestra guía principal de raspado de datos web en node.js que incluye el [uso de Cheerio y Axios para raspado de datos web en más detalle](https://brightdata.es/blog/procedimientos/web-scraping-with-node-js).*

### Paso 1 – Instalación de Cheerio

Para instalar Cheerio, ejecute el siguiente comando en su terminal:

```none
// using npm
npm install cheerio

// or using yarn
yarn add cheerio

```

### Paso 2 – Instalación de Axios

Axios es una popular biblioteca para hacer solicitudes HTTP en Node.js. Puede usarse para hacer llamadas API, obtener datos de sitios web, y más.

Para instalarla, ejecute el siguiente comando en su terminal:

```none
// using npm
npm install axios

// or using yarn
yarn add axios

```

Usamos Axios para hacer peticiones HTTP al sitio web en el que queremos raspar datos. La respuesta que obtenemos del sitio web es en forma de HTML, que luego podemos analizar y extraer la información que necesitamos usando Cheerio.

### Paso 3 – Preparando nuestro Scraper

Vayamos a la carpeta de nuestro scraper y creemos un archivo llamado `cheerio.js`.

Esta es la estructura básica del código para comenzar con el raspado web usando Cheerio y Axios:

```none
const axios = require('axios');
const cheerio = require('cheerio');

axios
 .get("https://plainenglish.io/blog")
 .then((response) => {
   // Initialize links array which we will push the links to later
   let links = [];

   // HTML Markup
   const body = response.data;

   // Load HTML data and initialize cheerio
   const $ = cheerio.load(body);

   // CSS selector for the target element
   const element = ".PostPreview_container__82q9E";

   // Loop through each matching element and extract the text content
   $(element).each(function () {
     // Loop through each matching element and get the href attribute of each element
     const _link = $(this).find("a").prop("href");

     // We check if the link is undefined because cheerio will return undefined if the element doesn't exist
     if (_link !== undefined) {
       // Add the link to the links array
       links.push(`https://plainenglish.io` + _link);
     }
   });

   return links;
 })
 .then((response) => {
   console.log(response);
 });

```

En el código anterior, primero necesitamos las bibliotecas Axios y Cheerio.

### Paso 4 – Solicitar los datos

A continuación, realizamos una petición` get()` a “https://plainenglish.io/blog”. Dado que Axios es asíncrono, encadenamos nuestra función `get()` con `then()`.

Inicializamos una matriz de enlaces vacía para capturar los enlaces que planeamos raspar.

Luego pasamos el `response.data` de Axios a Cheerio con:

```none
// HTML Markup
const body = response.data;

// Load HTML data and initialize cheerio
const $ = cheerio.load(body);
We choose which selector we plan to target, in our case:
// CSS selector for the target element
const element = ".PostPreview_container__82q9E";

```

### Paso 5 – Procesamiento de los datos

A continuación, recorremos cada elemento coincidente, buscamos la etiqueta `<a>` y obtenemos el valor de la propiedad `href`. Para cada coincidencia, lo empujamos a nuestra matriz de enlaces:

```none
// Loop through each matching element and extract the text content
$(element).each(function () {
 // Loop through each matching element and get the href attribute of each element
 const _link = $(this).find("a").prop("href");

 // We check if the link is undefined because cheerio will return undefined if the element doesn't exist
 if (_link !== undefined) {
   // Add the link to the links array
   links.push(`https://plainenglish.io` + _link);
 }
});

```

Después, devolvemos los enlaces, encadenamos otro `then()` y `console.log` nuestra respuesta.

### Paso 6 – Resultados finales

Por último, si abrimos una terminal dentro de nuestra carpeta scraper, podemos ejecutar `node.js cheerio.js`. Esto ejecutará todo el código de nuestro archivo `cheerio.js`. Debería ver las URL de nuestra matriz de enlaces en la consola. Se verá algo como esto:

```none
 'https://plainenglish.io/blog/how-to-implement-a-search-bar-in-react-js',
 'https://plainenglish.io/blog/how-to-build-data-driven-surveys-with-react-rest-api-surveyjs',
 'https://plainenglish.io/blog/handle-errors-in-angular-with-httpclient-and-rxjs',
 'https://plainenglish.io/blog/deploying-a-localhost-server-with-node-js-and-express-js',
 'https://plainenglish.io/blog/complete-guide-to-data-center-migration',
 'https://plainenglish.io/blog/build-a-stripe-app-with-typescript-and-node-js-part-2',
 ... 861 more items

```

Y así de fácil, ¡hemos conseguido raspar datos en el sitio web In Plain English!

A partir de aquí, podemos ir un paso más allá y guardar los datos en un archivo, en lugar de simplemente enviarlos a la consola.

Cheerio y Axios facilitan el [raspado web en Node.js](https://brightdata.es/blog/procedimientos/web-scraping-with-node-js). Con sólo unas pocas líneas de código, puede extraer datos de sitios web y utilizarlos para diversos fines.

## Construyendo un Web Scraper con Puppeteer

Vayamos a nuestra carpeta scraper y creemos un archivo llamado `puppeteer.js`. Ya hemos inicializado nuestro `package.json`, pero si se ha saltado esta sección, siga adelante e inicialice ese archivo ahora.

Una vez inicializado, vamos a instalar Puppeteer.

### Paso 1 – Instalando Puppeteer

Para instalar Puppeteer, ejecute cualquiera de los siguientes comandos:

```none
// using npm
npm install puppeteer

// or using yarn
yarn add puppeteer

```

### Paso 2 – Preparando nuestro Scraper

Vayamos a nuestra carpeta scraper y creemos un archivo llamado `puppeteer.js`.

Aquí está la estructura básica del código para empezar con el raspado de datos web usando Puppeteer:

```none
const puppeteer = require("puppeteer");

// Because everything in Puppeteer is asynchronous,
// we wrap all of our code inside of an async IIFE
(async () => {
 // Initialize links array which we will push the links to later
 let links = [];

 // Launch Puppeteer
 const browser = await puppeteer.launch();

 // Create a new page
 const page = await browser.newPage();

 // Go to URL
 await page.goto("https://plainenglish.io/blog");

 // Set screen size
 await page.setViewport({ width: 1080, height: 1024 });

 // CSS selector for the target element
 const element = ".PostPreview_container__82q9E";

 // Get all matching elements
 const elements = await page.$$(element);

 // Wrapped with Promise.all to wait for all promises to resolve before continuing
 const _links = await Promise.all(
   // Get the href attribute of each element
   elements.map(async (el) => el.evaluate((el) => el.children[0].href))
 );

 if (_links.length) {
   // If there are any links
   _links.forEach((url) => {
     // Loop through each link
     links.push(url); // Add the link to the links array
   });
 }

 console.log(links);

 await browser.close();
})();

```

En el código anterior, primero requerimos la librería Puppeteer.

### Paso 3 – Creación de una IIFE

A continuación, creamos una [expresión de función inmediatamente invocada](https://sunilsandhu.com/blog/what-is-an-iife-in-javascript) (IIFE). Como todo en Puppeteer es asíncrono, ponemos async al principio. En otras palabras, tenemos esto:

```none
(async () => {
// ...code goes here
}()

```

Dentro de nuestra IIFE asíncrona, creamos un array de enlaces vacío, que usaremos para capturar los enlaces del blog que estamos raspando.

```none
// Initialize links array which we will push the links to later
let links = []

```

A continuación, lanzamos Puppeteer, abrimos una nueva página, navegamos a una URL, y establecemos el viewport de la página (el tamaño de la pantalla).

```none
 // Launch Puppeteer
 const browser = await puppeteer.launch();

 // Create a new page
 const page = await browser.newPage();

 // Go to URL
 await page.goto("https://plainenglish.io/blog");

 // Set screen size
 await page.setViewport({ width: 1080, height: 1024 });

```

Por defecto, Puppeteer se ejecuta en “modo headless” (sin interfaz gráfica). Esto significa que no abre un navegador que se pueda ver visualmente. Sin embargo, debemos establecer un tamaño de ventana ya que queremos que Puppeteer navegue el sitio a una cierta anchura y altura.

***Nota**: si decide que desea ver lo que Puppeteer está haciendo en tiempo real, puede pasar la opción headless: false como un parámetro, así:*

```none
// Launch Puppeteer
const browser = await puppeteer.launch({ headless: false });

```

### Paso 4 – Solicitar los datos

A partir de aquí, elegimos el selector al que queremos dirigirnos, en nuestro caso:

```none
// CSS selector for the target element
const element = ".PostPreview_container__82q9E";

```

Y ejecutamos lo que equivale a `querySelectorAll()` para nuestro elemento objetivo:

```none
// Get all matching elements
const elements = await page.$$(element);

```

***Nota**: `$$` no es lo mismo que querySelectorAll, así que no espere tener acceso a todas las mismas cosas.*

### Paso 5 – Procesamiento de los datos

Ahora que tenemos nuestros elementos almacenados dentro de elementos, mapeamos cada elemento para extraer la propiedad href:

```none
// Wrapped with Promise.all to wait for all promises to resolve before continuing
const _links = await Promise.all(
 // Get the href attribute of each element
 elements.map(async (el) => el.evaluate((el) => el.children[0].href))
);

```

En nuestro caso de uso específico, tenemos `el.children[0]`, ya que sé que el primer elemento hijo de nuestro elemento de destino es una etiqueta a, y es la etiqueta a de la que requiero el valor.

A continuación, hacemos un bucle a través de cada elemento mapeado y empujamos el valor en nuestra matriz de enlaces, así:

```none
if (_links.length) {
 // If there are any links
 _links.forEach((url) => {
   // Loop through each link
   links.push(url); // Add the link to the links array
 });
}

```

Por último, `console.log` los enlaces, y luego cerrar el navegador:

```none
console.log(links);

await browser.close();

```

***Nota**: si no cierra el navegador, permanecerá abierto y su terminal se colgará.*

### Paso 6 – Resultados finales

Ahora, si abrimos un terminal desde dentro de nuestra carpeta scraper, podemos ejecutar `node.js puppeteer.js`. Esto ejecutará todo el código de nuestro archivo `puppeteer.js`. Usted debe ver las direcciones URL de nuestra matriz de enlaces de salida a la consola. Se verá algo como esto:

```none
'https://plainenglish.io/blog/how-to-implement-a-search-bar-in-react-js',
 'https://plainenglish.io/blog/how-to-build-data-driven-surveys-with-react-rest-api-surveyjs',
 'https://plainenglish.io/blog/handle-errors-in-angular-with-httpclient-and-rxjs',
 'https://plainenglish.io/blog/deploying-a-localhost-server-with-node-js-and-express-js',
 'https://plainenglish.io/blog/complete-guide-to-data-center-migration',
 'https://plainenglish.io/blog/build-a-stripe-app-with-typescript-and-node-js-part-2',
 ... 861 more items

```

Y así de fácil, ¡hemos conseguido raspar datos en la web con Puppeteer!

Puppeteer es una potente herramienta para raspado de datos web y automatización de tareas del navegador. Proporciona una rica API para el raspado de datos web y la automatización de tareas del navegador. Puede utilizarlo para extraer información de sitios web, generar capturas de pantalla y archivos PDF, y realizar muchas otras tareas.

Si quiere usar Puppeteer para raspar datos en sitios web importantes, debería considerar [integrar Puppeteer con un proxy](https://brightdata.es/integration/puppeteer), para evitar ser bloqueado.

***Nota**: existen otras alternativas a Puppeteer, como [Selenium](https://brightdata.es/blog/101-proxy/puppeteer-vs-selenium), o el IDE Web Scraper. O si quiere ahorrar tiempo, puede saltarse todo el proceso de raspado de datos web buscando [conjuntos de datos ya creados](https://brightdata.es/products/datasets).*

## Conclusión

Si lo que busca es raspar páginas estáticas sin necesidad de interacciones como clics y envíos de formularios (o cualquier tipo de manejo de eventos), Cheerio es la mejor opción.

Sin embargo, si el sitio web depende de JavaScript para la inyección de contenido, o si necesita manejar eventos, Puppeteer es necesario.

Cualquiera que sea el enfoque que decida, vale la pena señalar que este caso de uso específico era bastante simple. Si intenta hacer scraping de algo más complejo, como un sitio web dinámico ([YouTube](/products/web-scraper/youtube), [Twitter](https://brightdata.es/?page_id=148978) o [Facebook](/products/web-scraper/facebook), por ejemplo), es posible que se encuentre en aguas bastante profundas.

Si desea raspar sitios web y no quiere perder semanas intentando crear una solución, quizá le convenga más optar por una solución estándar como el [IDE de Web Scraper de Bright Data.](https://brightdata.es/products/web-scraper)

El IDE de Bright Data incluye funciones de raspado prediseñadas, una sofisticada infraestructura proxy de desbloqueo incorporada, secuencias de comandos de navegador en JavaScript, depuración y varias plantillas de raspado listas para usar para sitios web populares.



Contactar ventasPrueba gratuita![google social icon](/wp-content/themes/brightdata/assets/images/ic_google.svg)









 Tabla de Contenidos













 [ ](https://news.ycombinator.com/submitlink?t=Cheerio+vs.+Puppeteer+para+raspado+de+datos+web&u=https://brightdata.es/blog/datos-web/cheerio-vs-puppeteer) [ ](https://www.linkedin.com/shareArticle?mini=true&title=Cheerio+vs.+Puppeteer+para+raspado+de+datos+web&url=https://brightdata.es/blog/datos-web/cheerio-vs-puppeteer) [ ](http://www.reddit.com/submit?title=Cheerio+vs.+Puppeteer+para+raspado+de+datos+web&url=https://brightdata.es/blog/datos-web/cheerio-vs-puppeteer)







##  Usted también puede estar interesado en

 [ ![OpenHuman with Bright Data](https://media.brightdata.es/2026/09/OpenHuman-with-Bright-Data.png) ](https://brightdata.es/blog/ai/openhuman-with-bright-data "Acceso Web Listo para Producción en OpenHuman a Través de la CLI de Bright Data")

 [AI



 ![Antonello Zanini](https://media.brightdata.es/2022/12/Antonello-Zanini-2-50x50.jpg)

Antonello Zanini

Technical Writer





### Acceso Web Listo para Producción en OpenHuman a Través de la CLI de Bright Data

Integra la CLI de Bright Data con OpenHuman para habilitar acceso web listo para producción y recopilación de datos para agentes de IA.



 09-Sep-2026

 14 min de lectura

 ](https://brightdata.es/blog/ai/openhuman-with-bright-data)

 [ ![Multimodal Web Scraping with MiniMax](https://media.brightdata.es/2026/09/Multimodal-Web-Scraping-with-MiniMax.png) ](https://brightdata.es/blog/datos-web/multimodal-web-scraping-with-minimax "Scraping Web Multimodal con MiniMax")

 [Datos web



 ![Antonello Zanini](https://media.brightdata.es/2022/12/Antonello-Zanini-2-50x50.jpg)

Antonello Zanini

Technical Writer





### Scraping Web Multimodal con MiniMax

Combina Bright Data Web Unlocker con la visión de MiniMax M3 para extraer datos estructurados de imágenes y capturas de pantalla de páginas web.



 09-Sep-2026

 5 min de lectura

 ](https://brightdata.es/blog/datos-web/multimodal-web-scraping-with-minimax)

 [ ![The 10 Best CLI Tools for Codex in 2026](https://media.brightdata.es/2026/08/The-10-Best-CLI-Tools-for-Codex-in-2026.png) ](https://brightdata.es/blog/ai/best-cli-tools-for-codex "Las 10 mejores herramientas CLI para Codex en 2026 – Probadas y clasificadas")

 [AI



 ![Daniel Shashko](https://media.brightdata.es/2022/04/Daniel-Shashko-2-50x50.png)

Daniel Shashko

Web Data &amp; AI Expert





### Las 10 mejores herramientas CLI para Codex en 2026 – Probadas y clasificadas

Las 10 herramientas CLI que hacen a Codex más rápido y capaz, comenzando con la Bright Data CLI para acceso web real desde dentro del sandbox.



 06-Sep-2026

 24 min de lectura

 ](https://brightdata.es/blog/ai/best-cli-tools-for-codex)
