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

 更新时间:2025年11月08日 09:39:08   作者:程序员爱钓鱼  
借助 Python + 高德地图API,我们可以轻松实现自动化批量查询并将结果写入 Excel 文件中,下面就跟随小编一起来看看具体实现方法与思路吧

在日常的数据处理工作中,我们经常需要根据公司、事件或门店的注册地址,批量获取其所在的街道信息,例如“浦东新区张江镇”“徐汇区龙华街道”等。 手动查询显然低效,而借助 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"

三、核心逻辑讲解

1. Excel文件读取与列处理

脚本使用 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="街道")

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

2. 调用高德API获取街道信息

核心的查询函数如下:

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限流。

3. 批量查询与缓存优化

查询过程通过循环实现:

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行打印一次进度。

4. 失败重试与错误记录

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

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批量获取地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Ubuntu20下的Django安装的方法步骤

    Ubuntu20下的Django安装的方法步骤

    这篇文章主要介绍了Ubuntu20下的Django安装的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • tensorflow使用range_input_producer多线程读取数据实例

    tensorflow使用range_input_producer多线程读取数据实例

    今天小编就为大家分享一篇tensorflow使用range_input_producer多线程读取数据实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python代码实现图形界面的7种方法整理

    Python代码实现图形界面的7种方法整理

    这篇文章主要为大家详细介绍了如何仅用一行代码就能创建令人印象深刻的图形用户界面(GUI),Python中一般有7种常用方法,下面小编就为大家详细介绍一下它们的具体使用吧
    2025-10-10
  • django自定义Field实现一个字段存储以逗号分隔的字符串

    django自定义Field实现一个字段存储以逗号分隔的字符串

    这篇文章主要介绍了django自定义Field实现一个字段存储以逗号分隔的字符串的示例,需要的朋友可以参考下
    2014-04-04
  • Python装饰器有哪些绝妙的用法

    Python装饰器有哪些绝妙的用法

    本文主要介绍了Python装饰器有哪些绝妙的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Python办公自动化实战之打造智能邮件发送工具

    Python办公自动化实战之打造智能邮件发送工具

    在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多收件人的智能邮件系统
    2025-07-07
  • python实现在函数中修改变量值的方法

    python实现在函数中修改变量值的方法

    今天小编就为大家分享一篇python实现在函数中修改变量值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python使用pandas读写excel文件的方法实例

    python使用pandas读写excel文件的方法实例

    pandas是一个十分强大的数据处理工具,最近需要处理数据并输入到excel,简单列举它的用法,这篇文章主要给大家介绍了关于python使用pandas读写excel文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 使用python查找windows系统中所有程序的安装信息

    使用python查找windows系统中所有程序的安装信息

    这篇文章主要为大家介绍了使用python查找windows系统中所有程序的安装信息示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Python中shutil模块的常用文件操作函数用法示例

    Python中shutil模块的常用文件操作函数用法示例

    shutil模块提供比OS模块更强大的本地文件操作功能,包括文件的压缩和解压缩等,下面我们就来列举Python中shutil模块的常用文件操作函数用法示例:
    2016-07-07

最新评论