大佬们,我使用puppeteer里的方法$$eval去爬一下页面的数据,结果发现引入的nanoid不能使用,刚开始还以为是nanoid不支持commonJS写法导致的,结果调试发现在eval函数外使用可以打印成功,eval里使用就报错了
注意:$$eval返回一个promise
async callback(pg) {
console.log(nanoid());//这里能打印出来
const imgList = await pg.$$eval('div.swiper-wrapper>div.swiper-slide>div>img', els => els.map((el, index) => {
return {
imgUrl: el.src,
alt: '图片',
id: index,
imgKey:nanoid()//这里不能使用nanoid
}
})) || []
return imgList
}
报的错误:
node:internal/process/promises:279
triggerUncaughtException(err, true /* fromPromise */);
^
Error [ReferenceError]: nanoid is not defined
pptr:$$eval;Object.callback%20(D%3A%5C%E9%A1%B9%E7%9B%AE%5C%E7%88%AC%E8%99%AB%E7%B3%BB%E7%BB%9F%5Ccrawler%5Ccrawlers%5Cslider.js%3A8%3A34):6:24
at $$eval ($$eval at Object.callback (D:\项目\爬虫系统\crawler\crawlers\slider.js:8:34), <anonymous>:5:23)
at $$eval ($$eval at Object.callback (D:\项目\爬虫系统\crawler\crawlers\slider.js:8:34), <anonymous>:0:12)
at ExecutionContext.#evaluate (D:\项目\爬虫系统\crawler\node_modules\puppeteer-core\lib\cjs\puppeteer\common\ExecutionContext.js:254:55)
at async ExecutionContext.evaluate (D:\项目\爬虫系统\crawler\node_modules\puppeteer-core\lib\cjs\puppeteer\common\ExecutionContext.js:151:16)
at async CDPJSHandle.evaluate (D:\项目\爬虫系统\crawler\node_modules\puppeteer-core\lib\cjs\puppeteer\common\JSHandle.js:48:16)
at async Promise.all (index 0)
at async CDPElementHandle.$$eval (D:\项目\爬虫系统\crawler\node_modules\puppeteer-core\lib\cjs\puppeteer\api\ElementHandle.js:227:26)
at async Object.callback (D:\项目\爬虫系统\crawler\crawlers\slider.js:8:25)
at async module.exports (D:\项目\爬虫系统\crawler\libs\crawler.js:10:18)
有大佬知道为什么吗
你这么写试试:
文档中说,要使用第三个参数传入

https://zhaoqize.github.io/puppeteer-api-zh_CN/#?product=Puppeteer&version=puppeteer-v21.2.1&show=api-pageevalselector-pagefunction-args