讲师中心 微信公众号
AI工具推荐 视频效率加速

掌握USDA食品数据API分页获取完整营养信息教程

胖伟酱_6531

胖伟酱_6531

发布时间:2025-08-28 19:35:01

|

694人浏览过

|

来源于php中文网

原创

掌握USDA食品数据API分页获取完整营养信息教程

本教程详细介绍了如何通过Python有效地从USDA食品数据API获取完整的营养事实数据。针对API默认返回结果受限(如50条)的问题,文章深入探讨了API分页机制,并提供了利用pageSize和pageNumber参数迭代获取所有数据项的解决方案。教程包含示例代码、错误处理和最佳实践,旨在帮助开发者构建稳定、高效的数据采集流程。

深入理解API分页机制与USDA食品数据API实践

在使用外部api获取数据时,开发者经常会遇到返回结果数量受限的情况。这通常是由于api采用了分页(pagination)机制,旨在优化性能、减少带宽消耗并防止单次请求返回过大数据量。美国农业部(usda)的食品数据中心(food data central, fdc)api也不例外,其搜索接口在默认情况下可能只返回少量结果(例如50条)。本教程将详细讲解如何识别并处理这种分页机制,从而获取完整的usda食品营养数据。

识别API分页

当通过API进行数据查询,但发现返回的数据量远低于预期时,首先应查阅该API的官方文档。对于USDA FDC API,其文档(例如SwaggerHub上的Food Data Central API)会明确指出搜索结果是分页的。在API响应中,通常会包含指示当前页码(currentPage)和总页数(totalPages)的字段。此外,文档还会说明控制分页行为的参数,例如:

  • pageSize: 每页返回结果的最大数量。USDA API允许将此参数设置为最大200。
  • pageNumber: 指定要获取的页码。

理解这些参数是获取全部数据的关键。

分页获取完整数据的实现

为了获取所有符合条件的食品数据,我们需要编写一个循环,迭代请求每一页的数据,并将它们累积起来。以下是使用Python requests 库实现此逻辑的示例代码:

import requests
import json
import pandas as pd

def get_all_usda_foods(query_term, api_key, page_size=200):
    """
    从USDA食品数据API分页获取所有符合查询条件的食品数据。

    参数:
    query_term (str): 查询的食品名称或关键词。
    api_key (str): USDA API的授权密钥。
    page_size (int): 每页返回的结果数量,最大为200。

    返回:
    list: 包含所有食品数据字典的列表,如果发生错误则返回None。
    """
    all_foods = []
    # 构造初始URL,设置每页大小
    base_url = f"https://api.nal.usda.gov/fdc/v1/foods/search?api_key={api_key}&query={query_term}&pageSize={page_size}"

    with requests.Session() as session:  # 使用requests.Session保持连接,提高效率
        try:
            # 第一次请求,获取总页数
            print(f"Fetching initial page for query: '{query_term}'")
            response = session.get(base_url, timeout=10)
            response.raise_for_status()  # 检查HTTP请求是否成功
            api_response = response.json()

            # 检查API响应结构,确保'foods'和'totalPages'存在
            if "foods" not in api_response or "totalPages" not in api_response:
                print("Error: 'foods' or 'totalPages' not found in initial API response.")
                return None

            all_foods.extend(api_response["foods"])
            total_pages = api_response["totalPages"]
            print(f"Total pages to fetch: {total_pages}")

            # 从第二页开始循环获取所有数据
            for page_num in range(2, total_pages + 1):
                print(f"Fetching page {page_num}/{total_pages}...")
                page_url = f"{base_url}&pageNumber={page_num}"
                page_response = session.get(page_url, timeout=10)
                page_response.raise_for_status()
                page_api_response = page_response.json()

                if "foods" in page_api_response:
                    all_foods.extend(page_api_response["foods"])
                else:
                    print(f"Warning: 'foods' not found in response for page {page_num}.")
                    break # 如果某一页没有'foods',可能表示数据结束或API行为异常

        except requests.exceptions.HTTPError as http_err:
            print(f"HTTP error occurred: {http_err} - Status Code: {http_err.response.status_code}")
            return None
        except requests.exceptions.ConnectionError as conn_err:
            print(f"Connection error occurred: {conn_err}")
            return None
        except requests.exceptions.Timeout as timeout_err:
            print(f"Request timed out: {timeout_err}")
            return None
        except requests.exceptions.RequestException as req_err:
            print(f"An unexpected request error occurred: {req_err}")
            return None
        except json.JSONDecodeError as json_err:
            print(f"Failed to decode JSON response: {json_err}")
            print(f"Response content: {response.text[:500]}...") # 打印部分响应内容辅助调试
            return None
        except Exception as e:
            print(f"An unexpected error occurred: {e}")
            return None

    return all_foods

# 使用示例
if __name__ == "__main__":
    API_KEY = "YOUR_USDA_API_KEY" # 替换为你的USDA API密钥
    search_term = "raw fruit" # 示例查询词

    print(f"Starting data retrieval for '{search_term}'...")
    food_items_data = get_all_usda_foods(search_term, API_KEY)

    if food_items_data:
        print(f"\nSuccessfully retrieved {len(food_items_data)} food items.")

        # 将数据转换为Pandas DataFrame并导出到Excel
        processed_data = []
        for item in food_items_data:
            row = {"Description": item.get("description", "N/A")}
            for nutrient in item.get("foodNutrients", []):
                nutrient_name = nutrient.get("nutrientName")
                nutrient_value = nutrient.get("value")
                if nutrient_name and nutrient_value is not None:
                    row[nutrient_name] = nutrient_value
            processed_data.append(row)

        df = pd.DataFrame(processed_data)

        # 清理列名,处理重复营养素(如果存在)
        # 这里只是一个简单的处理,实际应用中可能需要更复杂的逻辑
        df = df.loc[:,~df.columns.duplicated()] 

        output_filename = f'{search_term.replace(" ", "_")}_nutritional_facts.xlsx'
        df.to_excel(output_filename, index=False)
        print(f"Data exported to {output_filename}")
    else:
        print("Failed to retrieve food data.")

代码解析与注意事项

  1. get_all_usda_foods 函数:

    • 参数: 接收查询关键词 (query_term)、API密钥 (api_key) 和可选的 page_size。
    • requests.Session(): 使用 requests.Session 可以复用底层的TCP连接,对于多次请求同一个域名,这能显著提高性能。
    • 初始请求: 首先发送一个请求来获取第一页的数据,并从中提取 totalPages。这是确定需要循环多少次的关键。
    • 循环获取: 从第二页开始,循环直到 totalPages。在每次循环中,构造带有 pageNumber 参数的URL,发送请求,并将返回的 foods 数据添加到 all_foods 列表中。
    • 错误处理: 集成了 try-except 块来捕获可能发生的网络错误(如 HTTPError, ConnectionError, Timeout)和JSON解析错误(JSONDecodeError),提高了代码的健壮性。当发生错误时,函数会打印错误信息并返回 None。
    • response.raise_for_status(): 这是一个非常有用的方法,如果HTTP请求返回了错误状态码(例如4xx或5xx),它会抛出 HTTPError 异常。
  2. 数据处理与导出:

    tidy-excel-data
    tidy-excel-data

    清理、标准化、验证并汇总杂乱的 Excel 工作簿。当 Codex 需要处理 `.xlsx`、`.xls`、`.xlsm` 或 `.csv` 格式的数据时使用,包括:统一表头格式、删除空白行与空白列、修剪文本内容、去重记录、检测数据质量问题、拆分或合并工作表、生成清洗后的工作簿,以及为业务电子表格生成审计摘要。

    下载
    • 获取到所有 food_items_data 后,代码遍历每个食品项,提取其描述和所有营养成分。
    • 将这些数据组织成字典列表,然后使用 pandas.DataFrame 转换为数据框。
    • df.loc[:,~df.columns.duplicated()] 这一行用于处理在数据转换过程中可能出现的重复列名(例如,如果API响应中同一个营养素名称出现了多次,尽管通常不会)。这只是一个简单的去重方法,在实际应用中可能需要更复杂的逻辑来合并或区分重复数据。
    • 最后,使用 df.to_excel() 方法将数据框导出到Excel文件,index=False 表示不将DataFrame的索引写入Excel。
  3. API密钥安全:

    • 在示例代码中,API_KEY 直接写在代码中。在实际生产环境中,绝不应将API密钥硬编码到代码中或直接暴露在公共仓库中。应使用环境变量、配置文件或密钥管理服务来安全地存储和访问API密钥。
  4. 请求频率与限流:

    • 虽然USDA API文档中没有明确提及严格的速率限制,但频繁或高速的请求可能会导致IP被暂时封禁。在处理大量数据时,可以考虑在请求之间添加短暂的延时(例如 time.sleep(0.1)),以模拟更自然的用户行为,减少被限流的风险。
  5. 超时设置:

    • timeout=10 参数为每个请求设置了10秒的超时时间。这是一个良好的实践,可以防止程序因网络问题长时间挂起。根据网络环境和API响应速度,可以适当调整此值。

总结

通过本教程,我们学习了如何识别和应对API分页问题,特别是针对USDA食品数据API。核心策略是利用API文档中提供的 pageSize 和 pageNumber 参数,通过迭代请求来获取完整数据集。结合 requests.Session 优化性能、完善的错误处理以及将数据导出到Pandas DataFrame和Excel的实践,开发者可以构建出高效、健壮的数据采集解决方案。在任何API集成中,仔细阅读API文档、理解其工作原理并实施适当的错误处理和安全措施始终是成功的关键。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2195

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3462

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1156

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3979

2025.09.10

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

340

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

252

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

691

2026.04.13

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 44.8万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn