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

Python调用FDA API分页拉取数据时报HTTP 400 Bad Request错误如何解决

问题排查与代码修正

错误原因

  • 分页参数完全不符合FDA公开API的规范:FDA NDC API的分页需要两个参数,limit控制单次返回的最大条数(上限100),skip控制偏移量即从第几条数据开始返回。你当前代码把limit参数的值设为循环变量i,第一次循环i=0相当于请求返回0条数据,直接触发400错误。
  • 变量名错误:你第一行定义的列表变量名为list(同时这是Python内置关键字,不建议用作变量名),但循环中调用的是len(my_list),会直接触发未定义变量报错。
  • 检索参数错误:你需要拉取管制3类(CIII)药品数据,但代码中检索值写的是CII(管制2类)。
  • 存储逻辑问题:all_data_df未预先初始化,第一次执行append时会报错;且Pandas自1.4.0版本开始已经弃用append方法,推荐使用pd.concat做数据合并。
  • 冗余代码:你生成的长度为2321的列表没有任何实际作用,属于多余逻辑。

修正后代码

import pandas as pd

# 初始化存储用的DataFrame
all_data_df = pd.DataFrame()
# 总数据量、单次请求上限
total_count = 2321
limit = 100

for skip in range(0, total_count, limit):
    # 构造请求:limit固定为100,skip每次累加100
    query_url = f'https://api.fda.gov/drug/ndc.json?search=dea_schedule:"CIII"&limit={limit}&skip={skip}'
    print(query_url)
    # 拉取数据
    res = pd.read_json(path_or_buf=query_url, orient='values', typ='series', convert_dates=False)
    data_df = pd.DataFrame(res['results'])
    # 合并数据
    all_data_df = pd.concat([all_data_df, data_df], ignore_index=True)

分页逻辑说明

修正后的分页逻辑符合FDA API要求:

  • 每次请求固定返回最多100条数据,符合接口单次请求上限
  • 偏移量skip从0开始,每次循环增加100,依次请求第0-99条、100-199条...直到覆盖全部2321条数据
  • 合并数据时加ignore_index=True避免重复的行索引

内容的提问来源于stack exchange,提问作者Liliana Torres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 04:45:07