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

如何将Puppeteer爬虫数据整合为指定结构的JavaScript对象

解决Puppeteer爬取谷歌地图评论后的数组合并问题

原代码示例(模拟你的写法)

const puppeteer = require('puppeteer');

async function scrapeReviews() {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('你的谷歌地图目标页面URL');

  // 提取评论者名称数组
  const reviewerNames = await page.$$eval('.section-review-title > span', elements => 
    elements.map(el => el.textContent.trim())
  );
  // 提取评论内容数组
  const reviewContents = await page.$$eval('.section-review-text', elements => 
    elements.map(el => el.textContent.trim())
  );

  console.log(reviewerNames);
  console.log(reviewContents);

  await browser.close();
}

scrapeReviews();

当前输出

["张三", "李四", "王五"]
["这家店服务很好", "味道一般,价格偏贵", "环境不错,下次再来"]

期望输出

[
  { name: "张三", review: "这家店服务很好" },
  { name: "李四", review: "味道一般,价格偏贵" },
  { name: "王五", review: "环境不错,下次再来" }
]

实现方法

核心是利用数组索引的对应关系,把两个数组同位置的元素合并为对象,这里提供两种适合新手的写法:

方法1:使用map方法(简洁推荐)

修改代码中合并数组的部分:

// 合并成目标数组
const combinedReviews = reviewerNames.map((name, index) => {
  return {
    name: name,
    review: reviewContents[index] || '' // 避免评论为空时出现undefined
  };
});

console.log(combinedReviews); // 输出期望的结构

说明:

  • map遍历reviewerNames的每个元素,同时返回当前元素的索引index
  • 通过索引index可以拿到reviewContents中对应位置的评论内容
  • || ''是兜底处理,确保即使没有评论内容,review字段也会是一个空字符串,不会出现undefined

方法2:使用for循环(更直观)

如果你对map不熟悉,用普通循环也能实现:

const combinedReviews = [];
// 取两个数组中较短的长度,避免索引越界
const maxLength = Math.min(reviewerNames.length, reviewContents.length);

for (let i = 0; i < maxLength; i++) {
  combinedReviews.push({
    name: reviewerNames[i] || '匿名用户', // 名称为空时显示匿名用户
    review: reviewContents[i] || ''
  });
}

console.log(combinedReviews);

额外提示:

  • 要确保爬取的名称和评论数量一致,如果出现不一致的情况,用Math.min取较短的长度遍历,能避免报错
  • 谷歌地图的DOM类名可能会更新,如果后续爬不到数据,记得检查页面元素的选择器是否正确

内容的提问来源于stack exchange,提问作者Andres Rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:05:29