如何在Node.js中使用Cheerio从URL爬取数据?现有代码求助
Node.js 中使用 Cheerio 爬取指定URL数据的实现方案
Cheerio 是轻量级的服务端DOM解析库,语法和jQuery完全一致,本身不支持页面请求和JS渲染,需要先获取到目标页面的HTML文本后再进行解析提取。
前置依赖安装
首先安装所需的第三方包:npm install axios cheerio
如果你的目标页面是动态渲染(需要执行JS才能生成完整DOM),可以保留你原有逻辑中的Puppeteer依赖,只新增Cheerio即可。
场景1:爬取静态服务端渲染页面
不需要启动浏览器,直接请求页面HTML后解析即可:
const axios = require('axios'); const cheerio = require('cheerio'); const scraperObject = { url: 'https://www.example.com', async scraper() { console.log(`正在请求 ${this.url}...`); // 发起请求获取页面HTML const { data: html } = await axios.get(this.url, { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } }); // 加载HTML到Cheerio实例 const $ = cheerio.load(html); const urls = []; // 遍历匹配元素提取链接,和你原有定位逻辑完全一致 $('.JIIxO > ._1OUGS').each((_, el) => { urls.push($(el).find('._1OUGS > ._9tla3').attr('href')); }); console.log(urls); } }
场景2:爬取动态客户端渲染页面
保留你原有Puppeteer启动浏览器的逻辑,获取渲染后的页面内容后交给Cheerio解析:
const cheerio = require('cheerio'); const scraperObject = { url: 'https://www.example.com', async scraper(browser){ let page = await browser.newPage(); console.log(`正在导航到 ${this.url}...`); await page.goto(this.url); await page.waitForSelector('.product-container'); // 获取浏览器渲染后的完整HTML const pageHtml = await page.content(); const $ = cheerio.load(pageHtml); const urls = []; $('.JIIxO > ._1OUGS').each((_, el) => { urls.push($(el).find('._1OUGS > ._9tla3').attr('href')); }); console.log(urls); } }
注意事项
- 如果提取到的链接是相对路径,可以用
new URL(相对路径, this.url).href转换为完整的绝对路径 - 请求时可按需补充Cookie、Referer等请求头,降低被站点反爬策略拦截的概率
- Cheerio选择器语法和jQuery100%兼容,你原有DOM定位逻辑可以直接复用不需要调整
内容的提问来源于stack exchange,提问作者Joao David de Souza Alves
相关产品推荐
相关产品推荐

