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

基于Google API获取谷歌地图最旧评论与评分数量的代码问题排查

问题分析与修复方案

你当前代码结果不准确,主要源于以下几个核心问题:

  • 直接取搜索结果第一条可能匹配到非目标地点,导致后续数据完全错误
  • Google Places Details API默认仅返回最新5条评论,无法直接获取最旧评论
  • 使用了已弃用的placeid参数,且未指定必要字段过滤,易引发数据偏差
  • 未处理评论中time字段缺失的异常情况

修复后的代码实现

import requests
import datetime
import pandas as pd

def fetch_place_review_info(search_query, api_key):
    # 1. 文本搜索获取候选地点
    search_url = f"https://maps.googleapis.com/maps/api/place/textsearch/json?query={search_query}&key={api_key}"
    search_res = requests.get(search_url).json().get("results", [])
    
    rating_total = "N/A"
    oldest_review = "N/A"
    
    if search_res:
        # 优先匹配名称一致的地点(减少误匹配)
        target_place = None
        query_name = search_query.split(",")[0].strip().lower()
        for place in search_res:
            if query_name in place.get("name", "").lower():
                target_place = place
                break
        target_place = target_place or search_res[0]
        
        place_id = target_place.get("place_id")
        if not place_id:
            return rating_total, oldest_review
        
        # 2. 调用新版Place Details API,仅请求所需字段
        details_url = (
            f"https://maps.googleapis.com/maps/api/place/details/json?"
            f"place_id={place_id}&"
            f"fields=user_ratings_total,reviews&"
            f"key={api_key}"
        )
        details_res = requests.get(details_url).json().get("result", {})
        
        # 提取评分总数
        rating_total = details_res.get("user_ratings_total", "N/A")
        
        # 处理评论数据:过滤无时间字段的记录,再找最早评论
        valid_reviews = [r for r in details_res.get("reviews", []) if r.get("time") is not None]
        if valid_reviews:
            earliest_review = min(valid_reviews, key=lambda x: x["time"])
            oldest_review = datetime.datetime.fromtimestamp(earliest_review["time"]).strftime("%Y-%m-%d")
    
    return rating_total, oldest_review

# 批量处理DataFrame示例
api_key = "你的API密钥"
df = pd.DataFrame({"name_address": ["XX餐厅 北京市朝阳区", "XX酒店 上海市黄浦区"]})

df["rating_count"] = "N/A"
df["oldest_review_date"] = "N/A"

for idx, row in df.iterrows():
    count, date = fetch_place_review_info(row["name_address"], api_key)
    df.at[idx, "rating_count"] = count
    df.at[idx, "oldest_review_date"] = date
    # 批量请求需加延时避免限流:time.sleep(1)

关键注意事项

  • 最旧评论的限制:Google API目前不支持直接获取最旧评论,默认仅返回最新5条。若需更早评论,需通过page_token分页请求,但存在配额限制,且无法保证获取到所有历史评论
  • 匹配精度优化:拆分name_address中的名称和地址字段,优先匹配名称一致的地点,可大幅降低误匹配概率
  • 配额与限流:批量请求必须添加延时,否则会触发API限流导致请求失败
  • 字段过滤:通过fields参数指定仅获取所需数据,能有效减少API配额消耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:41:18