You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()处理文本:去除提取文本中的多余空格和换行,让数据更整洁。

注意事项

  1. 你需要根据目标网页的实际DOM结构,把代码中的.product-item替换成真正包裹单个商品的元素选择器(可以用浏览器的开发者工具查看网页结构)。
  2. 如果目标网页是动态渲染的(比如用React/Vue加载),request可能无法获取到动态生成的内容,这时你可能需要改用puppeteer这类无头浏览器工具。
  3. 如果你需要追加数据到已存在的JSON文件,不要直接用appendFile,应该先读取原有文件的内容,解析成数组,再合并新数据,最后重新写入。

内容的提问来源于stack exchange,提问作者alex.c89

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:51:33