基于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
相关产品推荐
相关产品推荐

