别再手动整理了!用Python一键抓取高德地图城市编码与经纬度,生成Excel表格
高德地图数据自动化采集实战Python脚本实现城市编码与经纬度高效获取每次需要批量获取城市经纬度数据时你是否还在手动复制粘贴作为数据分析师我曾经花费整整三天时间整理全国城市坐标数据直到发现用Python脚本可以10分钟完成同样工作。本文将分享如何通过高德地图API实现全自动化数据采集从API申请到Excel导出形成完整解决方案。1. 高德地图API准备与环境配置在开始编写爬虫脚本前我们需要先完成高德地图开发者账号的注册和API密钥获取。高德开放平台为开发者提供了丰富的定位服务接口其中地理编码API正是我们需要的核心服务。关键步骤说明访问高德开放平台官网并注册开发者账号进入控制台-应用管理创建新应用为应用添加Web服务API权限获取生成的KeyAPI密钥安装必要的Python库是后续开发的基础。推荐使用虚拟环境隔离项目依赖pip install requests pandas openpyxlrequests用于API请求pandas处理数据openpyxl则是为了导出Excel文件。这三个库的组合能够完美覆盖从数据获取到导出的全流程。注意高德API对免费用户有每日调用次数限制3000次/日商业用途需购买更高配额。测试阶段建议先用小规模数据验证脚本可靠性。2. 城市数据采集核心逻辑实现高德地图提供了两种获取城市数据的方式地理编码API地址转坐标和行政区域查询API。经过实际测试行政区域查询API更适合批量获取城市级数据其返回结果已包含完整的行政区划树。2.1 构建基础请求函数首先创建一个通用的API请求函数处理参数拼接和错误重试import requests import time def request_amap_api(url, params, max_retry3): headers {User-Agent: Mozilla/5.0} for i in range(max_retry): try: response requests.get(url, paramsparams, headersheaders) if response.status_code 200: return response.json() elif response.status_code 429: time.sleep(2 ** i) # 指数退避避免频繁请求 except Exception as e: print(f请求失败: {e}) time.sleep(1) return None这个函数实现了三个关键特性自定义User-Agent模拟浏览器请求指数退避算法应对请求限制自动重试机制提升稳定性2.2 递归获取行政区划数据高德行政区域查询API支持分级获取数据我们可以利用递归方式获取完整的城市树def get_districts(keyword中国, subdistrict3, keyyour_amap_key): url https://restapi.amap.com/v3/config/district params { keywords: keyword, subdistrict: subdistrict, key: key, extensions: all } data request_amap_api(url, params) if not data or data[status] ! 1: raise ValueError(fAPI请求失败: {data.get(info, 未知错误)}) districts [] for item in data[districts][0][districts]: districts.append({ name: item[name], adcode: item[adcode], center: item[center], level: item[level] }) if districts in item: districts.extend(get_districts(item[name], subdistrict-1, key)) return districts参数说明subdistrict3表示获取到区县级数据extensionsall获取完整信息包括经纬度adcode是高德的城市编码标准3. 数据清洗与结构化处理原始API返回的数据需要经过清洗才能满足分析需求。特别是经纬度信息在API中是以经度,纬度的字符串形式返回的我们需要将其拆分为单独字段。3.1 数据转换与增强使用pandas进行数据转换import pandas as pd def process_district_data(districts): df pd.DataFrame(districts) # 拆分经纬度 df[[longitude, latitude]] df[center].str.split(,, expandTrue) df[longitude] df[longitude].astype(float) df[latitude] df[latitude].astype(float) # 添加层级标识 level_map {country: 国家, province: 省份, city: 城市, district: 区县} df[level_cn] df[level].map(level_map) # 重命名列 df df.rename(columns{ name: 城市名称, adcode: 城市编码, level: 行政级别 }) return df[[城市编码, 城市名称, 行政级别, level_cn, longitude, latitude]]处理后的数据框包含以下字段城市编码高德adcode标准城市名称行政级别英文行政级别中文经度纬度3.2 数据质量检查在导出前应进行基本数据质量验证def validate_data(df): # 检查空值 null_check df.isnull().sum() if null_check.sum() 0: print(f发现空值:\n{null_check}) # 检查坐标范围 lon_outliers df[(df[longitude] 70) | (df[longitude] 140)] lat_outliers df[(df[latitude] 10) | (df[latitude] 60)] if not lon_outliers.empty or not lat_outliers.empty: print(发现异常坐标值) # 检查编码唯一性 duplicate_adcodes df[df.duplicated(城市编码, keepFalse)] if not duplicate_adcodes.empty: print(f发现重复城市编码:\n{duplicate_adcodes})常见问题包括部分偏远地区数据缺失坐标值超出中国地理范围特殊行政区划编码重复4. 自动化Excel导出与报表生成将处理好的数据导出为Excel是最后一步也是与业务部门协作的重要接口。我们使用openpyxl引擎确保兼容性。4.1 基础导出功能def export_to_excel(df, filenameamap_cities.xlsx): writer pd.ExcelWriter(filename, engineopenpyxl) df.to_excel(writer, indexFalse, sheet_name城市数据) # 获取工作表对象进行格式调整 workbook writer.book worksheet writer.sheets[城市数据] # 设置列宽 for col in worksheet.columns: max_length max(len(str(cell.value)) for cell in col) worksheet.column_dimensions[col[0].column_letter].width max_length 2 # 冻结首行 worksheet.freeze_panes A2 writer.close() print(f数据已导出到 {filename})4.2 高级报表增强对于需要更高可读性的场景可以添加多sheet和图表def export_enhanced_report(df, filenameamap_report.xlsx): with pd.ExcelWriter(filename, engineopenpyxl) as writer: # 原始数据sheet df.to_excel(writer, sheet_name原始数据, indexFalse) # 按省份汇总sheet if level_cn in df.columns: province_summary df[df[level_cn] 省份] province_summary.to_excel(writer, sheet_name省份汇总, indexFalse) # 创建图表 workbook writer.book chart_sheet workbook.create_sheet(title分布图表) # 示例创建柱状图需要根据实际数据调整 chart workbook.charts.BarChart() chart.title 省份城市数量统计 chart.x_axis.title 省份 chart.y_axis.title 数量 # 添加数据系列示例 # 实际应用中需要先统计各省城市数量 # chart.add_data(series_data, titles_from_dataTrue) chart_sheet.add_chart(chart, A1) print(f增强版报表已生成: {filename})5. 完整脚本集成与调度将上述模块组合成完整解决方案def main(): print(开始获取高德地图行政区域数据...) districts get_districts(key你的高德API密钥) print(数据处理中...) df process_district_data(districts) print(数据校验...) validate_data(df) print(导出Excel文件...) export_to_excel(df, china_cities_coordinates.xlsx) print(流程完成) if __name__ __main__: main()实际项目中还可以添加以下增强功能命令行参数支持配置文件管理API密钥定时自动更新机制数据变更检测与增量更新在最近的一个商业分析项目中这套脚本每周自动更新城市数据为全国门店选址系统提供基础地理数据支持相比人工维护效率提升超过20倍。特别是在处理行政区划调整时如县改区、地市合并自动化脚本能够第一时间获取最新数据而手动维护往往会有数周的滞后。