使用Node.js+puppeteer+cheerio爬取数据时报$ is not a function错误如何解决
错误根因
- Cheerio 初始化方式错误:直接导入的
$不是DOM查询函数,需要先调用load方法加载页面HTML,生成对应页面的查询实例才能使用 - 异步代码缺少异常捕获逻辑,抛出的错误没有被接收,才触发
UnhandledPromiseRejectionWarning警告 - 遍历DOM的回调使用箭头函数,
this指向异常,无法正确获取当前遍历的DOM元素
修复后代码
import puppeteer from 'puppeteer'; import cheerio from 'cheerio'; import { CronJob } from 'cron'; import nodemailer from 'nodemailer'; const url = 'https://www.amazon.eg/-/en/Sony-Bluetooth-Cancellation-Headphone-Microphone/dp/B08F4XTS93/' async function configureBrowser() { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto(url); return page; } async function checkPrice(page) { await page.reload(); let html = await page.evaluate(() => document.body.innerHTML); // 先加载HTML生成cheerio查询实例 const $ = cheerio.load(html); $('#priceblock_ourprice').each((index, ele)=>{ // 用回调参数获取当前元素,避免箭头函数this指向问题 let EGPPrice = $(ele).text() console.log(EGPPrice); }) } async function monitor(){ try { let page = await configureBrowser() await checkPrice(page) } catch (err) { // 捕获所有异步异常 console.error('运行出错:', err) } } monitor()
补充说明
如果是Cheerio v1及以上版本,导入语法需要调整为import * as cheerio from 'cheerio',其余使用逻辑保持一致即可。
内容的提问来源于stack exchange,提问作者ha33
相关产品推荐
相关产品推荐

