gpt4 book ai didi

javascript - 如何使用nodeJS和Puppeteer解决 "Target closed"错误?

转载 作者:行者123 更新时间:2023-12-02 22:21:33 25 4
gpt4 key购买 nike

我正在尝试抓取和抓取一些网站以提取一些链接。我希望看到所有 hrefs 打印到我的控制台。但是,相反,我收到以下错误。

out [ Promise { } ] (node:15908) UnhandledPromiseRejectionWarning: Error: Protocol error (Page.navigate): Target closed.

我做错了什么?

This answer says错误消息意味着在我调用 pageFunctionbrowser.close() 已经执行。

但是我正在使用async wait,显然浏览器仍然对我关闭。

如何修复此错误?

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

另外,请注意:当我使用时:

  const pageFunction = async $posts =>
await $posts.map( $post => $post.href )

错误消失。但我也没有得到任何输出。我希望控制台记录 hrefs 但它什么也没记录。

FWIW:Here is the question I wrote yesterday在同一段代码上。我修改了代码,暂时只执行一个 URL slice(-1) 而不是整个列表。现在我收到了上述错误,而不是我在昨天的问题中描述的错误。

最佳答案

我很确定这是因为在匿名函数中您正在等待 map 的结果,它会立即返回一个 Promise 数组。这意味着您的代码执行将继续关闭浏览器。

您应该尝试以下操作:

const promises = domains.slice(-1).map( async domain => {...});
const out = await Promise.all(promises);

关于javascript - 如何使用nodeJS和Puppeteer解决 "Target closed"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59214019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com