Google Maps Geocoding API批量解析CSV地址异常:仅返少量坐标且报索引越界
搞定批量地址解析的问题!
我帮你分析下为啥处理200条CSV时会出问题,再给你修复好的代码:
先说说你代码里的坑
- 地址格式错了:你直接把
row(CSV读出来的是列表)转成字符串,比如一行地址是["北京市朝阳区"],转成str后会变成"['北京市朝阳区']",Google API根本认不出这种格式,返回的results是空数组,你硬去取d['results'][0]当然会索引越界! - 没处理API的各种异常情况:Google Geocoding API有请求配额限制,免费版每天有上限,短时间批量请求还会被限流;而且有些地址本身就解析不了,API会返回
ZERO_RESULTS,这时候results也是空的。 - 异常捕获太敷衍:你直接
except: pass,所有错误都被掩盖了,连哪里错了都不知道,怎么修? - 可能没跳过CSV表头:如果你的CSV第一行是“地址”这种表头,直接循环会把表头也当成地址去请求,肯定失败。
修复后的完整代码
import requests import json import csv import time apiKey = "你的API密钥" with open('address.csv', 'r', encoding='utf-8') as csvDataFile: csvReader = csv.reader(csvDataFile) # 跳过表头(如果你的CSV没有表头,就把这行注释掉) next(csvReader) for line_num, row in enumerate(csvReader, start=1): # 先处理空行和空地址 if not row: print(f"第{line_num}行是空行,跳过") continue address = row[0].strip() if not address: print(f"第{line_num}行地址为空,跳过") continue try: # 对地址做URL编码,避免中文、空格这些特殊字符搞砸请求 encoded_addr = requests.utils.quote(address) api_url = f"https://maps.googleapis.com/maps/api/geocode/json?address={encoded_addr}&key={apiKey}" # 发送请求,加个超时防止卡住 response = requests.get(api_url, timeout=10) response.raise_for_status() # 捕获403、429这类HTTP错误 result_data = response.json() # 直接用response.json()更方便 # 先看API返回的状态,只有OK才去拿坐标 if result_data['status'] == 'OK': location = result_data['results'][0]['geometry']['location'] print(f"✅ 第{line_num}行 | 地址: {address} | 坐标: {location}") else: error_msg = result_data.get('error_message', '无额外信息') print(f"❌ 第{line_num}行 | 地址: {address} | 解析失败 | 状态: {result_data['status']} | 原因: {error_msg}") # 加个延迟,避免触发API的速率限制(免费版建议每秒1次) time.sleep(1) except requests.exceptions.RequestException as req_err: print(f"⚠️ 第{line_num}行 | 请求地址{address}时出错: {str(req_err)}") except IndexError: print(f"⚠️ 第{line_num}行 | 地址{address}返回结果为空,无法获取坐标") except Exception as err: print(f"⚠️ 第{line_num}行 | 处理地址{address}时发生未知错误: {str(err)}")
几个关键优化的地方
- 正确提取地址:取
row[0]作为地址(假设CSV每行只有一个地址列),还做了去空格处理,再用requests.utils.quote()编码,保证URL是有效的。 - 跳过无效行:自动跳过空行、空地址,还有表头(如果有的话),减少无效请求。
- 处理API状态:不再盲目取
results[0],先检查status字段,不同错误状态都给明确提示,比如限流、地址无效这些情况都能看到原因。 - 精准捕获异常:分类型抓异常,请求错误、索引错误、未知错误都有对应的提示,方便你排查问题。
- 添加请求延迟:Google API对请求频率有限制,加1秒延迟能避免被限流,付费版的话可以调短一点。
另外,记得去Google Cloud控制台看看你的API密钥是不是有效,还有配额够不够,要是配额用完了也会导致请求失败哦。
内容的提问来源于stack exchange,提问作者Kamran Tariq
相关产品推荐
相关产品推荐

