技术博客
百度搜索 API 域名过滤只需两个参数:白名单与黑名单的实测边界

百度搜索 API 域名过滤只需两个参数:白名单与黑名单的实测边界

作者: 万维易源
2026-09-15
百度搜索域名过滤信源控制参数详解
# 百度搜索 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)