如何将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
相关产品推荐
相关产品推荐

