Python使用高德地图API批量获取地址所属街道并写回Excel

Written by

in

文章目录
  • 这段脚本的功能可以总结为四步: 从 Excel 文件中读取地址数据; 调用高德地图地理编码(geocode)与逆地理编码(regeo)接口获取街道名称; 自动将查询结果写回到 Excel 的新列中; 对查询失败的地址进行重试与记录,保证数据尽量完整。
  • 在开始之前,请确保安装以下依赖: pip install pandas openpyxl requests 并在高德开放平台申请一个 API Key,申请地址为:  lbs.amap.com/api/webservice/guide/create-project 拿到 key 后,将它填入脚本开头的配置部分: key = “你的高德API_KEY”
  • 执行脚本后,控制台会显示类似输出: 已处理 50 行,最近地址:上海市浦东新区张江路123号 → 张江镇已处理 100 行,最近地址:上海市浦东新区川沙路56号 → 川沙新镇第一次查询失败地址共 5 条,开始自动重查……完成,已保存:事件列表-上海浦东-带街道.xlsx最终仍失败的地址已保存到 查询失败地址.xlsx 最终输出文件中会新增一列“街道”,完整保留原有格式: 注册地址 街道 上海市浦东新区张江路123号 张江镇 上海市浦东新区川沙路56号 川沙新镇
  • 批量查询速度控制 高德API对单IP有请求频率限制,建议控制每秒请求数。 若数据量大,可考虑多线程+限速队列模式。 地址清洗预处理 可先对地址进行正则清洗,去掉多余标点、括号、空格等,提高命中率。 多城市适配 当前城市固定为“上海”,可通过参数配置实现全国适配。 异常日志记录 建议在重查阶段输出更多日志,例如返回状态码、错误类型,方便调试。 接口替代方案 若数据量巨大,可以使用高德地图的批量地理编码接口(支持最多 10 条一次),进一步提升效率。
  • 本文通过一个实战案例展示了如何用 Python + 高德地图API 实现“批量地址→街道归属”的自动化处理。 整个过程涵盖了数据读取、接口调用、异常重试、结果写回等完整流程,既是一个实用工具脚本,也体现了 Python 在数据自动化中的强大能力。 核心亮点: 模块 功能 pandas + openpyxl 高效读取与写入 Excel requests 调用高德API进行地理解析 缓存与重试机制 提高查询稳定性与速度 自动生成失败文件 方便人工补录与质量控制 如果你日常需要处理大量企业、门店、事件地址,这个脚本可以帮你节省大量时间。 到此这篇关于Python使用高德地图API批量获取地址所属街道并写回Excel的文章就介绍到这了,更多相关Python批量获取地址内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python调用高德地图API实现JS网页地图显示的完整代码示例 基于高德地图API在Python中实现地图功能的方法示例详解 python使用百度或高德地图获取地理位置并转换 Python 利用高德地图api实现经纬度与地址的批量转换 Python实现批量获取地址的经纬度 Python如何通过地址获取变量 python爬虫获取小区经纬度以及结构化地址
  • 目录
    • 一、功能概述
    • 二、项目依赖与准备工作
    • 三、核心逻辑讲解
      • 1. Excel文件读取与列处理
      • 2. 调用高德API获取街道信息
      • 3. 批量查询与缓存优化
      • 4. 失败重试与错误记录
    • 四、运行结果
      • 五、实用建议与扩展方向
        • 六、总结

          在日常的数据处理工作中,我们经常需要根据公司、事件或门店的注册地址,批量获取其所在的街道信息,例如“浦东新区张江镇”“徐汇区龙华街道”等。 手动查询显然低效,而借助 Python + 高德地图API,我们可以轻松实现自动化批量查询并将结果写入 Excel 文件中。

          本文将完整展示一个从 Excel 读取地址 → 调用高德API → 获取街道 → 写回Excel的实用脚本,并讲解实现细节与优化思路。

          这段脚本的功能可以总结为四步:

          • 从 Excel 文件中读取地址数据;
          • 调用高德地图地理编码(geocode)与逆地理编码(regeo)接口获取街道名称;
          • 自动将查询结果写回到 Excel 的新列中;
          • 对查询失败的地址进行重试与记录,保证数据尽量完整。

          在开始之前,请确保安装以下依赖:

          pip install pandas openpyxl requests
          

          并在高德开放平台申请一个 API Key,申请地址为:  lbs.amap.com/api/webservice/guide/create-project

          拿到 key 后,将它填入脚本开头的配置部分:

          key = "你的高德API_KEY"
          

          脚本使用 pandasopenpyxl 结合读取 Excel 文件:

          df = pd.read_excel(input_file)
          if '注册地址' not in df.columns:
              df['注册地址'] = df.iloc[:,16]
          addresses = df['注册地址'].tolist()
          

          这段代码首先读取整个 Excel,然后确认是否存在“注册地址”列; 如果没有,则自动取第 17 列(索引16)作为地址列,保证兼容不同格式的表格。

          随后,脚本用 openpyxl 打开同一个文件,以保留单元格样式,准备写入新的“街道”列:

          wb = load_workbook(input_file)
          ws = wb.active
          ws.insert_cols(target_col)
          ws.cell(row=header_row_index, column=target_col, value="街道")
          

          这样既能读取数据,又能保持表格原有格式,方便下游人员直接查看。

          核心的查询函数如下:

          def get_street_from_amap(address, retries=max_retries):
              if not isinstance(address, str) or not address.strip():
                  return ""
              for attempt in range(1, retries+1):
                  try:
                      geo_resp = requests.get(
                          "https://restapi.amap.com/v3/geocode/geo",
                          params={"key": key, "address": address, "city": "上海"},
                          timeout=15
                      ).json()
          
                      if not geo_resp.get("geocodes"):
                          continue
          
                      location = geo_resp["geocodes"][0]["location"]
          
                      regeo_resp = requests.get(
                          "https://restapi.amap.com/v3/geocode/regeo",
                          params={"key": key, "location": location, "extensions": "base", "radius":500},
                          timeout=15
                      ).json()
          
                      if regeo_resp.get("regeocode"):
                          township = regeo_resp["regeocode"]["addressComponent"].get("township","") or ""
                          return township
                  except Exception as e:
                      print(f"[尝试 {attempt}/{retries}] 地址查询失败: {address}, 错误: {e}")
                  time.sleep(sleep_time + random.random()*0.5)
              return None
          

          这段逻辑分为两步:

          • 正向地理编码(geocode):根据地址字符串获取经纬度;
          • 逆向地理编码(regeo):根据经纬度反查街道名称(township)。

          并加入了异常重试机制随机延时,防止频繁请求触发高德API限流。

          查询过程通过循环实现:

          cache = {}
          failed_addresses = []
          
          for row_idx, addr in enumerate(addresses, start=header_row_index+1):
              if not isinstance(addr,str) or not addr.strip():
                  ws.cell(row=row_idx, column=target_col, value="")
                  continue
              if addr in cache:
                  township = cache[addr]
              else:
                  township = get_street_from_amap(addr)
                  if township is None:
                      failed_addresses.append((row_idx, addr))
                      township = ""
                  cache[addr] = township
                  time.sleep(sleep_time + random.random()*0.5)
              ws.cell(row=row_idx, column=target_col, value=township)
          

          这里有几个优化点:

          • 缓存(cache)机制:如果同一地址出现多次,只请求一次;
          • 延时策略sleep_time + random.random()*0.5,避免被API风控;
          • 实时进度输出:每50行打印一次进度。

          对于第一次查询失败的地址,脚本会自动发起第二轮重查:

          if failed_addresses:
              print(f"第一次查询失败地址共 {len(failed_addresses)} 条,开始自动重查……")
              still_failed = []
              for row_idx, addr in failed_addresses:
                  township = get_street_from_amap(addr)
                  if township is None:
                      still_failed.append((row_idx, addr))
                      township = ""
                  cache[addr] = township
                  ws.cell(row=row_idx, column=target_col, value=township)
                  time.sleep(sleep_time + random.random()*0.5)
              failed_addresses = still_failed
          

          最终仍查询失败的地址会被写入单独的 Excel 文件:

          if failed_addresses:
              df_fail = pd.DataFrame([addr for _, addr in failed_addresses], columns=["地址"])
              df_fail.to_excel(failed_file, index=False)
          

          这样可以方便人工二次处理,比如手动调整地址格式或补录缺失信息。

          执行脚本后,控制台会显示类似输出:

          已处理 50 行,最近地址:上海市浦东新区张江路123号 → 张江镇
          已处理 100 行,最近地址:上海市浦东新区川沙路56号 → 川沙新镇
          第一次查询失败地址共 5 条,开始自动重查……
          完成,已保存:事件列表-上海浦东-带街道.xlsx
          最终仍失败的地址已保存到 查询失败地址.xlsx

          最终输出文件中会新增一列“街道”,完整保留原有格式:

          注册地址 街道
          上海市浦东新区张江路123号 张江镇
          上海市浦东新区川沙路56号 川沙新镇

          批量查询速度控制

          • 高德API对单IP有请求频率限制,建议控制每秒请求数。
          • 若数据量大,可考虑多线程+限速队列模式。

          地址清洗预处理

          可先对地址进行正则清洗,去掉多余标点、括号、空格等,提高命中率。

          多城市适配

          当前城市固定为“上海”,可通过参数配置实现全国适配。

          异常日志记录

          建议在重查阶段输出更多日志,例如返回状态码、错误类型,方便调试。

          接口替代方案

          若数据量巨大,可以使用高德地图的批量地理编码接口(支持最多 10 条一次),进一步提升效率。

          本文通过一个实战案例展示了如何用 Python + 高德地图API 实现“批量地址→街道归属”的自动化处理。 整个过程涵盖了数据读取、接口调用、异常重试、结果写回等完整流程,既是一个实用工具脚本,也体现了 Python 在数据自动化中的强大能力。

          核心亮点:

          模块 功能
          pandas + openpyxl 高效读取与写入 Excel
          requests 调用高德API进行地理解析
          缓存与重试机制 提高查询稳定性与速度
          自动生成失败文件 方便人工补录与质量控制

          如果你日常需要处理大量企业、门店、事件地址,这个脚本可以帮你节省大量时间。

          到此这篇关于Python使用高德地图API批量获取地址所属街道并写回Excel的文章就介绍到这了,更多相关Python批量获取地址内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

          您可能感兴趣的文章:

          • Python调用高德地图API实现JS网页地图显示的完整代码示例
          • 基于高德地图API在Python中实现地图功能的方法示例详解
          • python使用百度或高德地图获取地理位置并转换
          • Python 利用高德地图api实现经纬度与地址的批量转换
          • Python实现批量获取地址的经纬度
          • Python如何通过地址获取变量
          • python爬虫获取小区经纬度以及结构化地址

          站内搜索