Latenode

Domine la navegación de páginas con Puppeteer: uso eficaz de goto y las opciones de navegación

Explore estrategias eficaces para usar el método page.goto() de Puppeteer, optimizar la navegación web y mejorar las tareas de automatización.

8 min de lectura
Navegación web automatizada con Puppeteer y opciones de carga de páginas

Puppeteer simplifica la automatización web al ofrecer herramientas para controlar los navegadores Chrome y Chromium. El método page.goto() es fundamental para navegar por páginas de forma eficaz, ya sea para pruebas, scraping o automatización de tareas. Esto es lo que encontrará:

Resumen rápido de las opciones de espera

Opción de esperaIdeal paraTiempo aproximado
domcontentloadedComprobaciones de estructura estática1-2 segundos
loadPáginas estáticas completamente cargadas2-5 segundos
networkidle2Equilibrio para contenido dinámico3-8 segundos
networkidle0Páginas complejas y dinámicas5-10 segundos

Conclusión clave: Adapte las condiciones de espera y la gestión de errores al tipo de página para lograr una automatización fiable. Explore métodos avanzados para SPA y procesos de varios pasos para gestionar flujos complejos de forma eficiente.

sbb-itb-23997f1

¿Cómo navegar a URL específicas con Puppeteer en Latenode?

Latenode le permite utilizar un navegador headless con tecnología Puppeteer directamente en sus flujos de automatización para configurar el proceso de análisis de sitios web y monitorización de páginas. Puede encontrar fácilmente la integración en la biblioteca de nodos, añadir el código que necesita y conectarlo con otros servicios: tenemos disponibles más de 300 integraciones con aplicaciones.

Pruebe la plantilla AHORA: capture, analice y comparta información de sitios web con Headless Browser y ChatGPT

A diferencia de los scrapers convencionales, captura la estructura visual real y reconoce tanto elementos de diseño como bloques de texto. ¡Pruebe ahora Headless Browser en esta plantilla! Este flujo no solo captura y analiza datos de sitios web, sino que también le permite compartir información fácilmente para una comunicación fluida.

  • Configure la URL: Introduzca la URL del sitio web que desea analizar para obtener información visual.
  • Capture la pantalla: Un navegador headless navega al sitio web y captura una imagen de pantalla.
  • Analice con ChatGPT: ChatGPT analiza la captura de pantalla para extraer y resumir información clave.
  • Comparta información: Después, integre su servicio de mensajería para enviar un mensaje con el análisis y recibir detalles claros directamente en su bandeja de entrada.

¿Cómo usar page.goto() en Puppeteer?

El método page.goto() de Puppeteer se utiliza para navegar a URL específicas.

Parámetros del método

El método page.goto() acepta varios parámetros para personalizar la navegación:

await page.goto(url, {
  timeout: 30000,
  waitUntil: 'networkidle0',
  referer: 'https://example.com'
});

A continuación, se detallan los parámetros principales:

  • url: La URL a la que desea navegar. Es obligatoria y puede ser una ruta absoluta o relativa.
  • timeout: Establece el tiempo máximo, en milisegundos, que se espera a que la página cargue. El valor predeterminado es 30.000 ms.
  • waitUntil: Define cuándo se considera completada la navegación.
  • referer: Establece una cabecera referer personalizada para la solicitud.
Opción de esperaDescripciónIdeal para
loadSe activa cuando se dispara el evento de carga.Páginas estáticas sencillas de cargar.
domcontentloadedSe activa cuando el HTML inicial se ha cargado por completo.Comprobaciones rápidas de la estructura de la página.
networkidle0Espera hasta que no haya actividad de red durante 500 ms.Páginas con contenido dinámico o complejo.
networkidle2Espera hasta que solo queden 2 conexiones de red.Equilibrar velocidad y exhaustividad.

Estas opciones le permiten controlar cómo y cuándo se considera que la página está completamente cargada, lo que garantiza una navegación precisa y fiable.

Gestión de respuestas

Una vez configurados los parámetros de navegación, el siguiente paso es gestionar la respuesta. El método page.goto() devuelve una Promise que se resuelve en un objeto Response. Este objeto proporciona detalles sobre la navegación:

const response = await page.goto(url);
if (response) {
  const status = response.status();
  const headers = response.headers();
  const ok = response.ok(); // true for status codes 200-299
}

Así puede verificar la navegación:

  • Compruebe los códigos de estado: Use response.status() para confirmar el estado HTTP.
  • Gestione errores: Use bloques try-catch para detectar navegaciones fallidas.
  • Analice las cabeceras: Acceda a las cabeceras de respuesta mediante response.headers().

Para gestionar errores, incluya la llamada a page.goto() en un bloque try-catch:

try {
  const response = await page.goto(url, { waitUntil: 'networkidle0' });
  if (!response.ok()) {
    throw new Error(`Page load failed with status: ${response.status()}`);
  }
} catch (error) {
  console.error('Navigation failed:', error);
}

El objeto de respuesta incluye varios métodos útiles:

  • response.status(): Obtiene el código de estado HTTP.
  • response.headers(): Recupera las cabeceras de respuesta.
  • response.securityDetails(): Proporciona detalles de SSL/TLS.
  • response.timing(): Ofrece datos de temporización de la navegación.

Estas herramientas le permiten validar la navegación y gestionar cualquier problema de forma eficaz.

Opciones de carga de página

Al trabajar con las funciones de navegación de Puppeteer, elegir la estrategia de espera adecuada es fundamental para crear automatizaciones fiables. Sus scripts solo deben continuar cuando la página esté completamente lista.

Condiciones de espera

Puppeteer utiliza el parámetro waitUntil para definir cuándo una página se considera cargada. Este es un ejemplo:

const navigationOptions = { waitUntil: ['load', 'networkidle0'], timeout: 30000 };
await page.goto('https://example.com', navigationOptions);

Si especifica varias condiciones de espera, Puppeteer espera a que ocurran todas antes de continuar. A continuación se muestran las condiciones de espera habituales y sus tiempos típicos:

Condición de esperaTiempo aproximado
domcontentloaded1-2 segundos
load2-5 segundos
networkidle23-8 segundos
networkidle05-10 segundos

Elija las condiciones de espera según la estructura de su página y la velocidad con la que carga.

Selección de opciones de espera

La condición de espera adecuada depende de si trabaja con un sitio estático o dinámico:

// For a static site
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 15000 });

// For a dynamic site
await page.goto(url, { waitUntil: 'networkidle0', timeout: 45000 });

Asegúrese de que el valor de tiempo de espera se ajuste a la complejidad de la condición elegida. Las condiciones más detalladas, como networkidle0, pueden requerir tiempos de espera más largos para evitar errores. Para que su script sea aún más fiable, combine las condiciones de espera con comprobaciones adicionales.

Varios estados de espera

Para mejorar la precisión, puede combinar condiciones de espera con comprobaciones de elementos específicos:

await page.goto(url, { waitUntil: 'load' });
await page.waitForSelector('#main-content');
await page.waitForFunction(() => {
    return document.readyState === 'complete' && !document.querySelector('.loading-spinner');
});

Este método garantiza que la página esté completamente cargada y que los elementos específicos estén disponibles. De este modo, minimiza los fallos de las pruebas y mejora la fiabilidad de su automatización.

Métodos de navegación complejos

Esta sección explica técnicas avanzadas para gestionar navegaciones complejas en Puppeteer. A partir de las estrategias básicas de navegación y espera anteriores, estos métodos se centran en abordar situaciones más exigentes.

Gestión de errores

Gestione los errores de navegación de forma eficaz combinando comprobaciones de tiempo de espera con pasos de recuperación personalizados:

const navigationPromise = page.goto(url);
const timeoutPromise = new Promise((_, reject) => 
    setTimeout(() => reject(new Error('Navigation timed out')), 45000)
);

try {
    await Promise.race([navigationPromise, timeoutPromise]);
} catch (error) {
    if (error instanceof TimeoutError) {
        await page.reload({ waitUntil: 'networkidle0' });
    } else {
        console.error(`Navigation failed: ${error.message}`);
        throw error;
    }
}

Este enfoque garantiza que se gestionen los tiempos de espera y que la página pueda recuperarse o recargarse según sea necesario.

La navegación en aplicaciones de una sola página (SPA) requiere una estrategia diferente, que suele implicar cambios de ruta y comportamientos específicos del framework:

// Wait for the route to update
await page.waitForFunction(
    'window.location.pathname === "/dashboard"'
);

// React framework example
await page.click('[data-testid="nav-link"]');
await page.waitForFunction(() => {
    return document.querySelector('#react-root').__reactContainer !== null;
});

Este método garantiza una navegación fluida en SPA al esperar cambios específicos en el estado de la aplicación.

Para flujos que incluyen varios pasos, puede combinar técnicas de navegación para gestionar situaciones complejas:

async function complexNavigation(page, targetUrl) {
    // Load the initial page
    await page.goto(targetUrl);

    // Check for authentication completion
    await page.waitForSelector('#auth-complete');

    // Handle dynamic content
    await page.evaluate(() => {
        window.scrollTo(0, document.body.scrollHeight);
    });

    // Verify the page state
    await page.waitForFunction(() => {
        return window.performance.timing.loadEventEnd > 0;
    });
}

Para procesos de varios pasos, también puede usar navegación y acciones en paralelo:

await page.goto(baseUrl);

await Promise.all([
    page.waitForNavigation({ waitUntil: 'networkidle0' }),
    page.click('button[type="submit"]')
]);

Estas técnicas agilizan la navegación en flujos complejos y garantizan una gestión eficiente del contenido dinámico y los procesos de varios pasos.

Velocidad y rendimiento

Mejorar la velocidad y eficiencia de navegación es esencial para crear flujos de automatización eficaces. A continuación, encontrará técnicas prácticas para mejorar el rendimiento en diversos casos de uso.

Uso de la caché del navegador

Puede configurar el tamaño de la caché del navegador y gestionar el almacenamiento en caché de forma eficiente con estos pasos:

const browser = await puppeteer.launch({
  args: ['--disk-cache-size=104857600'], // 100MB cache
  userDataDir: './cache-directory'
});

const context = await browser.createIncognitoBrowserContext();

await page._client.send('Network.clearBrowserCache');

await page.setCacheEnabled(true);
await page.setRequestInterception(true);
page.on('request', request => {
  if (request.resourceType() === 'document') {
    request.continue({
      headers: {
        ...request.headers(),
        'Cache-Control': 'max-age=3600'
      }
    });
  } else {
    request.continue();
  }
});

Una vez configurada la caché, puede centrarse en gestionar la carga de recursos para navegar aún más rápido.

Gestión de recursos

Para reducir la carga de recursos innecesarios, bloquee elementos no esenciales como imágenes y fuentes:

await page.setRequestInterception(true);
page.on('request', request => {
  if (request.resourceType() === 'image' || request.resourceType() === 'font') {
    request.abort();
  } else {
    request.continue();
  }
});

Este enfoque ayuda a ahorrar ancho de banda y acelera las interacciones con la página.

Gestionar varias pestañas de forma eficiente puede mejorar el rendimiento al aprovechar mejor los recursos disponibles. Así puede gestionar la navegación en varias pestañas:

async function navigateMultipleTabs(urls) {
  const pages = await Promise.all(
    urls.map(async url => {
      const page = await browser.newPage();
      await page.setDefaultNavigationTimeout(30000);
      return page;
    })
  );

  await Promise.all(
    pages.map(async (page, index) => {
      try {
        await page.goto(urls[index], {
          waitUntil: 'networkidle0',
          timeout: 30000
        });
      } catch (error) {
        console.error(`Failed to load ${urls[index]}: ${error.message}`);
        await page.close();
      }
    })
  );

  return pages.filter(page => !page.isClosed());
}

Para evitar sobrecargar los recursos, limite el número de pestañas abiertas procesándolas por lotes:

const maxConcurrentTabs = 3;
const tabPool = [];

for (let i = 0; i < urls.length; i += maxConcurrentTabs) {
  const batch = urls.slice(i, i + maxConcurrentTabs);
  const currentTabs = await navigateMultipleTabs(batch);
  tabPool.push(...currentTabs);

  await Promise.all(
    tabPool.map(async tab => {
      // Process each tab as needed
      await tab.close();
    })
  );

  tabPool.length = 0;
}

Este método de procesamiento por lotes garantiza un funcionamiento fluido sin saturar los recursos del sistema.

Conclusión

Puntos clave

Para aprovechar al máximo el método page.goto() de Puppeteer, céntrese en estas estrategias prácticas:

  • Use Latenode: ¡Pruebe Headless Browser en Latenode para visitar URL, hacer capturas de pantalla y analizar sitios web!
  • Estrategias de espera: Adapte la opción waitUntil al tipo de página para obtener mayor fiabilidad.
  • Gestión de errores: Use bloques try-catch y tiempos de espera para gestionar eficazmente los errores de navegación.
  • Gestión de recursos: Ajuste la configuración de caché del navegador y gestione la carga de recursos para mejorar el rendimiento.
  • Aplicaciones de una sola página (SPA): Combine page.goto() con condiciones de espera personalizadas para gestionar correctamente los cambios de estado.

Estos enfoques se basan en las técnicas comentadas anteriormente y le ayudarán a navegar situaciones complejas y mejorar el rendimiento. A continuación se indica cómo aplicarlos paso a paso:

Guía de implementación

1. Configure la navegación básica

const page = await browser.newPage();
await page.setDefaultNavigationTimeout(30000);
await page.goto(url, {
  waitUntil: 'networkidle0',
  timeout: 30000
});

2. Incorpore la gestión de errores

try {
  await page.goto(url, {
    waitUntil: ['load', 'networkidle0'],
    timeout: 30000
  });
} catch (error) {
  if (error instanceof TimeoutError) {
    await page.evaluate(() => window.stop());
    throw error;
  }
}

3. Optimice la carga de recursos

await page.setRequestInterception(true);
await page.setCacheEnabled(true);
page.on('request', request => {
  if (request.resourceType() === 'image') {
    request.abort();
  } else {
    request.continue();
  }
});

FAQ

Frequently Asked Questions

El método page.goto() dirige un navegador controlado por Puppeteer a una URL específica. Es fundamental para tareas de automatización web, como pruebas, extracción de datos y flujos de varios pasos, con opciones para tiempos de espera, condiciones de espera y encabezados referer.

¿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