javascript - 如何将回调作为变量传递给 puppeteer 中的 page.evaluate?
问题描述
更新我在 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
我假设 evaluator 函数实际上被传递给eval
所以我希望下面的工作在这种情况下
const result = await page.evaluate(evaluater.toString())
这也不起作用。没有错误信息,但undefined
被返回。如果我将函数内联移动,则返回数据。
有什么方法可以提供page.evaluate
未内联定义但作为变量传入的回调?
解决方案
您的代码看起来不错,它在我的环境中工作。您的问题可能来自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);
})();
推荐阅读
- python - 带有 ACK 的自定义 IP 协议
- c++ - Eclipse C++ 中没有索引器选项
- ajax - 我想使用 ajax 在 select2 下拉列表中获取数据,但我不知道如何获取更新视图的数据
- python - Pandas Dataframe 以间隔计算
- node.js - 禁用此消息 - 对 _ 的表达式分配现在已禁用?NodeJs-REPL
- java - Java 通用通配符列表动物 = new ArrayList<>()
- go - 在结构中组合多种类型
- python - 列表中带有“距离限制”的独特组合
- python - 使用 '\n'.join(generator) 时添加尾随分隔符
- python - Tkinter 不允许我在文本小部件中插入文本