批量调用API拉取数据封装自定义函数报HTTP 422错误如何解决
问题原因
HTTP 422错误代表服务器可识别请求格式,但请求参数存在语义错误无法处理。结合单条手动执行正常、批量循环执行报错的表现,核心问题如下:
- ID类型不匹配:传入的pandas Series如果存在空值,ID会被自动转为float类型,拼接到URL后会变成
3601714.0这类格式,不符合接口要求的整数ID规则,服务器无法识别。 - 未做请求限流:循环中连续高频发送请求,触发了接口的频率限制,部分请求被服务器拦截返回422。
- 缺少异常捕获逻辑:批量请求中只要有一个ID无效、请求失败,整个函数就会直接中断,无法执行后续ID的拉取。
修复后的代码
import pandas as pd from urllib.request import Request, urlopen import time def demographics(universal_id): demo_mstr = [] # 先把Series转为整数,处理可能的float格式问题,空值转为0方便后续过滤 id_list = universal_id.fillna(0).astype(int).tolist() for id in id_list: # 跳过无效ID if id == 0: continue try: req = Request(f'https://gs-api.greatschools.org/schools/{id}/metrics') req.add_header('X-API-Key', '替换为你的实际API Key') content = urlopen(req).read() data = pd.read_json(content) data.reset_index(inplace=True) data['id'] = id data.drop(columns=['head-official-name','head-official-email'],inplace=True) data = data.pivot( index=['enrollment', 'percent-free-and-reduced-price-lunch', 'percent-students-with-limited-english-proficiency', 'student-teacher-ratio', 'percentage-male', 'percentage-female', 'percentage-of-teachers-with-3-or-more-years-experience', 'percentage-of-full-time-teachers-who-are-certified', 'average-salary','id'], columns='index', values='ethnicity' ).reset_index() # pivot后重置索引,方便后续合并 demo_mstr.append(data) # 每次请求间隔0.5秒,避免触发限流,可根据接口实际限流规则调整 time.sleep(0.5) except Exception as e: # 打印错误ID和异常信息,不中断整个循环 print(f"ID {id} 拉取失败,错误信息:{str(e)}") continue # 直接返回合并后的完整DataFrame return pd.concat(demo_mstr, ignore_index=True)
额外注意事项
- 如果接口限流严格,可以把
time.sleep的参数调大,或者添加失败重试逻辑。 - 若还是存在报错,可以打印拼接后的完整URL,核对ID格式是否符合要求。
内容的提问来源于stack exchange,提问作者elby
相关产品推荐
相关产品推荐

