You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 18:22:33