Nodejs 中 puppeteer 的 goto 方法响应十分慢,可能是什么原因?
Nodejs 中 puppeteer 的 goto 方法响应十分慢,可能是什么原因?
昨天想要实现个打印网页为 PDF 的功能,顺便学习 TypeScript 和 Nest.js 。 遇到了这些问题:
- 方法的返回值类型定为Promise<Buffer>,但也有可能返回 puppeteer 的Error,这时候返回值该咋写,也没错误提示
- page.goto()方法定了 5 秒的 timeout,但还是有可能触发超时错误,这个该咋办,真实浏览器响应很快
- 一堆 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
方法时响应慢,可能的原因有多种:
-
网页加载时间过长:
- 网页本身过于复杂,包含大量资源或脚本需要加载。
- 网络延迟或不稳定,导致资源加载缓慢。
-
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的日志输出。