调用OpenWeatherMap空气污染预报API时提示无效密钥求助
问题排查与解决
核心问题1:URL构建错误
你在定义url时犯了两个关键错误:
- 未使用字符串格式化语法替换
{lat}、{lon}和{appid}占位符,导致API收到的是原始占位符文本,而非有效参数。 - appid部分直接硬编码密钥到字符串中,未引用已定义的
appid变量,格式错误会让API判定密钥无效。
核心问题2:经纬度变量错误
lon=df.Longitude和lat=df.Latitude获取的是整个DataFrame的列(Series对象),并非单个城市的经纬度值。直接将整个Series传入URL,会让API收到无效的坐标文本,触发错误。
修正后的代码示例
import requests import pandas as pd appid = 'b0gs3g26768234d11ss6jh722ff100r8e' base_url = 'http://api.openweathermap.org/data/2.5/air_pollution/forecast?lat={}&lon={}&appid={}' # 循环处理每个城市的经纬度 for idx, row in df.iterrows(): lat = row['Latitude'] lon = row['Longitude'] # 格式化URL,替换占位符 url = base_url.format(lat, lon, appid) r = requests.get(url) # 检查响应状态 if r.status_code == 200: data = r.json() # 此处可处理返回数据,如存入列表或新DataFrame print(f"成功获取{idx}号城市数据") else: print(f"获取{idx}号城市数据失败,状态码:{r.status_code},响应内容:{r.text}")
额外注意事项
- 确认API密钥权限:确保你的密钥已开通空气污染预报API的访问权限,部分免费密钥存在功能限制。
- 控制调用频率:OpenWeatherMap有API调用频率限制,处理180个城市时建议添加延时(如
time.sleep(1)),避免触发限流。
内容的提问来源于stack exchange,提问作者user20387029
相关产品推荐
相关产品推荐

