Mow*_*zer 3 javascript asynchronous node.js promise puppeteer
我正在尝试抓取和抓取一些网站以提取一些链接。我希望看到所有内容都hrefs打印到我的控制台上。但是,我收到以下错误。
out [ Promise { } ] (节点:15908) UnhandledPromiseRejectionWarning:错误:协议错误(Page.navigate):目标已关闭。
我究竟做错了什么?
这个答案说错误消息意味着browser.close()在我调用我的pageFunction.
但我正在使用async await,显然浏览器仍然对我关闭。
我该如何修复这个错误?
const domains = [...]
const pageFunction = async $posts => {
const data = [];
await $posts.forEach( $post => {
data.push( $post.href );
});
return data;
}
(async () => {
// start browser
const browser = await puppeteer.launch();
const page = await browser.newPage();
// loop over domains
const out = await domains.slice(-1).map( async domain => {
const url = [ 'http', domain, ].join(joiner2);
await page.goto( url, waitUntilLoad, );
const hrefs = await page.$$eval( 'a', pageFunction, );
return hrefs;
});
// log hrefs
console.log( 'out', out, );
await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)
另外,请注意:当我使用时:
const pageFunction = async $posts =>
await $posts.map( $post => $post.href )
Run Code Online (Sandbox Code Playgroud)
错误消失。但我也没有得到任何输出。我希望控制台能够记录,hrefs但它什么也没记录。
FWIW:这是我昨天在同一段代码上写的问题。我修改了代码,暂时只执行一个 URL,slice(-1)而不是整个列表。现在我得到了上述错误,而不是我在昨天的问题中描述的错误。
小智 7
我很确定这是因为在匿名函数中您正在等待 map 的结果,它会立即返回 Promises 数组。这意味着您的代码执行将继续关闭浏览器。
您应该尝试以下操作:
const promises = domains.slice(-1).map( async domain => {...});
const out = await Promise.all(promises);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13377 次 |
| 最近记录: |