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

批量调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:24:03