Node.js网页爬取问题:如何生成独立商品JSON对象
解决Node.js爬虫中商品数据合并的问题
我看了你的代码,问题出在遍历的对象不对——你现在是在遍历整个<body>元素,而不是页面上的单个商品容器,这就导致你每次获取的是页面所有.price、.product这类选择器的内容,自然会把所有同类型数据堆在一起。
要实现每个商品生成独立对象的需求,你需要先找到页面中包裹单个商品的DOM元素(比如可能是.product-item、.card这类,你需要根据目标网页的实际结构调整选择器),然后遍历这些元素来提取单个商品的信息。
修改后的代码示例
const request = require('request'); const cheerio = require('cheerio'); const fs = require('fs'); request(url, function (error, response, body) { // 先处理请求错误和响应状态 if (error) { console.error('请求出错:', error); return; } if (response.statusCode !== 200) { console.error('请求失败,状态码:', response.statusCode); return; } // 加载页面内容 const $ = cheerio.load(body, { ignoreWhitespace: false }); const produsGasit = []; // 关键改动:遍历单个商品的容器元素(这里假设容器选择器是.product-item,你需要替换成实际的) $('.product-item').each(function(i, elem) { // 从当前商品容器中提取信息,用trim()去除多余空格换行 const produs = $(elem).find('.product').text().trim(); const reducere = $(elem).find('.product-badge').text().trim(); const linkProdus = $(elem).find('.product_link').attr('href'); const descriereProdus = $(elem).find('.ProductDetails').text().trim(); const pretProdus = $(elem).find('.price').text().trim(); // 将单个商品信息加入数组 produsGasit.push({ produs, reducere, linkProdus, descriereProdus, pretProdus }); // 打印单个商品信息,方便调试 console.log('第', i+1, '个商品:', produsGasit[i]); }); // 所有商品信息收集完成后,一次性写入文件(避免多次追加导致JSON格式错误) fs.writeFile('produse.json', JSON.stringify(produsGasit, null, 2), function (err) { if (err) { console.error('写入文件出错:', err); return; } console.log('所有商品数据已成功保存到produse.json!'); }); });
关键改动说明
- 遍历正确的元素:把
$('body').each()改成遍历单个商品的容器(比如.product-item),这样每次循环都是处理一个独立的商品。 - 使用
push添加对象:相比用索引赋值,push更安全,避免数组索引混乱的问题。 - 统一写入文件:把文件写入操作移到遍历循环外面,这样只会写入一次完整的JSON数组,而不是每次循环都追加(之前的写法会导致JSON文件格式错误,因为多次追加的数组会变成
[...][...]这种无效格式)。 - 添加错误处理:增加了请求错误和响应状态码的检查,方便排查问题。
trim()处理文本:去除提取文本中的多余空格和换行,让数据更整洁。
注意事项
- 你需要根据目标网页的实际DOM结构,把代码中的
.product-item替换成真正包裹单个商品的元素选择器(可以用浏览器的开发者工具查看网页结构)。 - 如果目标网页是动态渲染的(比如用React/Vue加载),
request可能无法获取到动态生成的内容,这时你可能需要改用puppeteer这类无头浏览器工具。 - 如果你需要追加数据到已存在的JSON文件,不要直接用
appendFile,应该先读取原有文件的内容,解析成数组,再合并新数据,最后重新写入。
内容的提问来源于stack exchange,提问作者alex.c89
相关产品推荐
相关产品推荐

