百度搜索 API 返回字段:references 里 13 个字段逐个说清
# 百度搜索 API 返回字段:references 里 13 个字段逐个说清
> 接口:百度搜索(apiCode=3351,接入点 3351-1)· 官方自营 · 按次计费
> 返回格式:JSON · 适用人群:已跑通第一次调用的开发者 · 阅读时间:约 8 分钟
> **最后实测核对:2026-09-15(104 条真实结果样本统计)**
百度搜索 API(apiCode=3351)的业务数据都在 `showapi_res_body.references` 数组里,每条结果 13 个字段,加上实测发现的一个文档未列字段共 14 个。真正决定你怎么用这批数据的是四个:`title` 给模型看,`content` 给模型吃,`url` 做引用来源,`date` 和两个评分做过滤。
这篇把每个字段说清楚,并标注哪些是文档写的、哪些是我实际调用后统计出来的。
## 核心要点
- 14 个字段在 2026-09-15 抓到的 104 条结果记录里(13 次响应,含跨请求重复)**100% 出现**,不存在"有的结果没这个键"的情况。
- `content` 是正文片段,最多 2000 字;`snippet` 是更短的摘要。给大模型用 `content`,做列表展示用 `snippet`。
- `website` 可能为空字符串或字面量"无",做站点统计前先判空。
## 字段总表
下表来源标注:✅ 文档列出 / 🔶 文档未列、实测发现。
| 字段 | 类型 | 说明 | 来源 |
|------|------|------|------|
| `id` | Number | 引用编号,从 1 递增 | ✅ |
| `type` | String | 检索资源类型,当前只有 `web`(网页) | ✅ |
| `title` | String | 网页标题 | ✅ |
| `snippet` | String | 摘要 | ✅ |
| `content` | String | 网页正文片段,**显示 2000 字以内的原文** | ✅ |
| `url` | String | 网页地址 | ✅ |
| `website` | String | 站点名称 | ✅ |
| `web_anchor` | String | 网站锚文本或网站标题 | ✅ |
| `icon` | String | 网站图标地址(favicon) | ✅ |
| `date` | String | 发布时间,格式 `yyyy-MM-dd HH:mm:ss` | ✅ |
| `authority_score` | Number | 网页权威性评分,取值 [0,1],越大越权威 | ✅ |
| `rerank_score` | Number | 原文片段相关性评分,取值 [0,1],越大越相关 | ✅ |
| `web_extensions` | Object | 网页扩展信息,内含 `images` 与 `author_info` | ✅ |
| `markdown_content` | String | 实测每条都有,本次 104 条**全部为空字符串** | 🔶 |
`web_extensions` 展开后是两个子字段:
| 子字段 | 类型 | 说明 | 来源 |
|--------|------|------|------|
| `images` | Object[] | 图片列表,每项含 `url` / `width` / `height` | ✅ |
| `author_info` | Object | 作者信息,含 `name` / `verified_type` / `signature` 等 | ✅ |
## 定位与内容字段
`id` 从 1 开始递增,顺序就是返回顺序。它不是数据库主键,换一次查询就重新编号,别拿它做去重键——去重得用 `url`。
`type` 在本次 104 条样本里全部是 `web`。文档写明取值就是 `web`(网页),所以现在不会有别的类型,但判断逻辑建议留着分支,别写死。
`title` / `snippet` / `content` 三者是递进关系:
- `snippet` 短,适合列表页展示。
- `content` 长,是原文片段,最多 2000 字。实测里这个字段经常有内容,直接喂给大模型省去二次抓取。
- `title` 是标题,做引用角标时和 `id` 一起用。
关于 `content` 有个容易误判的点:它**不是全文**,是片段。想做全文检索或长文摘要,还得拿 `url` 自己去抓。
## 来源字段
`url` 是原文地址,做引用和去重都靠它。
`website` 是站点名称,实测有个陷阱:**它会为空字符串,也会直接返回"无"**。在 65 条去重后的结果里,有 17 条的 `website` 是空值或"无"(2026-09-15 统计)。你如果按站点名分组做信源统计,这一步必须先判空,否则会多出一个叫"无"的站点。
`icon` 是 favicon 地址,前端列表里做站点图标用。
`web_anchor` 是网站的锚文本,实测多数结果里是空字符串。它更像补充信息,不要拿它当站点名的替代。
## 时间字段
`date` 是发布时间,字符串格式 `yyyy-MM-dd HH:mm:ss`,不是时间戳。做排序或时间过滤要先转成日期对象。
注意它指的是**网页发布时间**,不是本次检索时间。用 `search_recency_filter` 过滤时,接口筛的就是这个字段。
有个细节值得留意:实测里不少结果的 `date` 时间是 `00:00:00`,这通常说明原始页面只精确到日期。所以别做"最近 3 小时"这种粒度的时间过滤,会筛掉大量本来符合条件的结果。
## 两个评分字段
`authority_score` 是权威性评分,`rerank_score` 是原文片段相关性评分,取值范围都是 [0,1]。
实测取值集中度很高:104 条样本里,两个字段各自只出现过 **0.5 和 1** 两个值(2026-09-15 统计)。文档给出的区间是 [0,1],实测样本没有出现中间值。
这意味着别把评分当连续排序依据用。想提升信源质量,"`authority_score` 等于 1 优先"这种离散判断比"按分数排序"更贴近实际数据分布。
还有个反直觉的现象:`rerank_score = 1` 是常态,实测大量结果都是 1,它区分不出相关性高低。所以做结果筛选时,`authority_score` 比 `rerank_score` 更有区分度。
**提醒**:具体在什么场景设什么阈值,文档没有给建议值。我上面说的只是"数据长什么样",阈值要按你自己的语料试出来,别直接抄。
## web_extensions 与实测补充
`images` 是图片列表。实测 104 条里有 75 条是空数组(约七成),有图的结果通常 1 到 2 张。做图文展示前先判空。
`author_info` 是作者信息。文档写的是"仅百家号站点存在",实测验证了两件事:
1. **有内容的情况确实只在百家号出现。** 65 条去重结果里有 10 条 `author_info` 带了 `name` / `signature` 等字段,全部来自 `baijiahao.baidu.com`。
2. **但这个键在非百家号结果里也存在,值是空对象 `{}`。** 所以代码不能用"键是否存在"来判断站点类型,正确的做法是判断 `author_info.name` 有没有值。
```python
author = (item.get("web_extensions") or {}).get("author_info") or {}
author_name = author.get("name") or item.get("website") or "未知来源"
```
这段兜底逻辑在公众号、媒体号的场景里很实用——作者名往往比站点名更能说明信源。
`markdown_content` 是文档返回参数表里**没有列**,但实测每条结果都带的字段。2026-09-15 的 104 条样本里它一律是空字符串 `""`。写解析代码时不要依赖它,但也别把它当错误——它一直在。
## 怎么按字段做结果处理
判断逻辑照这个顺序写,能覆盖实测遇到的坑:
```python
def normalize(item: dict) -> dict:
we = item.get("web_extensions") or {}
author = we.get("author_info") or {}
return {
"title": item.get("title") or "",
"url": item.get("url") or "",
# website 实测会为空或"无",兜底到域名
"site": item.get("website") if item.get("website") not in (None, "", "无") else "未知站点",
"author": author.get("name") or "",
"published_at": item.get("date") or "",
# content 更完整,退回 snippet
"text": item.get("content") or item.get("snippet") or "",
"authority": item.get("authority_score"),
"has_image": bool(we.get("images")),
}
```
## FAQ
**Q1:`content` 是网页全文吗?**
不是。它是原文片段,最多显示 2000 字以内的相关信息。需要全文得用 `url` 再抓一次。
**Q2:`website` 为什么会是"无"?**
实测确实会。2026-09-15 的 65 条去重结果里有 17 条 `website` 为空字符串或"无"。有些页面百度没有解析出站点名。代码里判空并兜底到 `url` 的域名。
**Q3:两个评分字段哪个更能反映质量?**
`authority_score` 更能区分来源质量。实测 104 条里 `rerank_score` 大量为 1,几乎没有区分度。
**Q4:`date` 能精确到几点几分吗?**
格式上能,但实测很多结果的时分秒是 `00:00:00`,说明源页面只精确到日期。做细粒度时间过滤要留余量。
**Q5:`id` 能当唯一键存数据库吗?**
不能。它是一次响应内的排序编号,换关键词重新调用会从 1 重新开始。唯一键用 `url`。
**Q6:`type` 现在只有 `web`,以后会变吗?**
文档定义的取值就是 `web`(网页)。当前样本 100% 是 `web`。判断逻辑建议留分支,不要让代码在出现新类型时崩掉。
## 下一步阅读
- [百度搜索 API:用 Python 跑通第一次实时检索](https://www.showapi.com/guides/baidu-search-api-quickstart-3351) —— 还没跑通请求先看这篇
- [在 RAG 里接入百度搜索 API](https://www.showapi.com/guides/baidu-search-api-rag-agent-3351) —— 这些字段怎么拼进大模型上下文
- [百度搜索 API 报错怎么查](https://www.showapi.com/guides/baidu-search-api-error-codes-3351) —— 字段拿不到时的排查路径
---
- **本系列共 8 篇**:查看[百度搜索 API 指南总目录](https://www.showapi.com/guides/baidu-search-guides-3351)