Nodejs 中 puppeteer 的 goto 方法响应十分慢,可能是什么原因?

Nodejs 中 puppeteer 的 goto 方法响应十分慢,可能是什么原因?

昨天想要实现个打印网页为 PDF 的功能,顺便学习 TypeScript 和 Nest.js 。 遇到了这些问题:

  1. 方法的返回值类型定为Promise<Buffer>,但也有可能返回 puppeteer 的Error,这时候返回值该咋写,也没错误提示
  2. page.goto()方法定了 5 秒的 timeout,但还是有可能触发超时错误,这个该咋办,真实浏览器响应很快
  3. 一堆 await 的代码该如何组织,错误该如何处理?

附上代码:

async generatePDFFromURL(url: string): Promise<Buffer> {
    return new Promise<Buffer>(async (resolve, reject) => {
      const browser = await puppeteer.launch(),
            page    = await browser.newPage();
  try {
    await page.goto(url, {
      timeout: 5000,
    });
  } catch(error) {
    reject(error);
  }

  const pdf = await page.pdf({
    format: 'A4',
  });

  await browser.close();

  resolve(pdf);
});

}


3 回复

goto 是要等全部资源加载完的,一旦有阻塞 5 秒肯定不够


javascript<br>await page.waitForNavigation()<br>await page.waitForSelector('[name="passwd"]')<br>
尝试一下这两种写法呢?

在Node.js中,使用Puppeteer库的goto方法时响应慢,可能的原因有多种:

  1. 网页加载时间过长

    • 网页本身过于复杂,包含大量资源或脚本需要加载。
    • 网络延迟或不稳定,导致资源加载缓慢。
  2. Puppeteer配置不当

    • 在无头(headless)模式下,某些默认配置可能不适合目标网页的加载。
    • 未正确设置超时时间,导致等待时间过长。

以下是一些优化建议:

  • 增加超时时间
await page.goto(url, { timeout: 10000 }); // 将超时时间设置为10秒
  • 优化Puppeteer配置
const browser = await puppeteer.launch({
  headless: true,
  args: [
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--disable-gpu',
    '--single-process',
    '--no-zygote',
    '--no-first-run',
    '--ignore-certificate-errors',
    '--disable-dev-shm-usage',
    '--disable-infobars',
    '--user-data-dir=/tmp',
    '--window-size=1200,800'
  ]
});
  • 检查网络环境:确保服务器或本地机器的网络连接稳定且速度较快。

通过上述方法,可以定位和解决Puppeteer的goto方法响应慢的问题。如果问题依然存在,建议进一步分析网页的加载情况和Puppeteer的日志输出。

回到顶部