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

爬取谷歌地图评论仅返回单条用户评分的正确获取方法

谷歌地图评论爬虫评分抓取异常修复

问题场景

开发爬虫项目爬取谷歌地图评论,目标请求接口地址:
https://www.google.com/async/reviewDialog?hl=en&async=feature_id:0x47e66e2964e34e2d:0x8ddca9ee380ef7e0,sort_by:,start_index:,associated_topic:,_fmt:pc
使用cheerio解析接口返回内容时,初始代码运行后仅能获取到第一条用户评分,初始代码如下:

$('.lcorif').each((i,el) => {
    rating[i] = $(el)
    .find(".EBe2gf").attr("aria-label")
    console.log(i)
    console.log(rating) // 仅返回第一条评分
})

故障原因

  • 依赖谷歌动态生成的CSS类名做选择器:谷歌返回的页面DOM类名(包括你用到的.lcorif、.EBe2gf)是随机混淆、动态变更的,大部分场景下.lcorif仅能匹配到第一条评论容器,后续评论容器类名不一致,导致each循环实际仅执行1次。
  • 变量未提前初始化:代码中rating未提前声明为数组,部分运行环境下会出现索引赋值异常。
  • 未做分页处理:该异步接口默认仅返回前10条左右评论,全量评论需要通过修改URL中的start_index参数分页拉取,单次请求无法拿到所有数据。

修复方案

不要依赖动态类名做匹配,改用评分元素固定的aria-label特征做选择,稳定性更高,修正后的代码如下:

// 提前初始化评分存储数组
const rating = []

// 匹配所有带评分标识的元素,不依赖动态类名
$('[aria-label^="Rated"]').each((i, el) => {
    const ratingText = $(el).attr("aria-label")
    // 过滤掉商家整体评分,只保留用户评论的评分
    if (ratingText.includes("out of 5") && !ratingText.includes("Overall")) {
        rating.push(ratingText)
    }
})

console.log("当前页获取到的所有用户评分:", rating)

注意事项

  1. 若需获取全量评论,需要循环修改请求URL的start_index参数,每次参数值按单页返回条数递增(通常单页返回10条,即start_index依次传0、10、20……),直到接口返回内容中无更多评论项为止。
  2. 不要长期依赖固定CSS类名解析谷歌系页面内容,这类类名通常每隔几天就会变更,优先选择固定属性、固定文本结构作为解析规则,能大幅降低维护成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:57:31