使用参数构造Python GET请求调用NOAA NCEI API时出现错误,硬编码URL可正常工作
搞定NOAA NCEI API的参数构造与请求错误
嘿,我来帮你解决这个问题!你碰到的AttributeError、InvalidURL这些错误,根源其实是两个容易踩的小坑,咱们一步步捋清楚:
1. 别把Response对象当URL用!
你提到的一堆解析错误,核心是这行代码搞的鬼:
response_ROC = requests.get(request_ROC)
这里的request_ROC已经是你第一次请求返回的响应对象(就是那个<Response [200]>),而不是字符串URL。当你把响应对象传给requests.get()时,它会傻愣愣地把这个对象当成URL去解析,自然会抛出"No scheme supplied"这类错误——它根本不是合法的URL啊!
如果要把响应内容加载到DataFrame,直接用request_ROC.text(CSV格式的文本内容)就行,完全不需要再发一次请求。
2. 手动URL编码纯属多此一举
你用urllib.parse.urlencode处理参数后传给requests.get()的params参数,其实是画蛇添足。requests库本身就支持直接传字典格式的参数,它会自动帮你完成URL编码,包括处理逗号这种特殊字符,比手动处理靠谱多了。
给你修正后的完整代码:
import requests import pandas as pd hostendpoint = 'https://www.ncei.noaa.gov/access/services/data/v1' data_types = ['AWND','WDF1','WDF5','WDFG','WSF1','WSF2','WDFM','WSFM','WSFG','WDMV'] url_params = { "dataset": "daily-summaries", "stations": "USW00014768", "startDate": "1984-01-01", "endDate": "2026-04-13", "dataTypes": ",".join(data_types), # 直接把列表拼成逗号分隔的字符串 "includeStationName": "true", "format": "csv" } # 直接传字典给params,requests会自动处理编码 request_ROC = requests.get(hostendpoint, params=url_params, verify=True) # 先确认请求成功了 print(f"请求状态码:{request_ROC.status_code}") if request_ROC.status_code == 200: # 把CSV响应直接加载到DataFrame try: df = pd.read_csv(request_ROC.raw) # 用raw更高效,适合大文件 print("数据加载成功!预览前5行:") print(df.head()) except Exception as e: print(f"加载DataFrame出错:{e}") else: print(f"请求失败啦,错误码:{request_ROC.status_code}")
为啥打印的URL看起来一样还是有问题?
你之前手动编码后传params,requests会把编码后的字符串直接拼到URL后面,所以打印出来和硬编码的URL一致,但这种做法没必要,而且后续如果参数有变动,手动编码容易出疏漏。直接用字典params既简洁又不容易出错。
最后再划个重点
- 绝对别把
requests.get()返回的响应对象当成URL再传给requests.get(),这是解析错误的罪魁祸首。 - 相信
requests的能力,直接传字典格式的参数,不用自己手动搞URL编码。
内容的提问来源于stack exchange,提问作者Lord Bobbymort
相关产品推荐
相关产品推荐

