一、背景与目标
-
需求场景:
-
批量获取Excel表格中地址的经纬度坐标,用于地图可视化或数据分析。
-
-
解决的问题:
-
地址标准化:非结构化地址需清洗为API可解析的格式。
-
API调用限制:并发请求、日调用量限制。
-
错误处理:应对API返回的多种错误类型(如密钥错误、并发超限、地址解析失败等)
-
-
核心代码逻辑:
-
读取Excel文件,遍历地址列。
-
调用高德地理编码API。
-
解析返回的JSON数据,提取经纬度。
-
错误处理与重试机制。
-
-
代码优化点:
-
添加请求间隔(如time.sleep(0.5))。
-
记录失败地址,支持重试和二次修改。
-
二、完整流程与步骤
1.环境准备(安装Python、VSCode及扩展插件)
-
下载Python:
-
参考CSDN文章:今天给大家带来Python的下载安装教程!
-
-
下载VS Code:
- 参考CSDN文章:2024 Visual Studio Code的下载与安装
-
安装扩展插件:
- 点击侧边栏的
-> 在搜索框输入“python” -> 安装官方Python插件,如图所示。
- 顺道可以安装中文包,以及一个AI编码插件TalkX(注册后可长期免费使用),如图所示。
- 点击侧边栏的
2.API获取
-
注册开发者账号:
- 高德地图:高德开放平台
- 点击右上角“注册”,如图所示。
- 进入以下页面,完善信息,如图所示。
-
创建应用并获取 API Key :
- 回到首页,鼠标点击右上角“控制台”,如图所示。
- 侧边栏里,点击"应用管理"下的“我的应用” -> 点击右侧“创建新应用”,如图所示。
- 根据自身需要,填写“应用名称”和选择“应用类型” ,然后点击“新建”即可。
- 鼠标点击右上角“添加Key”,如图所示。
- 自命名Key名称 -> 选择“Web服务”平台,勾选阅读并同意相关协议 -> 点击“提交”,即可获取API Key,如图所示。
- 回到首页,鼠标点击右上角“控制台”,如图所示。
3.数据准备
-
数据格式:
-
将目标数据保存为Excel文件(.xlsx),列名清晰(如:“序号” “名称” “地址” 等)。
-
如需从网页中获取表格可参考CSDN文章:数据获取|如何将网页里的表格导出成Excel表格
-
-
地址清洗:
-
确保地址包含省市区(如“广东生深圳市南山区科技园”)。(tip:没有“省”“市”也没关系,如果报错则需相应添加)
-
移除模糊词(如“附近”“对面”)、特殊符号(如#、())。(tip:可以借助Excel的“查找和选择”功能批量处理,如图所示)
-
4.代码实现
- 打开VS Code -> 点击“打开文件夹”,选择存放目标Excel表格的文件夹,如图所示。
- 点击“新建文件” -> 输入Python文件名称(如test.py),如图所示。
-
复制粘贴如下代码,注意:代码中的API key和表格名称都需要替换成自己的。
import requests import pandas as pd import time # 高德API参数 key = "你的API Key" url = "https://restapi.amap.com/v3/geocode/geo" # 读取Excel数据 df = pd.read_excel("你的表格名称及后缀") # 请求参数 max_retries = 3 retry_delay = 1 # 秒 request_interval = 0.5 # 秒 failed_addresses = [] for index, row in df.iterrows(): address = row["地址"] #如果报错,可检查这里表格储存地址的列名是否对应 params = { "address": address, "key": key, } for attempt in range(max_retries): try: response = requests.get(url, params=params) result = response.json() if result["status"] == "1" and result["geocodes"]: location = result["geocodes"][0]["location"] lng, lat = location.split(",") df.at[index, "经度"] = lng df.at[index, "纬度"] = lat break else: #如果报错,可复制粘贴“返回结果”的内容,询问AI进行调试 print(f"地址 {address} 第{attempt+1}次尝试失败:{result.get('info')},返回结果:{result}") time.sleep(retry_delay) except Exception as e: print(f"请求异常:{e}") time.sleep(retry_delay) else: df.at[index, "经度"] = "失败" df.at[index, "纬度"] = "失败" failed_addresses.append(address) time.sleep(request_interval) # 控制请求频率 # 保存结果 df.to_excel("你的表格名称_带坐标.xlsx", index=False) # 保存失败地址 if failed_addresses: with open("failed_addresses.txt", "w") as f: f.write("\n".join(failed_addresses)) print(f"有{len(failed_addresses)}个地址解析失败,已保存到文件。")
- 找到菜单栏 -> 点击“终端” -> “新建终端”,如图所示。
- 输入以下命令:
- 安装依赖
pip install pandas requests openpyxl
- 运行Python文件(tip:python+自己创建的Python文件名称及后缀)
python test.py
- 安装依赖
4.常见报错与解决方案
- DAILY_QUERY_OVER_LIMIT(原因:日调用量超限)(解决:升级商用套餐或等待次日重置)
- CUQPS_HAS_EXCEEDED_THE_LIMIT(原因:并发请求超限)(解决:降低请求频率(如每秒1次),分批处理数据)
- USERKEY_PLAT_NOMATCH(原因:API Key与平台类型不匹配)(解决:检查Key绑定的平台,注意需选“Web服务”)
- ENGINE_RESPONSE_DATA_ERROR(原因:地址无法解析)(解决:根据failed_addresses.txt文件,找到错误地址,打开高德官网输入目标名称检查地址是否更新,手动修正表格里的失败地址)
希望以上流程总结和复用代码对大家有所帮助,欢迎各位在评论区指正或留下新遇到的问题,一起交流进步!