如何在puppeteer中将回调作为变量传递给page.evaluate?

时间:2019-05-15 22:48:27

标签: javascript node.js puppeteer

更新我正在docker中运行,并且使用的是puppeteer版本1.11.0,因为这是network-config.yaml。我还与--no-sandbox

一起跑步

仅出于代码组织的目的,我想在p中做到这一点...

async function crawler(url, evaluater) {
    const browser = await puppeteer.launch(...)
    const page = await browser.newPage()
    await page.goto(url)
    const result = await page.evaluate(evaluater)
    return result

}

crawler('https://website.com', () => {
    return document.querySelectorAll(...)
})

但是我收到以下错误消息。...

Error: Evaluation failed: TypeError: Cannot read property 
'querySelectorAll' of undefined

我假设评估函数实际上已传递给eval,所以我希望下面的例子在这种情况下可以工作

const result = await page.evaluate(evaluater.toString())

但这也不起作用。没有错误消息,但是返回undefined。如果我将函数内联移动,则会返回数据。

有什么方法可以提供对page.evaluate的回调,该回调没有内联定义但作为变量传递?

1 个答案:

答案 0 :(得分:1)

您的代码看起来不错,可以在我的环境中正常工作。您的问题可能来自puppeteer版-请删除node_modules并重新安装,

您的网站想要通过某种方式禁用爬虫程序-通过其他网站进行测试。

这是我的代码,您可以在环境中尝试使用它:

const puppeteer = require('puppeteer');
async function crawler(url, evaluator) {
  const browser = await puppeteer.launch({
    headless: false,
  });
  const page = await browser.newPage()
  await page.goto(url)
  const result = await page.evaluate(evaluator)
  // await browser.close();
  return result

}

(async () => {
  let result = await crawler('https://google.com', () => {
    const nodes = Array.from(document.querySelectorAll('a'));
    return nodes.map(({ innerText }) => innerText)
  });
  console.log(result);
})();