Python代码调用Free Map Tools批量获取邮编经纬度报错求优化
问题分析与优化方案
原代码存在以下核心问题导致无法获取经纬度:
- 函数设计为处理单个邮编,但调用时传入了列表,参数类型不匹配
- 该网站实际通过AJAX接口处理邮编查询,而非直接POST到页面URL,原请求目标错误
- 缺少必要的请求头标识,无法触发正确的AJAX响应
- 无错误处理逻辑,元素查找失败时会直接抛出异常
- 最终未将结果整理为要求的DataFrame格式
优化后的代码
import requests import pandas as pd def get_lat_lng(zip_code): # 网站真实的AJAX查询接口 api_url = "https://www.freemaptools.com/ajax/zip-to-lat-lng.php" headers = { "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } params = { "zip": zip_code } try: response = requests.get(api_url, headers=headers, params=params) response.raise_for_status() data = response.json() lat = data.get("lat") lng = data.get("lng") if lat is None or lng is None: return None, None return float(lat), float(lng) except Exception as e: print(f"查询邮编 {zip_code} 时出错: {str(e)}") return None, None # 批量处理邮编并生成DataFrame zip_codes = ['97048','63640','63628'] results = [] for zip_code in zip_codes: lat, lng = get_lat_lng(zip_code) results.append({ "zip_code": zip_code, "latitude": lat, "longitude": lng }) df = pd.DataFrame(results) print(df)
关键改动说明
- 接口修正:改用网站真实的AJAX接口,而非页面URL
- 请求头补充:添加
X-Requested-With标识AJAX请求,同时设置User-Agent模拟浏览器请求 - 参数传递:采用GET方式传递查询参数(网站实际使用GET处理请求)
- 错误处理:增加异常捕获,处理网络、解析等错误,同时校验返回结果有效性
- 批量处理:遍历邮编列表逐个查询,收集结果
- DataFrame生成:将结果整理为字典列表,转换为符合要求的DataFrame
内容的提问来源于stack exchange,提问作者Canberra
相关产品推荐
相关产品推荐

