10 月 17 日上午,DeepSeek 在 API 文档里加了一个新栏目「网页搜索与抓取」:一个 Search API 负责按关键词搜网页,一个 Fetch API 负责把单个网页抓下来转成 Markdown。背后用的是 DeepSeek 自研的搜索引擎,鉴权和平时调模型用的是同一把 API Key。
我关心的是三件事:能不能直接拿来给自己的 Agent 或小工具接上联网,多少钱,坑在哪。下面按动手顺序写,代码都给了 curl 和 Python 两个版本。想先了解 Claude Code、Cursor、Codex 周边还有哪些工具可以搭配,可以先看本站的 AI 编程 Agent 生态全景。
本文的接口参数、价格和限速都来自 DeepSeek 官方文档,查阅时间 2026 年 10 月 18 日(北京时间)。价格以后可能调整,用之前请再看一眼官方价格页。
三句话说清楚它是什么
- Search:
POST https://api.deepseek.com/v1/tools/search,给一个搜索词,返回结构化的结果列表:标题、链接、短摘要、给模型读的长摘要、可选的网页正文、发布时间、相关度分数、权威度。一次最多 50 条。 - Fetch:
POST https://api.deepseek.com/v1/tools/fetch,给一个网址,返回网页标题和 Markdown 格式的正文。 - 计费:两个接口都按「成功请求次数」收费,每 1000 次 0.75 美元(中文价格页写的是 5 元)。失败、搜不到结果、超时都不收钱。
它们是「原始 JSON 接口」,不是聊天模型。你搜到什么、抓回什么、怎么喂给模型,都由你自己的代码决定。
谁用得上,谁不用管
用得上的:
- 自己写 Agent、RAG 应用、Telegram/微信机器人的人,想给模型加「先上网查一下」的能力;
- 原来用 Bing Search API 的人。微软已经在 2025 年 8 月 11 日停掉了 Bing Search API,一直没找到顺手替代的,可以试这个;
- 已经在用 DeepSeek API 的人,不用再注册一家搜索服务、再管一把密钥。
不用管的:
- 只在网页版或 App 里和 DeepSeek 聊天的人。这是开发者接口,网页版的联网搜索跟它没关系;
- 在 Claude Code、Codex、DeepSeek Harness 里把 DeepSeek 当后端模型用的人,暂时也不用自己调。官方说明,这些工具里的服务端工具调用已经会走 Search / Fetch,目前不收费,北京时间 2026 年 11 月 1 日 00:00 起按次计费。如果你是用 Magpie 这类本机网关给 Claude Code 换成 DeepSeek,11 月以后留意一下账单里多出来的搜索费用。
准备:一把 Key,一点余额
- 登录 DeepSeek 开放平台(platform.deepseek.com),在「API keys」页面新建一把 Key。已经有 Key 的直接用,Search / Fetch 不需要单独开通。
- 账户里要有余额。余额不足时接口会返回 HTTP 402。官方的扣费规则是先扣赠送余额,再扣充值余额。
- 把 Key 放进环境变量,别写死在代码里:
export DEEPSEEK_API_KEY="sk-你的key"
第一次搜索
先用 curl 试一下,搜 5 条,顺便要网页正文:
curl https://api.deepseek.com/v1/tools/search \
-H "Authorization: Bearer $DEEPSEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "DeepSeek API 网页搜索 site:api-docs.deepseek.com",
"count": 5,
"need_content": false
}'
返回的 results 里,每一条大概长这样(字段名照官方文档):
{
"rerank_score": 2.4,
"title": "……",
"url": "https://……",
"snippet": "100~200 字符的短摘要,适合显示在界面上",
"summary": "600~800 字符的长摘要,适合直接喂给模型",
"content": "",
"site_name": "……",
"site_icon": "https://……/favicon.ico",
"date": "2026-10-17T09:00:12+00:00",
"authority": 3
}
有几个字段值得多看一眼:
rerank_score:0~3 分,综合相关性、权威性、时效性,1.5 分以上官方称为优质结果;authority:0~4,3 以上是很权威的来源,-1表示未知;summary:已经是围绕你的搜索词提炼过的长摘要。很多问题只看summary就够了,不一定要再抓全文;date:统一是 UTC 时间,换成北京时间要加 8 小时。
请求参数
| 参数 | 必填 | 说明 |
|---|---|---|
query |
是 | 搜索词,1~128 个字符,不能全是空白;支持下面的搜索语法 |
count |
否 | 返回条数,1~50,默认 10。条数不影响价格 |
ori_question |
否 | 触发这次搜索的用户原始问题,1~128 个字符,帮助理解搜索意图 |
localization |
否 | 一个 IP 地址,用来优先返回当地的结果,默认空字符串 |
need_content |
否 | 是否在 content 里返回网页正文,默认 false |
注意一点:请求里不认识的字段会被直接忽略,不会报错。比如你把 count 写成 num,接口照样返回默认的 10 条,你不会收到任何提示。
搜索语法速查
搜索词原样转给搜索引擎,下面这些语法可以混着用:
| 写法 | 例子 | 作用 |
|---|---|---|
site: |
DeepSeek site:github.com |
只搜某个网站;多个网站用 OR 连接:site:github.com OR site:huggingface.co |
-site: |
DeepSeek -site:example.com |
排除某个网站 |
-词 |
DeepSeek -广告 |
排除含这个词的页面 |
"..." |
DeepSeek "Search API" |
精确匹配短语 |
-"..." |
DeepSeek -"release notes" |
排除含这个短语的页面 |
lang: |
DeepSeek lang:zh,en |
限定语言 |
after: / before: |
DeepSeek after:2026-10-01 |
只要某个日期之后 / 之前发布的页面 |
lang:、after: 这两个我觉得最实用:做新闻类问答时加一个 after:,能少很多过期内容。
抓一个网页:Fetch
Fetch 只有一个参数 url:
curl https://api.deepseek.com/v1/tools/fetch \
-H "Authorization: Bearer $DEEPSEEK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://api-docs.deepseek.com/zh-cn/guides/search"}'
返回很简单:
{
"title": "页面标题",
"content": "# 页面标题\n\n正文的 Markdown……"
}
限制和规则:
- 网址最长 8192 个字符,必须是带域名的 http / https 地址,不能在网址里带用户名密码;
- 能不能抓到取决于目标网站本身。官方的说法是 Fetch 受目标站点可用性和访问策略约束:被安全策略拒绝返回 403,网址打不开、被站点策略挡住、内容类型不支持、抽不出正文,都返回 404;
- 404 不收费(没有返回正文就不算成功请求),所以批量抓的时候不用太担心废请求的成本。如果目标站点抓不到,或者需要按自己的规则批量采集,也可以用开源的 Python 爬虫库 Scrapling 自己写(记得遵守 robots.txt 和站点条款)。
Python:把两个接口包成函数
只用 requests,不需要额外 SDK。下面这份我加了一个最简单的重试:官方建议只对 408、429 和 5xx 等待重试,其他 4xx 改了请求再说。
import os
import time
import requests
KEY = os.environ["DEEPSEEK_API_KEY"]
BASE = os.environ.get("DEEPSEEK_BASE_URL", "https://api.deepseek.com")
HEADERS = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}
def call(path, body, timeout=60, retries=3):
for i in range(retries):
r = requests.post(BASE + path, headers=HEADERS, json=body, timeout=timeout)
if r.status_code in (408, 429) or r.status_code >= 500:
time.sleep(2 ** i) # 1s、2s、4s 递增等待
continue
return r
return r
def search(query, count=10, question=None, need_content=False):
body = {"query": query[:128], "count": count, "need_content": need_content}
if question:
body["ori_question"] = question[:128]
r = call("/v1/tools/search", body)
r.raise_for_status()
return r.json()["results"] # 没有结果时是空列表,也不收费
def fetch(url):
r = call("/v1/tools/fetch", {"url": url})
if r.status_code in (403, 404): # 被拒绝或抓不到正文
return None
r.raise_for_status()
return r.json() # {"title": ..., "content": ...}
if __name__ == "__main__":
for item in search("DeepSeek Search API lang:zh after:2026-10-01", count=5):
print(f"{item['rerank_score']:.1f} {item['title']}\n {item['url']}")
实战:先搜、再抓、再让 DeepSeek 回答
这是最常见的「联网问答」流程,也就是一个最小的 RAG:
- 用 Search 找到相关网页;
- 挑分数高的前 3 条,用 Fetch 抓全文(抓不到就退回用
summary); - 把资料和问题一起交给
deepseek-flash,要求它只根据资料回答,并标出处。
接着上面那份代码往下写:
def ask(question):
hits = search(question, count=8, question=question)
good = [h for h in hits if h["rerank_score"] >= 1.5][:3] or hits[:3]
if not good:
return "没搜到相关资料。"
docs = []
for i, h in enumerate(good, 1):
page = fetch(h["url"])
text = page["content"][:6000] if page else h["summary"]
docs.append(f"[{i}] {h['title']}\n{h['url']}\n{text}")
messages = [
{"role": "system", "content": "只根据给出的资料回答,用中文。"
"每个结论后面用 [编号] 标出处;资料里没有的就说不知道。"},
{"role": "user", "content": "资料:\n\n" + "\n\n---\n\n".join(docs)
+ f"\n\n问题:{question}"},
]
r = requests.post(BASE + "/chat/completions", headers=HEADERS, timeout=120, json={
"model": "deepseek-flash",
"messages": messages,
"thinking": {"type": "disabled"}, # 简单问答关掉思考模式,更快也更省
"stream": False,
})
r.raise_for_status()
return r.json()["choices"][0]["message"]["content"]
print(ask("DeepSeek 的 Search API 怎么收费?"))
几点说明:
- 模型名用的是
deepseek-flash。DeepSeek 现在的文档里推荐的模型名就是它,对应 DeepSeek-V4.1-Flash(10 月 17 日已更新到 1017 版,改了什么见 DeepSeek V4.1 Flash 1017 更新问答);需要更强推理可以换成deepseek-v4-pro; deepseek-flash默认开启思考模式,上面用"thinking": {"type": "disabled"}关掉了。复杂问题可以去掉这一行;[:6000]是按字符粗暴截断,防止一个超长页面把上下文和费用撑上去。正式用的话,最好按段落切块再挑相关的段落;- 搜索词直接用了用户的问题。问题很长时会被截到 128 个字符,更好的做法是先让模型把问题改写成几个关键词,再去搜。
这一套跑一次,搜索加抓取最多 4 次请求,按 0.75 美元 / 千次算是 0.003 美元,大头其实是模型的 token 费用。
算笔账:价格、限速和免费期
| 项目 | Search | Fetch |
|---|---|---|
| 价格 | 每 1000 次成功请求 0.75 美元 / 5 元 | 每 1000 次成功请求 0.75 美元 / 5 元 |
| 什么算成功 | HTTP 200 且 results 不为空 |
HTTP 200 且返回了页面正文 |
| 不收费 | 失败、空结果、超时 | 失败、抓不到正文、超时 |
| 账号限速 | 5 QPS | 5 QPS,另有按域名的限速 |
再补几条容易误会的地方:
- 按次收费,跟
count无关。要 1 条还是 50 条,都是一次请求的钱,需要多一点结果就别省着; - 限速按账号算,不按 Key 算。你开 10 把 Key 也还是每秒 5 次,超了返回 429。Search 和 Fetch 各算各的,互不占用,和模型的并发限制也是分开的;
- 模型的峰谷电价不适用于这两个接口。DeepSeek 模型在北京时间工作日 9:00-12:00、14:00-18:00 是高峰价,其他时间半价;Search / Fetch 是固定按次价;
- 免费期只针对特定场景:在 DeepSeek Harness、Claude Code、Codex 里用 DeepSeek API 时,服务端自动触发的 Search / Fetch 调用,北京时间 2026 年 11 月 1 日 00:00 前不收费。你自己写代码直接调接口,从上线起就按次计费。
和其他搜索 API 比一比
下面是几家常被拿来给 AI 接搜索的服务,价格都取自各家官网,查阅于 2026 年 10 月 18 日。各家的计费单位不完全一样,我把它们折算成「每 1000 次基础搜索」方便对比:
| 服务 | 基础搜索价格(每 1000 次) | 抓网页正文 | 免费额度 | 备注 |
|---|---|---|---|---|
| DeepSeek Search / Fetch | 0.75 美元(5 元) | Fetch 0.75 美元 / 千次 | 没有常规免费额度 | 自研索引,5 QPS,一次最多 50 条 |
| Brave Search API | 5 美元 | 搜索结果里可带额外摘要;另有 LLM Context 接口 | 预付费,注册需要信用卡 | 自有索引,搜索档 50 QPS |
| Tavily | 按量 0.008 美元 / 积分,基础搜索 1 积分,约 8 美元 | Extract:每 5 个网址 1 积分 | 每月 1000 积分 | 包月档每积分 0.005~0.0075 美元 |
| Exa | instant 模式 4 美元,fast / auto 7 美元(含 10 条,多 1 条另加 1 美元 / 千条) | Contents 1 美元 / 千页 | 每月 10 美元额度 | 有 Deep Search 等高级档 |
| Serper | 0.30~1.00 美元,看一次买多少 | 不提供 | 注册送 2500 次查询 | 返回的是 Google 搜索结果,额度 6 个月有效 |
| Bing Search API | 已于 2025 年 8 月 11 日停用 | — | — | 微软建议改用 Azure AI Agents 里的 Grounding with Bing Search |
单看价格,DeepSeek 和 Serper 最便宜的档位在一个水平,比 Brave、Tavily、Exa 便宜好几倍。但价格只是一部分:
- 结果质量我没有做系统测试,这张表不代表谁搜得更准。Brave 官网就在强调「总成本 = 搜索费 + 为了答对多花的 token」;
- Serper 卖的是 Google 的搜索结果页数据,Brave、DeepSeek 用的是自家索引,来源性质不同;
- DeepSeek 的 5 QPS 对个人项目足够,要做面向很多用户的产品就偏紧,Brave 搜索档是 50 QPS。
我的建议是:个人项目、已经在用 DeepSeek 模型的,直接用 DeepSeek 这套,一把 Key 管到底;对结果质量要求高的业务,拿自己的真实问题在两三家之间各跑几十条对比一下再定。
几个坑,先说在前面
localization传的是 IP 地址。如果你把终端用户的 IP 传过去换本地化结果,等于把用户 IP 交给了 DeepSeek,面向用户的产品要在隐私政策里写清楚;query只有 128 个字符。别把整段用户输入塞进去,超了直接 400;- 参数写错不报错。上面说过,未知字段会被忽略,调不出预期效果时先检查字段名拼写;
- 抓取会撞上网站的规矩。Fetch 除了账号级 5 QPS,还有按域名的限速,对同一个网站连续猛抓会收到 429;有些网站本身就不允许抓取,返回 404 是正常的;
need_content: true会让响应变大。只需要判断相关性时,用summary就够,确定要用的页面再单独 Fetch;- 长内容先截断再给模型。网页正文动辄几万字,不截断的话,token 费用会远超搜索费。如果你在编程 Agent 里大量用搜索和抓取,可以配合 Context Mode 这类省上下文的工具;
- 11 月 1 日之后的 Agent 账单。在 Claude Code、Codex 里用 DeepSeek 后端的,自动触发的搜索从那天起开始收费,跑长任务前心里有个数。
写在最后
这次 DeepSeek 做的事情不复杂:把自家的搜索和抓取能力拆成两个按次收费的接口,价格压得很低,鉴权沿用原来的 Key。对已经在用 DeepSeek 模型的开发者来说,接入成本几乎为零,自己写个联网问答机器人,几十行代码就能跑起来。
搜索质量到底怎么样,还要等大家用一段时间再看。另外,想要一个完全开源、能自己换模型和工具的编程 Agent,可以看看 OpenCode 2.0,它和 DeepSeek 的接口也能配合使用。


