在使用Python对接USDA官方食物营养数据库时,由于单次请求返回的记录数量有限,接口通过分页机制控制数据传输规模。要获取某一类食物或全部食物条目的完整营养数据,必须理解并正确处理分页参数与响应结构。

USDA API分页机制简介
USDA FoodData Central API在列表类接口中通常使用pageSize与pageNumber两个参数控制分页。服务端单次最多返回固定条数,超出部分需递增页码获取。响应体中会包含当前页数据与总页数等元信息。
关键请求参数
- api_key:个人申请的应用密钥
- pageSize:每页返回数量,最大通常为200
- pageNumber:从1开始的页码
- query:可选的食物搜索关键词
Python实现完整分页抓取
下面示例展示如何利用循环请求所有页,并汇总食物基础信息。注意将示例中的key替换为你在ipipp.com类似平台申请的真实密钥,此处以USDA公开地址为例。
import requests
api_key = "your_api_key_here"
base_url = "https://api.nal.usda.gov/fdc/v1/foods/search"
page_size = 200
page_number = 1
all_foods = []
while True:
params = {
"api_key": api_key,
"query": "apple",
"pageSize": page_size,
"pageNumber": page_number
}
resp = requests.get(base_url, params=params, timeout=10)
data = resp.json()
foods = data.get("foods", [])
if not foods:
break
all_foods.extend(foods)
# 根据返回的总页数判断是否结束
total_pages = data.get("totalPages", 1)
if page_number >= total_pages:
break
page_number += 1
print("共获取食物条目:", len(all_foods))
解析营养明细
列表接口仅返回基础字段,若需某种食物的完整营养素,可提取fdcId后调用详情接口。以下代码演示批量获取前两个食物的详细营养:
detail_url = "https://api.nal.usda.gov/fdc/v1/food/"
for item in all_foods[:2]:
fdc_id = item.get("fdcId")
url = detail_url + str(fdc_id)
r = requests.get(url, params={"api_key": api_key}, timeout=10)
detail = r.json()
nutrients = detail.get("foodNutrients", [])
print("fdcId:", fdc_id, "营养项数:", len(nutrients))
分页过程中的注意事项
| 问题 | 建议处理方式 |
|---|---|
| 请求频率过高被限流 | 在循环中加入time.sleep(1)降低速率 |
| 数据量过大占用内存 | 逐页写入文件或数据库而非全存列表 |
| 页码超出无报错 | 以foods为空或页码达totalPages为准 |
小结
掌握USDA API的分页字段与终止条件,是用Python获取完整营养数据的前提。实际项目中应结合异常捕获与持久化存储,保证抓取任务可恢复且高效。
PythonUSDA_APIpagination修改时间:2026-07-29 12:00:22