Latenode

Automatización de navegadores con Puppeteer y JavaScript: implementación práctica en Node.js

Descubra cómo automatizar tareas del navegador con Puppeteer en Node.js, desde web scraping hasta la automatización de formularios, con ejemplos prácticos y buenas prácticas.

10 min de lectura
Código JavaScript de Puppeteer para automatizar acciones en un navegador

Puppeteer es una biblioteca de Node.js que automatiza tareas del navegador como el web scraping, las pruebas de UI y los flujos repetitivos. Funciona tanto en modo headless (sin interfaz) como en modo de navegador completo y se comunica con los navegadores mediante el DevTools Protocol. Estas son las razones por las que es una opción destacada para desarrolladores:

  • Gestión de contenido dinámico: Ideal para aplicaciones web modernas y para sortear sistemas de detección.
  • Usos habituales: Web scraping, generación de PDF, captura de pantallas y automatización de formularios.
  • Configuración sencilla: Instale Puppeteer con npm install puppeteer; incluye una versión compatible de Chrome.

Ejemplo rápido:

import puppeteer from 'puppeteer';

async function runAutomation() {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await browser.close();
}

runAutomation();

Por qué destaca:

  • Modos: Headless (tareas de CI/CD) o UI completa (depuración).
  • Interacciones con páginas: Automatice clics, escritura y navegación con selectores CSS.
  • Consejos de rendimiento: Desactive imágenes, use el modo sigiloso y gestione las operaciones asíncronas de forma eficiente.

Desde principiantes hasta usuarios avanzados, Puppeteer simplifica la automatización del navegador, lo que lo convierte en una herramienta imprescindible para desarrolladores de Node.js.

Pruebas y automatización web modernas con Puppeteer (Google ...

Configuración inicial y ajustes

Siga estos pasos para configurar Puppeteer en Node.js y preparar todo para la automatización.

Configuración del entorno de Node.js

Para empezar, necesitará tres componentes principales:

ComponenteFinalidadComando de verificación
Node.jsEntorno de ejecuciónnode --version
npmGestor de paquetesnpm --version
Google ChromeMotor del navegadorVerificar instalación

Como npm viene incluido con Node.js, al instalar Node.js obtiene ambas herramientas. Descargue la versión más reciente de soporte a largo plazo (LTS) desde el sitio web oficial de Node.js para lograr una mayor estabilidad y compatibilidad [2].

Configuración de un proyecto con Puppeteer

Así puede crear un nuevo proyecto de Puppeteer:

  • Paso 1: Ejecute mkdir puppeteer-project para crear una carpeta de proyecto.
  • Paso 2: Acceda a la carpeta e inicialícela con cd puppeteer-project && npm init -y.
  • Paso 3: Instale Puppeteer con npm install puppeteer.

Al instalar Puppeteer, se descarga automáticamente una versión de Chrome for Testing compatible con la biblioteca. Esto garantiza que sus scripts se comporten de manera consistente en distintas configuraciones [3].

Estructura básica de un script

Esta es una plantilla sencilla de script de Puppeteer:

import puppeteer from 'puppeteer';

async function runAutomation() {
  const browser = await puppeteer.launch({
    headless: true
  });
  const page = await browser.newPage();

  try {
    await page.setViewport({ width: 1280, height: 800 });
    await page.goto('https://example.com');
    // Add your actions here
  } finally {
    await browser.close();
  }
}

runAutomation();

Buenas prácticas para escribir scripts de Puppeteer:

  • Utilice page.waitForSelector() para asegurarse de que los elementos estén completamente cargados antes de interactuar con ellos [4].
  • Establezca las dimensiones del viewport para obtener una representación consistente de las páginas.
  • Incluya el código en bloques try/finally para gestionar errores y asegurar que el navegador se cierre correctamente.
  • Cierre siempre la instancia del navegador para evitar problemas de memoria [2].

Para una experiencia de desarrollo más fluida, añada "type": "module" a su archivo package.json. Esto le permite utilizar sintaxis moderna de módulos ES como import y export en sus scripts [4]. Con esta configuración, estará listo para explorar las capacidades avanzadas de Puppeteer en las próximas secciones.

Principales funcionalidades de Puppeteer

Analicemos las principales funcionalidades de Puppeteer para una automatización eficaz del navegador.

Fundamentos del control del navegador

Puppeteer permite ejecutar navegadores en dos modos:

ModoDescripciónCaso de uso ideal
HeadlessEjecuta el navegador de forma invisibleAutomatización en pipelines de CI/CD y tareas de producción
CompletoMuestra la UI del navegadorDepuración y pruebas de desarrollo

Este es un ejemplo rápido de cómo iniciar un navegador con configuraciones personalizadas:

const browser = await puppeteer.launch({
  headless: true,
  defaultViewport: { width: 1920, height: 1080 },
  args: ['--no-sandbox', '--disable-setuid-sandbox']
});

Métodos de interacción con páginas

Puppeteer facilita la interacción con páginas web mediante selectores CSS y funciones de espera integradas que garantizan que los elementos estén listos. Por ejemplo:

// Wait for the email input field to load and type an email
const emailInput = await page.waitForSelector('input[type="email"]');
await emailInput.type('[email protected]');

// Wait for the submit button to appear and click it
const submitButton = await page.waitForSelector('button[type="submit"]');
await submitButton.click();

Puede realizar diversas acciones, como:

  • Eventos del ratón: Hacer clic, pasar el cursor o arrastrar y soltar.
  • Entrada de teclado: Escribir texto o utilizar combinaciones de teclas.
  • Gestión de formularios: Trabajar con listas desplegables, casillas de verificación y cargas de archivos.
  • Navegación entre frames: Interactuar con iframes o alternar entre varias ventanas.

Gestión de operaciones asíncronas

Como Puppeteer se basa en operaciones asíncronas, es fundamental gestionar estas tareas correctamente. El framework incluye mecanismos de espera para garantizar una automatización fluida. Este es un ejemplo:

try {
  await Promise.all([
    page.waitForNavigation(),
    page.click('#submit-button')
  ]);

  await page.waitForSelector('.success-message', {
    visible: true,
    timeout: 5000
  });
} catch (error) {
  console.error('Navigation failed:', error);
}

"Async/await es una forma de escribir código asíncrono que se parece más al código síncrono tradicional, lo que a menudo facilita su lectura y comprensión." - WebScraping.AI [5]

Algunas estrategias de espera útiles incluyen:

Función de esperaFinalidadEjemplo de uso
waitForSelectorEspera a que aparezca un elementoÚtil para formularios o contenido dinámico
waitForNavigationEspera a que se cargue una páginaIdeal para el envío de formularios
waitForFunctionEspera condiciones personalizadasExcelente para comprobar cambios complejos de estado
waitForTimeoutIntroduce una espera fijaÚtil para límites de frecuencia o animaciones
sbb-itb-23997f1

Ejemplos de implementación

Esta sección ofrece ejemplos prácticos que muestran cómo utilizar Puppeteer para tareas como extraer datos, automatizar formularios y capturar páginas web de forma eficaz.

Métodos de extracción de datos

Puppeteer simplifica la gestión de contenido dinámico y la extracción de datos estructurados. A continuación se muestra un ejemplo para extraer datos de reseñas de una página con desplazamiento infinito:

async function scrapeReviews() {
  const reviews = [];

  // Scroll until no new content loads
  async function scrollToBottom() {
    let lastHeight = await page.evaluate('document.body.scrollHeight');
    while (true) {
      await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
      await page.waitForTimeout(2000);
      let newHeight = await page.evaluate('document.body.scrollHeight');
      if (newHeight === lastHeight) break;
      lastHeight = newHeight;
    }
  }

  // Extract review data
  await scrollToBottom();
  const reviewElements = await page.$$('.review-box');
  for (const element of reviewElements) {
    const review = await element.evaluate(el => ({
      text: el.querySelector('.review-text').textContent,
      rating: el.querySelector('.rating').getAttribute('data-score'),
      date: el.querySelector('.review-date').textContent
    }));
    reviews.push(review);
  }

  return reviews;
}

Para mejorar el rendimiento durante el scraping, tenga en cuenta estos consejos:

OptimizaciónImplementaciónBeneficio
Desactivar imágenespage.setRequestInterception(true)Ahorra ancho de banda
Usar modo sigilosopuppeteer-extra-plugin-stealthAyuda a evitar la detección
Añadir esperaspage.waitForTimeout()Evita límites de frecuencia

Ahora, pasemos a la automatización de formularios.

Pasos para automatizar formularios

Automatizar formularios implica rellenar campos de entrada, gestionar botones y administrar posibles errores. Así puede automatizar un formulario de inicio de sesión con gestión de errores:

async function handleLogin(username, password) {
  try {
    // Click cookie accept button if visible
    const cookieButton = await page.$('.cookie-accept');
    if (cookieButton) await cookieButton.click();

    // Fill login form
    await page.type('#username', username, { delay: 100 });
    await page.type('#password', password, { delay: 100 });

    // Submit and wait for navigation
    await Promise.all([
      page.waitForNavigation(),
      page.click('#login-button')
    ]);

    // Check for error messages
    const errorElement = await page.$('.error-message-container');
    if (errorElement) {
      const errorText = await errorElement.evaluate(el => el.textContent);
      throw new Error(`Login failed: ${errorText}`);
    }

  } catch (error) {
    console.error('Login automation failed:', error);
  }
}

Herramientas de captura de páginas

Para capturar páginas web, Puppeteer permite configurar opciones para capturas de pantalla y PDF. Este es un ejemplo para crear capturas de alta calidad:

async function captureWebPage(url) {
  // Set viewport for consistent captures
  await page.setViewport({
    width: 1920,
    height: 1080,
    deviceScaleFactor: 2
  });

  await page.goto(url, { waitUntil: 'networkidle0' });

  // Take full-page screenshot
  await page.screenshot({
    path: 'capture.jpg',
    fullPage: true,
    quality: 90,
    type: 'jpeg'
  });

  // Generate PDF with custom settings
  await page.pdf({
    path: 'page.pdf',
    format: 'A4',
    printBackground: true,
    margin: { top: '20px', right: '20px', bottom: '20px', left: '20px' }
  });
}

"Hacer capturas de pantalla de sitios web con Puppeteer puede ser complicado. Hay muchos obstáculos esperándonos." - Dmytro Krasun, autor en ScreenshotOne [6]

Para obtener mejores resultados, adapte la configuración de captura según la tarea:

Tipo de capturaBuena prácticaCaso de uso ideal
Capturas de pantallaUse JPEG para un procesamiento más rápidoCapturas web generales
PDFAplique CSS de medios de impresiónCreación de documentos
Captura de elementosDiríjase a selectores específicosPruebas de componentes individuales

Estos ejemplos demuestran cómo Puppeteer puede simplificar diversas tareas de automatización.

Funcionalidades avanzadas y rendimiento

Puppeteer ofrece una serie de técnicas avanzadas que pueden mejorar sus proyectos de Node.js. Veamos cómo puede mejorar las pruebas, gestionar varias páginas y optimizar el rendimiento.

Pruebas y gestión de errores

Una gestión eficaz de errores en Puppeteer puede simplificar mucho la depuración. Al supervisar los procesos del navegador y registrar las solicitudes fallidas, puede detectar y resolver problemas rápidamente. Este es un ejemplo de una configuración sólida para la gestión de errores:

async function robustPageOperation(url) {
  try {
    await page.goto(url, { 
      waitUntil: 'domcontentloaded',  // Faster than 'networkidle2'
      timeout: 30000 
    });

    // Monitor failed requests
    page.on('requestfailed', request => {
      console.error(`Failed request: ${request.url()}`);
      console.error(`Reason: ${request.failure().errorText}`);
    });

    // Capture a screenshot on error for debugging
    page.on('error', async (error) => {
      await page.screenshot({
        path: `error-${Date.now()}.png`,
        fullPage: true
      });
      console.error('Page error:', error);
    });

  } catch (error) {
    console.error('Navigation failed:', error);
    throw error;
  }
}

"No resolverá todos sus problemas, pero le proporcionará suficiente visibilidad contextual para que resulte mucho más fácil diagnosticar y solucionar los problemas." - Joel Griffith, fundador y CEO de browserless.io [8]

Una vez que haya configurado la gestión de errores, puede ir más allá gestionando varias páginas de manera simultánea.

Operaciones con varias páginas

Puppeteer permite gestionar varias tareas simultáneamente, lo que puede ahorrar tiempo y mejorar la eficiencia. Este es un ejemplo de gestión de tareas concurrentes con Puppeteer Cluster:

const { Cluster } = require('puppeteer-cluster');

async function runParallelOperations() {
  const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_CONTEXT,
    maxConcurrency: 4,
    monitor: true,
    timeout: 30000
  });

  await cluster.task(async ({ page, data: url }) => {
    await page.goto(url);
    // Perform page operations
  });

  // Queue URLs for processing
  const urls = ['url1', 'url2', 'url3'];
  for (const url of urls) {
    await cluster.queue(url);
  }

  await cluster.idle();
  await cluster.close();
}

La gestión eficiente de varias páginas es un gran avance, pero optimizar el uso de recursos puede hacer que sus operaciones sean aún más fluidas.

Gestión de velocidad y recursos

Para obtener el mejor rendimiento de Puppeteer, céntrese en reducir los tiempos de carga y gestionar los recursos de forma eficaz. A continuación, se presentan algunas estrategias:

Enfoque de optimizaciónImplementaciónBeneficio
Velocidad de carga de páginasDesactivar imágenes y CSSTiempos de carga más rápidos
Uso de memoriaLiberar páginas de inmediatoEvita fugas de memoria
Gestión de solicitudesAlmacenar respuestas en cachéReduce la carga de red
Procesamiento paraleloConcurrencia controladaUso equilibrado de recursos

Este es un ejemplo de cómo puede optimizar las operaciones de página:

async function optimizedPageOperation() {
  // Intercept and optimize requests
  await page.setRequestInterception(true);
  page.on('request', request => {
    if (request.resourceType() === 'image' || request.resourceType() === 'stylesheet') {
      request.abort();
    } else {
      request.continue();
    }
  });

  // Implement caching
  const cache = new Map();
  page.on('response', async response => {
    const url = response.url();
    if (response.ok() && !cache.has(url)) {
      cache.set(url, await response.text());
    }
  });
}

Guía de integración con Node.js

Aprenda a integrar Puppeteer sin problemas en sus proyectos de Node.js con una estructura de código limpia y fácil de mantener.

Organización del código

Mantenga sus módulos de automatización estructurados para favorecer la claridad y la reutilización. Esta es una configuración de ejemplo:

// automation/browser.js
const puppeteer = require('puppeteer');

class BrowserManager {
  async initialize() {
    this.browser = await puppeteer.launch({
      headless: true,
      args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
    return this.browser;
  }

  async createPage() {
    const page = await this.browser.newPage();
    await page.setDefaultNavigationTimeout(30000);
    return page;
  }

  async cleanup() {
    if (this.browser) {
      await this.browser.close();
    }
  }
}

module.exports = new BrowserManager();

Esta configuración separa responsabilidades, lo que facilita la gestión y escalabilidad de su código.

Integración de bibliotecas

Puppeteer puede funcionar junto con otras bibliotecas de Node.js para mejorar sus flujos de automatización. Este es un ejemplo que utiliza winston para el registro y puppeteer-extra para capacidades de sigilo:

const winston = require('winston');
const puppeteerExtra = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

// Set up logging with winston
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'automation.log' })
  ]
});

// Configure Puppeteer with stealth mode
puppeteerExtra.use(StealthPlugin());

async function setupAutomation() {
  const browser = await puppeteerExtra.launch();
  const page = await browser.newPage();

  // Log browser console messages
  page.on('console', message => {
    logger.info(`Browser console: ${message.text()}`);
  });

  return { browser, page };
}

"Puppeteer es una biblioteca de Node.js que proporciona una API de alto nivel para controlar Chrome o Chromium a través del DevTools Protocol." [2]

Al integrar funcionalidades de registro y sigilo, puede supervisar y gestionar mejor sus tareas de automatización.

Pasos para el despliegue en producción

Para desplegar scripts de Puppeteer, asegúrese de que su entorno esté optimizado para ofrecer estabilidad y rendimiento. Este es un desglose de los pasos principales:

Paso de despliegueDetalles de implementaciónFinalidad
DependenciasInstalar dependencias de ChromeGarantiza la funcionalidad del navegador
Configuración de cachéConfigurar el directorio .cache/puppeteerGestiona instancias del navegador
Límites de recursosConfigurar restricciones de memoria y CPUEvita la sobrecarga del sistema
Recuperación ante erroresImplementar mecanismos de reinicio automáticoMantiene la disponibilidad del servicio

Utilice la siguiente configuración para estandarizar su despliegue:

const { join } = require('path');

module.exports = {
  cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
  executablePath: process.env.CHROME_PATH || null,
  defaultViewport: {
    width: 1920,
    height: 1080
  }
};

Para optimizar aún más sus scripts:

  • Cierre las páginas y las instancias del navegador que no utilice tan pronto como sea posible.
  • Use bloques try/catch para gestionar errores y registrarlos eficazmente.
  • Supervise el uso de memoria y los tiempos de respuesta para evitar cuellos de botella.
  • Configure encabezados de seguridad y controles de acceso para proteger su entorno.

"Al optimizar su script de Puppeteer, puede garantizar un funcionamiento fluido y eficiente con resultados precisos y consistentes." - ScrapeOps [7]

Resumen

Visión general de funcionalidades

Puppeteer es una herramienta de automatización de navegadores que destaca en tareas como el control de navegadores headless, la automatización de formularios, las pruebas de UI, la captura de pantallas, la generación de PDF y las funcionalidades de web scraping[1].

Estas son sus funcionalidades principales:

FuncionalidadCapacidadVentajas
Compatibilidad de navegadoresChrome/Chromium, FirefoxFunciona en múltiples entornos
Modo de ejecuciónHeadless/con interfazAdecuado para diversas necesidades
RendimientoFuncionamiento ligeroUtiliza menos recursos del sistema
Acceso a APIDevTools ProtocolOfrece un control detallado del navegador

Puede aprovechar al máximo estas capacidades si sigue estrategias específicas adaptadas a sus necesidades.

Guía de implementación

Para maximizar el potencial de Puppeteer, tenga en cuenta estas estrategias para mejorar el rendimiento y la fiabilidad:

Gestión de recursos

El siguiente script desactiva recursos innecesarios como imágenes, hojas de estilo y fuentes para mejorar la velocidad de carga de las páginas:

// Optimize page load performance
await page.setRequestInterception(true);
page.on('request', request => {
  if (['image', 'stylesheet', 'font'].indexOf(request.resourceType()) !== -1) {
    request.abort();
  } else {
    request.continue();
  }
});

Prevención de errores

Utilice este fragmento para asegurarse de que su script espere a que aparezca un elemento antes de interactuar con él:

await page.waitForSelector('#target-element', {
  timeout: 5000,
  visible: true
});

Para configuraciones de producción, siga estos pasos:

  1. Configuración de infraestructura: Instale las dependencias necesarias de Chrome y configure correctamente los directorios de caché.
  2. Ajustes de rendimiento: Minimice el uso de recursos desactivando activos innecesarios y habilitando la interceptación de solicitudes.
  3. Mejoras de seguridad: Añada el plugin puppeteer-extra-plugin-stealth para reducir los riesgos de detección[7].
  4. Escalabilidad: Utilice puppeteer-cluster para el procesamiento paralelo y gestionar cargas de trabajo mayores de forma eficiente[7].

"Al optimizar su script de Puppeteer, puede garantizar un funcionamiento fluido y eficiente con resultados precisos y consistentes." - ScrapeOps [7]

References

FAQ

Frequently Asked Questions

Puppeteer es una biblioteca de Node.js que automatiza tareas del navegador mediante el protocolo DevTools. Entre sus usos habituales se incluyen el web scraping, la generación de PDF, las capturas de pantalla, la automatización de formularios y las pruebas de interfaz de usuario en modos de navegador headless o completo.

¿Te resultó útil? Compártelo →

Escrito por

Vasiliy Datsenko

Jefe de Soporte al Cliente

Vasiliy Datsenko es Jefe de Soporte al Cliente en Latenode y un escritor de automatización centrado en productos. Su trabajo conecta las conversaciones con los clientes, la investigación sobre automatización de flujos de trabajo, los casos de uso de IA y la educación práctica sobre productos para equipos que intentan automatizar procesos comerciales reales.

Perfil del autor →

Verificado por

Oleg Zankov

CEO Latenode, No-code Expert

Con una ética arraigada en la innovación, la resolución de problemas y la experiencia de usuario, me enfoco en capacitar a los equipos para crear integraciones personalizadas y automatizar flujos de trabajo con facilidad y eficiencia. Trayendo una gran experiencia en desarrollo empresarial, emprendimiento tecnológico y desarrollo de software, reconocí la necesidad de una solución de integración más accesible, escalable y adaptable. Así nació Latenode.com. Con nuestra plataforma, las empresas pueden aprovechar el poder de la tecnología sin necesidad de conocimientos extensos de codificación. Apasionado por fomentar un futuro donde la tecnología nos sirva, y no al revés, mi misión es simplificar procesos complejos. Creo en democratizar la tecnología y equipar a los equipos con las herramientas para innovar, crecer y tener éxito en un mundo cada vez más digital.

Perfil del autor →

Seguir leyendo