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
相关产品推荐
相关产品推荐

