出现这样的错误后,我可以恢复连接吗?
UnhandledPromiseRejectionWarning:
TimeoutError: Navigation Timeout
Exceeded: 1000ms exceeded
示例:
let arg = [] //array with urls
await page.goto(...args, {waitUntil: 'load', timeout: 1000 });
还是唯一的出路就是设置超时?
答案 0 :(得分:0)
我相信您的问题来自您为goto
的{{1}}方法提供的参数:
https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagegotourl-options
调用puppeteer
时,它期望的是goto
的URL,而不是string
。
答案 1 :(得分:0)
要回答原始问题:
否,page.goto()
函数超时后,您将无法恢复连接。您只能处理异常,甚至可以重试。
另一方面,如果您要完成的任务是加载页面,
我建议对您的代码进行两项更改:
第一
page.goto()
不接受Array
或Object
作为第一个参数,它必须是一个单数字符串,例如:
page.goto('https://www.google.com')
。
第二:
除非您要加载的页面非常简单,否则timeout
(1000毫秒)太低了。 Puppeteer的默认值为30000 ms,所以我建议您使用它或将超时设置为至少5000 ms:
page.goto('https://www.google.com', { timeout: 5000 })
由于这是默认值,因此也无需使用{ waitUntil: 'load' }
。
希望这会有所帮助。
答案 2 :(得分:0)
如果您要向args
数组中的所有URL发出请求,而不会失败,如果一个失败了,则不会循环。
这是解决方法:
const async = require('async'); // npm i --save async
const urls = [... array of urls ...];
const execution = {
total: urls.length,
success: 0,
failed: 0,
results: []
};
async.eachLimit(
urls,
10,
async (url, done) => {
try {
const data = await page.goto(url, {waitUntil: 'load', timeout: 1000});
execution.success++;
execution.results.push({url, data});
}
catch (error) {
execution.failed++;
execution.results.push({url, data: null, error: error.message});
}
finally {
done();
}
},
(errors) => {
console.log('Finished:', execution);
});