百度搜索 API 域名过滤只需两个参数:白名单与黑名单的实测边界
# 百度搜索 API 域名过滤只需两个参数:白名单与黑名单的实测边界
> 接口:百度搜索(apiCode=3351,接入点 3351-1)· 官方自营 · 按次计费
> 请求方式:POST / GET · 适用人群:需要控制信源的开发者 · 阅读时间:约 7 分钟
> **最后实测核对:2026-09-15(同参数对照实测 4 组)**
百度搜索 API(apiCode=3351)控制信源只用两个参数:`search_domain_filter` 限定只在指定域名里搜,`block_domain_filter` 排除指定域名。两个都是可选参数,都接受英文逗号分隔的多个域名。
反直觉的地方有两个:白名单能填 100 个域名,黑名单只能填 20 个;还有,**过滤生效后返回条数不会补齐**。第二点是实测出来的,文档没写,下面有对照数据。
## 核心要点
- 白名单 `search_domain_filter` 最多 100 个域名,黑名单 `block_domain_filter` 最多 20 个站点。
- 填父域名(如 `baidu.com`)会屏蔽它下面的全部子域名,实测有效。
- 过滤掉的条数不会用其他结果补回来,`count=10` 加过滤后可能只剩 1 条。
## 两个参数怎么分工
| 参数 | 作用 | 上限 | 适用场景 |
|------|------|------|---------|
| `search_domain_filter` | 只在名单内的域名中检索 | 100 个 | 你要的是权威站、垂直站,范围已知 |
| `block_domain_filter` | 不检索名单内的域名 | 20 个 | 你要的是全网,只想排除几个噪音源 |
写法和文档示例一致:多个域名用**英文逗号**分隔,地址不带 `http://` 前缀。
```python
data = {
"query": "大模型",
"search_domain_filter": "tieba.baidu.com,baike.baidu.com", # 只要这两个域名
# "block_domain_filter": "baijiahao.baidu.com", # 二选一或组合用
}
```
## 实测对照:过滤到底怎么影响结果
这是这篇的重点。2026-09-15 固定 `query=大模型`,四组请求只改域名参数,其他条件完全一致:
| 组 | 参数 | 返回条数 | 说明 |
|----|------|---------|------|
| 基准 | 只带 `search_recency_filter=week` | 10 条 | 其中百家号占 6 条 |
| 白名单 | `search_domain_filter=baike.baidu.com` | 3 条 | 3 条全部来自百度百科,`authority_score` 均为 1 |
| 黑名单(子域名) | `block_domain_filter=baijiahao.baidu.com` | 1 条 | 6 条百家号全部消失 |
| 黑名单(父域名) | `block_domain_filter=baidu.com` | 4 条 | 结果里**没有任何 baidu.com 域名** |
能读出三件事:
**第一,黑名单精确生效。** 屏蔽 `baijiahao.baidu.com` 后,基准组里那 6 条百家号一条不剩。
**第二,条数不补齐。** 基准组 10 条,屏蔽百家号后只剩 1 条,接口没有去找别的网页把 10 条凑满。这个行为容易误判成"接口出问题了"或者"网络有问题",其实是你把它筛得太干净了。写代码时不能假设 `count=10` 就一定有 10 条。
**第三,填父域名能盖住子域名。** 填 `baidu.com` 时,`baijiahao.baidu.com`、`baike.baidu.com` 这些子域名一并被排除,返回的 4 条结果里没有一个百度域名。这意味着你不需要把每个子域名都列进去——想清干净一个站,填主域名就行。
反过来,白名单填 `baidu.com` 能不能覆盖所有百度子域名,我没测。黑名单的行为已经验证了,白名单按对称逻辑应该一致,但这是推测,不算结论。你要用的话自己跑一次确认。
## 怎么组合用
三个参数可以同时传,逻辑上是"先按时间筛,再按域名筛":
```python
import requests
def search(query: str, appkey: str, allow: list[str] = None,
block: list[str] = None, recency: str = "week") -> list:
data = {"query": query, "count": "20", "search_recency_filter": recency}
if allow:
data["search_domain_filter"] = ",".join(allow) # 白名单
if block:
data["block_domain_filter"] = ",".join(block) # 黑名单
resp = requests.post(
"https://route.showapi.com/3351-1",
params={"appKey": appkey},
data=data,
timeout=10,
)
resp.raise_for_status()
result = resp.json()
if result.get("showapi_res_code") != 0:
return []
refs = (result.get("showapi_res_body") or {}).get("references") or []
# 过滤后条数会变少,别在这里报错,交给调用方判断
return refs
```
两种策略的取舍:白名单可控性强但容易搜不到东西,尤其冷门话题可能返回 0 条;黑名单更宽松,适合"排除几个已知的噪音源"这种需求。
**建议的做法是先黑名单跑一遍看结果,再决定要不要收紧成白名单。** 直接上白名单,很可能拿到空数组还不知道为什么。
## 边界与坑
**条数会明显少于 `count`。** 上面数据已经说明。业务代码里如果有"必须拿到 N 条才继续"的判断,加过滤后一定会频繁触发。
**上限差别很大。** 白名单 100 个、黑名单 20 个。想排除 30 个站点?做不到,只能改成白名单思路,或者接受超出的部分过滤不掉。
**域名格式不带协议头。** 传 `https://baike.baidu.com` 这种带协议的形式文档没示例,实测也没验证过。按文档示例写裸域名。
**中文域名与端口号未实测。** 文档没有相关说明,本次也没测。用常规英文域名最稳。
**过滤不是内容质量保证。** 白名单只保证来源域名,不保证那条内容本身相关。实测白名单组的 3 条 `authority_score` 都是 1,但那是这批数据的情况,不能当成通用规律。
## FAQ
**Q1:加了 `block_domain_filter` 之后只返回 1 条,是出 bug 了吗?**
不是。实测确实如此:屏蔽 `baijiahao.baidu.com` 后,原本 10 条里的 6 条百家号被剔除,剩下的不足 10 条,接口不会补齐。
**Q2:填 `baidu.com` 能屏蔽百家号和百度百科吗?**
能。实测 `block_domain_filter=baidu.com` 返回的 4 条结果里没有任何 baidu.com 域名,子域名被一并排除。
**Q3:两个参数能同时用吗?**
可以传,逻辑是先按白名单限定范围,再排除黑名单。但两个一起用很容易把自己筛到 0 条,建议分开试。
**Q4:白名单为什么能填 100 个,黑名单只能 20 个?**
这是文档给定的上限。具体设计原因文档没说,按上限用就行。
**Q5:多域名之间用什么符号分隔?**
英文逗号 `,`。文档示例是 `tieba.baidu.com,baike.baidu.com`。
**Q6:过滤后返回 0 条怎么办?**
先把过滤条件去掉确认查询词本身有结果,再逐步加回条件。白名单设得太窄是 0 条最常见的原因。
## 下一步阅读
- [百度搜索 API 时间过滤实测:四个档位分别返回什么日期的结果](https://www.showapi.com/guides/baidu-search-api-recency-filter-3351) —— 另一个结果控制参数
- [在 RAG 里接入百度搜索 API](https://www.showapi.com/guides/baidu-search-api-rag-agent-3351) —— 过滤出的结果怎么进模型上下文
- [百度搜索 API 计费与缓存](https://www.showapi.com/guides/baidu-search-api-billing-cache-3351) —— 过滤导致条数变少,缓存要重新设计
---
- **本系列共 8 篇**:查看[百度搜索 API 指南总目录](https://www.showapi.com/guides/baidu-search-guides-3351)