【问题标题】:Puppeteer page.goto(url) inside looping not waiting until loadPuppeteer page.goto(url) 内部循环不等到加载
【发布时间】:2022-01-02 08:54:36
【问题描述】:

我有 pdf 文件的网址。 例如:

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

我想下载这些文件并使用 puppeteer 将其保存到我的服务器文件夹中。

我在做什么:

  1. 循环 filesUrl
  2. 第一个循环使用 page.goto(url)
  3. 使用 fs.writeFile 写入文件
  4. 下一个循环

但我有错误:[ERR_INVALID_CALLBACK]:回调必须是一个函数。收到未定义

如果我查看浏览器,循环不会等到页面完全加载。

这是我的代码:

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

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

    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()

【问题讨论】:

    标签: javascript node.js web-scraping puppeteer


    【解决方案1】:

    该错误与puppeteer无关,而是与fs.writeFile有关,它需要回调作为参数,缺少该参数,即undefined,因此出现错误。

    尝试添加回调:

        await fs.writeFile(Math.random() + ".pdf", await filepage.buffer(), () => {
            console.log('done writing file');
        });
    

    【讨论】:

      【解决方案2】:

      尝试使用 writeFile,但包装在一个承诺中:

      import fs from 'fs';
      const fsPromises = fs.promises;
      const writeFilePromise = fsPromises.writeFile;
      
      await writeFilePromise(Math.random() + ".pdf", await filepage.buffer());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-28
        • 1970-01-01
        • 1970-01-01
        • 2019-11-14
        • 2019-03-01
        • 1970-01-01
        相关资源
        最近更新 更多