update 我正在Docker运行并使用Puppeteer版本1.11.0,因为这是Alpine Linux支持的最新版本。我也与--no-sandbox
仅出于代码组织的目的,我想在Puppeteer中这样做...
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
的回调,该回调不是在线定义,而是通过变量传递?
您的代码看起来不错,它在我的环境中工作。您的问题可能来自puppeteer
版本 - 让删除node_modules
并重新安装它们,
您的网站您想通过某种方式残疾爬行者间谍 - 让另一个网站测试。
这是我的代码,您可以在env中尝试:
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);
})();