【问题标题】:How to resolve "Target closed" error using nodeJS and Puppeteer?如何使用 nodeJS 和 Puppeteer 解决“目标关闭”错误?
【发布时间】:2020-03-31 11:58:25
【问题描述】:

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

出 [ 承诺 { } ] (节点:15908)UnhandledPromiseRejectionWarning:错误:协议错误(Page.navigate):目标已关闭。

我做错了什么?

This answer says 错误消息意味着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();
})();

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

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

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

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

【问题讨论】:

  • 我的两分钱在这里。该错误也可能意味着页面(或铬)崩溃。
  • 我想知道await domains.slice(-1).map( async domain => { 是否符合您的预期。您确定可以使映射异步吗?

标签: javascript node.js asynchronous promise puppeteer


【解决方案1】:

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

您应该尝试以下方法:

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

【讨论】:

  • 这确实是我的原因。 “等待”修复了它。
猜你喜欢
  • 2019-07-02
  • 2019-01-08
  • 2021-07-14
  • 2021-08-18
  • 2021-07-09
  • 2014-03-19
  • 2015-03-23
  • 2014-09-05
  • 1970-01-01
相关资源
最近更新 更多