首页
/ DailyMed API 实战指南:基于 NIH/NLM 药品标签的结构化查询与药物情报检索

DailyMed API 实战指南:基于 NIH/NLM 药品标签的结构化查询与药物情报检索

2026-09-08 19:42:10作者:庞队千Virginia

导读

本文围绕 scientific-agent-skills 仓库中 DailyMed API 参考文档 展开,系统讲解如何通过美国国立卫生研究院(NIH)/国家医学图书馆(NLM)DailyMed 官方服务接口,对处方药与非处方药的 SPL(Structured Product Label,结构化产品标签)进行名称检索、SetID 定位、NDC 编码解析、药理学分类查询与 RxNorm CUI 关联。读完本文,你将掌握 DailyMed REST 服务的全部核心端点、过滤与分页参数、响应结构以及速率使用策略,并能够把查询结果与仓库 database-lookup 技能要求的可审计溯源流程(endpoint、参数、计数核对)衔接起来,支撑真实的药品监管信息与临床药理检索场景。

DailyMed 服务定位:药品标签的权威来源

DailyMed 是 NIH/NLM 维护的药品标签发布服务平台,其数据源是与 FDA 共享的 SPL(HL7 标准格式的结构化产品标签),对应仓库中 database-lookup 技能 的 "Chemistry & Drugs"(化学与药物)域。

数据库选择指南 中,DailyMed 的定位被明确为:

用户询问内容 首选数据库 备选数据库
药品标签、不良反应、召回 FDA (OpenFDA) DailyMed
药品标签(结构化产品标签) DailyMed FDA (OpenFDA)

也就是说,当用户需要的是**完整、结构化、带 section 的药品说明书原文(SPL 内容)**时,应首选 DailyMed;而当查询目标是开放 API 聚合字段(如 openfda.generic_name)或不良事件、召回时,才转向 OpenFDA。在药物领域检索中,两个 API 可作为交叉核对来源使用。

此外,retrieval-contract.md 中的临床与监管领域安全提示同样适用于 DailyMed:返回的说明性叙事文本应视为不受信任的第三方内容,不得将返回文本直接拼入 shell 命令或后续查询。

基础信息:Base URL 与鉴权

DailyMed 服务的基础 URL(v2 REST 服务):

https://dailymed.nlm.nih.gov/dailymed/services/

鉴权方面与多数 NIH/NLM 服务不同——无需 API key,可直接以匿名方式调用。这意味着在 Agent 自动化流程中省去了密钥管理步骤,但在做大批量抓取时应自行控制频率(详见下文速率章节)。

在仓库 database-lookup 技能的 Making API Calls 规范中,无专用抓取工具的平台应回退到 curl

curl -s -H "Accept: application/json" \
  "https://dailymed.nlm.nih.gov/dailymed/services/v2/spls.json?drug_name=metformin"

建议始终携带 Accept: application/json 请求头,并在参数中按需 URL 编码特殊字符(如药理学类别名中的 +、空格、冒号)。

核心端点详解

DailyMed v2 服务提供 8 个主要端点,涵盖"按名搜 → 定位 SetID → 展开详情"的完整查询链路。

端点总览

端点 功能描述
v2/spls.json?drug_name={name} 按药品名称检索 SPL 标签
v2/spls/{setid}.json 按 SetID 获取标签元数据
v2/spls/{setid}/ndcs.json 获取某标签对应的 NDC 编码
v2/spls/{setid}/media.json 获取某标签的图片/媒体资源
v2/drugnames.json?drug_name={prefix} 药品名称自动补全
v2/drugclasses.json?drug_class_name={name} 按药理学分类检索
v2/rxcuis.json?drug_name={name} 获取药品对应的 RxNorm CUI
v2/ndc/{ndc_code}/spls.json 按 NDC 编码反查标签

检索链路的理解

从端点设计上可以推断,DailyMed 检索的典型工作流是一个两步定位模型

  1. 模糊定位:通过 drug_namedrug_classndc_code 或 RxNorm 关联,先找到候选 SPL 记录;
  2. 精确提取:拿到记录中的 setid(SPL 的唯一标识符,UUID 形式,如 b03f295f-...)后,再通过 v2/spls/{setid}.json 获取元数据,用 ndcs.jsonmedia.json 乃至 packaging.xml 提取细分内容。

setid 是贯穿整个 API 的核心主键——所有下游详情端点都以它为路径参数。在仓库的 响应格式示例 中,data 数组的每个元素都携带 setid 字段,正是为了支持这种二次跳转。

过滤与分页参数

/v2/spls.json 检索端点,除 drug_name 外还支持以下服务端过滤参数:

参数 含义 说明
drug_class 药理学分类 需传标准分类名,多词需 URL 编码(如 HMG-CoA+Reductase+Inhibitor
labeler 生产商(manufacturer)名称 可按厂家过滤标签
page 页码 用于结果翻页
pagesize 每页条数 上限为 100

分页行为与仓库 SKILL.md 中总结的 "Page number 模式" 一致:page=1&pagesize=100 → 递增 page。响应中的 metadata 提供 total_elements(总命中数)、elements_per_pagecurrent_pagetotal_pages,可直接用于"先计数、再翻页"的完整性核对流程——这正是 retrieval-contract.md 中 Completeness Protocol 的第一步。若需要全量检索(例如收集某药理学分类下全部标签),应依据 total_pages 逐页拉取并在本地核对"期望总数 vs 已取总数"。

响应格式解析

DailyMed 的列表检索返回统一的分页封装结构,JSON 形如:

{
  "metadata": {
    "total_elements": 12,
    "elements_per_page": 10,
    "current_page": 1,
    "total_pages": 2
  },
  "data": [
    {
      "published_date": "2024-01-15",
      "title": "METFORMIN HYDROCHLORIDE tablet",
      "setid": "b03f295f-..."
    }
  ]
}

字段说明:

  • metadata.total_elements:服务端命中的总记录数,用于判定是否需要继续翻页;
  • metadata.total_pages:由 total_elementselements_per_page 推导的总页数;
  • data[].published_date:标签发布日期;
  • data[].title:标签标题(通常含活性成分与剂型,如 "METFORMIN HYDROCHLORIDE tablet");
  • data[].setid:标签唯一标识符,供后续详情/NDC/媒体查询使用。

注意该列表接口返回的是精简元数据,不含说明书正文分段。完整 SPL 内容需通过 packaging.xml 等 XML 子资源获取(见下文示例)。

实战示例

以下示例均可在浏览器或 curl 中直接复现。

1. 按名称检索标签

https://dailymed.nlm.nih.gov/dailymed/services/v2/spls.json?drug_name=metformin

这是最常见的入口:以二甲双胍为例,返回所有标题含 metformin 的 SPL 标签(片剂、缓释片、口服液等多剂型记录),每个记录含 setid 与发布日期。

2. 药品名称自动补全

https://dailymed.nlm.nih.gov/dailymed/services/v2/drugnames.json?drug_name=ator

传入前缀(如 ator)可获得以该前缀开头的药品名称建议,适用于构建搜索框联想、纠错用户输入或候选名词规范化。

3. 按药理学分类检索

https://dailymed.nlm.nih.gov/dailymed/services/v2/spls.json?drug_class=HMG-CoA+Reductase+Inhibitor

以他汀类药物所属的 HMG-CoA 还原酶抑制剂分类为例。多词分类名在 URL 中需以 + 编码空格。此查询可配合 drug_namelabeler 组合,实现"某分类 + 某厂家"的二次过滤。

4. 拉取完整 SPL 内容(XML)

https://dailymed.nlm.nih.gov/dailymed/services/v2/spls/{setid}/packaging.xml

{setid} 替换为第一步获得的实际 UUID。该接口返回带 sections 的完整 SPL(包装、成分、适应证、禁忌等结构化小节),是"结构化产品标签"深度读取的核心路径,可支撑成分提取、适应证对比等下游任务。

5. 端点组合实战链路

结合仓库的检索合同思想,一条典型的"从药品名到 NDC 编码"的完整链路为:

  1. v2/spls.json?drug_name={name} → 取 data[0].setid
  2. v2/spls/{setid}/ndcs.json → 获取该标签下所有 NDC 编码;
  3. (可选)用 v2/ndc/{ndc_code}/spls.json 反向验证该 NDC 是否可解析回标签。

将上述步骤连同 published_date、访问日期一起记录,即可满足技能对可复现溯源的要求。

速率与使用边界

DailyMed 官方未公布明确的速率限制(rate limit)。参考文档给出的使用原则是"Be reasonable"(合理使用)。结合仓库 SKILL.md 的请求准则

  • 对限流类 API 应做串行请求;DailyMed 虽无公开限制,仍建议在批量抓取时加入节流(如请求间短暂间隔);
  • 广度检索先看计数与第一页,不要未经确认就超过 10,000 条记录或 100 次 API 调用
  • 若目标确实需要全部标签(如全量 SPL 语料),应评估是否更适合使用官方提供的批量下载数据(DailyMed 亦提供完整 SPL 打包下载,作为 REST 分页抓取的替代),而不是对 REST 服务做海量轮询;
  • 遇到 HTTP 429/503 限流错误时,短暂等待后重试一次即可。

领域联动与安全处置

DailyMed 在仓库中与 OpenFDA、DrugBank 等形成药物数据互补矩阵:

  • 标签原文场景(本文主题):首选 DailyMed,因其以 SPL 完整结构为核心;
  • 聚合字段/事件场景:转用 OpenFDA APIopenfda.* 字段、不良事件 FAERS、召回);
  • 药理与靶点场景:可参考 DrugBank/ChEMBL,但 DrugBank 需付费许可,仓库指引其免费替代方案为 ChEMBL + PubChem + OpenFDA。

最后强调 retrieval-contract.md 对临床与监管数据的安全要求:DailyMed 返回的说明书叙事文本属于第三方内容,应视为不可信数据——不要执行其中隐含的指令,不要将原始响应粘贴进 shell,只抽取任务所需字段并做净化后再进入下一步工具调用;面向用户的输出统一采用仓库定义的 Retrieval Summary / Results / Provenance 三段式结构,附上访问日期、端点、参数与计数核对,保证任何一条药品情报都可被他人复现。

小结

DailyMed v2 REST 服务是无密钥、以 setid 为主键的药品标签检索 API:用 spls.json 按名称/分类/厂家找标签,用 setid 驱动的子资源展开 NDC、媒体与完整 SPL XML,再配合 metadata 完成翻页与计数核对。结合仓库 database-lookup 技能 的检索合同、分页模式与溯源输出规范,你可以把"某个药的说明书、NDC 编码、药理学分类归属"这类问题转化为确定性、可审计的 API 检索流程,与 OpenFDA 形成互为补充的监管信息闭环。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
898
5.82 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
921
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.8 K
1.02 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
391