es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Puppeteer page.goto(url) dentro de un bucle no espera hasta que se cargue

Tengo URLs de archivos PDF.
ej:

const filesUrl= ["http://example.com/animal.pdf", "https://example.com/fruit.pdf", "http://example.com/stars.pdf"]

Quiero descargar esos archivos y guardarlos en mi carpeta de servidor usando Puppeteer.

Lo que estoy haciendo es:
1. Recorrer filesUrl.
2. En cada recorrido, uso page.goto(url).
3. Escribir el archivo usando fs.writeFile.
4. Siguiente recorrido.

Pero tengo el siguiente error: [ERR_INVALID_CALLBACK]: Callback debe ser una función. Se recibió indefinido.

Si veo el navegador, veo que el ciclo no espera hasta que la página se haya cargado por completo.

Este es mi código:

const filesUrl = await page.$$eval("li.b_algo h2 a", urls => {
    return urls.map(url => url.href)
})

for (const fileUrl of filesUrl) {
    try {
        const filepage = await page.goto(fileUrl)

        await fs.writeFile(Math.random() + ".pdf", await filepage.buffer())
    } catch (error) {
        console.log('errorsadasd:', error);
    }
}

await browser.close()
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el error y asegurarse de que el bucle espere hasta que la página esté completamente cargada antes de continuar, puedes modificar tu código de la siguiente manera:

    1. Añade await antes de fs.writeFile para asegurarte de que el script espere hasta que el archivo se haya escrito antes de pasar al siguiente bucle.
    2. Utiliza page.waitForNavigation() o page.waitForSelector() antes de escribir el archivo para asegurarte de que la página esté completamente cargada antes de intentar acceder a su contenido.

    Aquí está el código modificado:

    const filesUrl = await page.$$eval("li.b_algo h2 a", urls => {
      return urls.map(url => url.href)
    })
    
    for (const fileUrl of filesUrl) {
      try {
        const filepage = await page.goto(fileUrl)
        await page.waitForNavigation() // esperar carga completa de página
        await fs.writeFile(Math.random() + ".pdf", await filepage.buffer())
      } catch (error) {
        console.log('errorsadasd:', error);
      }
    }
    
    await browser.close()
    

    Esto debería solucionar el error y asegurarse de que los archivos se descarguen y guarden correctamente en la carpeta del servidor.

Comments are closed.