用评价()和暴露函数()伪造错误结果

时间:2019-06-27 16:05:42

标签: node.js web-scraping puppeteer evaluate

我执行了以下操作,它似乎收集了大量链接,但是使用collectLinks1对站点进行实际检查时,我得到了所有有效链接,但是使用collectLinks2我得到了{ {1}}

我是Puppeteer的新手,我找不到使用http://pieroxy.net/blog/2014/11/18/[的原因,我找不到链接。

collectLinks2

1 个答案:

答案 0 :(得分:0)

您需要await通过page.exposeFunction定义的函数返回Promise。由于您仅在调用函数而未在等待结果,因此page.evaluate调用将在脚本执行完毕之前解决。

解决方案

您应该使用循环而不是forEach遍历所有项目,并将它们依次传递到页面。

async function collectLinks2(htmlPage) {
  // ...

  await htmlPage.evaluate(async () => {
    async function findLinks(document) {
      for (const link of document.querySelectorAll('a[href]')) {
        await window.pushToLinks(link.href);
      }
    }
    await findLinks(window.document);
  });
  return links;
}