返回博客

DeepSeek Scraper API:将答案、推理和来源捕获为 JSON

Ava Wilson
Ava Wilson

Expert in Web Scraping Technologies

11-Aug-2026

TL;DR:

  • scraper.deepseek 扮演者向 DeepSeek 提交一个提示,并将答案作为 JSON 返回。 两个必需输入 — promptcountry — 进入;一个包含 21 个字段的 task_result 对象返回,包括渲染的 markdown、原始 html 和一个令牌计数。
  • 推理轨迹在有效负载中,并不隐藏。 发送 thinking: true,响应中获得一个 THINK 片段,包含 DeepSeek 的逐步规划文本以及它在这上面花费的时间。
  • 两个布尔标志改变响应的形状,而不仅仅是其内容。 thinkingsearch 各自添加片段类型;同时发送两个会使 DeepSeek 转入一个代理序列,搜索、打开各个页面,并在步骤之间重新规划。
  • 未知的输入键被接受并默默丢弃。 web_search, thinking_enabled, search_enabledmodel 都返回 HTTP 201,且不改变任何内容 — 而一个命名正确但类型错误的键将返回 400。从另一个扮演者移植捕获脚本,其标志会在进入时消失。
  • 根据您发送的标志,引用以三种不同编码到达。 普通搜索模式使用 [citation:N] 标记与 cite_index 进行匹配;代理模式使用 [reference:N] 标记与零基下标数组进行匹配。本指南展示了如何解决这两者。
  • 免费开始。 新的 Scrapeless 账户包括免费试用积分 — 在 app.scrapeless.com 注册。

介绍:答案只是有效负载的一半

搜索 DeepSeek 抓取 API,几乎所有你找到的内容都与将 DeepSeek 模型指向你已经获取的 HTML 相关。这确实是一种技术,而 Scrapeless 在 DeepSeek 网络抓取指南 中对此进行了介绍。本指南的方向相反:DeepSeek 是源头,而你想要的数据是 DeepSeek 在有人向它提问时所说的内容。

这些数据很重要,原因与 ChatGPT 和 Gemini 答案相同。当买家询问助手选择哪个工具时,答案和其背后的页面就是市场信号。DeepSeek 添加了其他助手不那么容易交出的两样东西:一个暴露的推理轨迹,以及 — 当你启用它的两个功能标志时 — 一个可见的记录,显示它选择打开并完整阅读了哪些页面。

scraper.deepseek 扮演者将所有这些转化为两个 HTTP 调用:一个用于提交提示,一个用于收集结果。本指南涵盖请求格式、从实时运行中捕获的完整响应架构、可运行的 Python 客户端以及有效负载所需的引用分辨逻辑和未记录的部分。


你可以用它做什么

  • 跟踪 DeepSeek 如何描述你的类别。 定期运行固定的提示集,并存储 markdown 答案及其背后的来源。
  • 捕捉得出结论的推理。 THINK 片段展示了 DeepSeek 在回答之前如何框定问题 — 当你关心 为什么 推荐某个产品时非常有用。
  • 测量引用份额。 在搜索模式下,有效负载携带每个 DeepSeek 检索的来源,包括标题、网址、网站名称和发布时间戳。
  • 将 DeepSeek 打开的页面与它仅列出但未打开的页面分开。 在代理模式下,TOOL_OPEN 片段记录了它完整阅读的特定 URL — 这是一个比搜索结果窄得多的集合。
  • 比较市场。 country 锁定运行的出口,因此相同的提示可以在多个地区被捕获并进行比较。
  • 构建答案数据集。 提示、答案、推理和来源作为每次运行的一个 JSON 对象到达,准备存储。

为什么选择 Scrapeless DeepSeek 抓取器

scraper.deepseek 扮演者属于 Universal Scraping API 线内的 LLM Chat Scraper 家族:

  • 一个提示进入,结构化的答案输出。 登录处理和流式重组在服务器端进行,因此你从未接触到未被构建为可解析的界面。
  • 片段流被保留。 推理、搜索查询、打开的页面和最终答案作为独立的类型对象到达,而不是一个平坦的字符串。
  • 国家固定的住宅出口。 运行通过 195 个以上国家的住宅代理进行路由;所需的 country 输入是整个配置。
  • 家族一致的合同。 端点、x-api-token 头和提交后收集的流程对于 ChatGPT、Gemini、Perplexity、Copilot 和 Grok 扮演者都是相同的。
    关于文档的说明:LLM Chat Scraper 快速入门 记录了共享任务流,并列出了该家族中的其他角色,但尚未提供 DeepSeek 页面。下文描述的每个字段和标志都是从对该角色的实时运行中捕获的,而不是从参考页面上读取的。

先决条件

  • 一个 Scrapeless 账户和 API 密钥 — 在 app.scrapeless.com 创建一个。
  • curljq 用于快速捕获,或用于客户端的 Python 3.10+。
  • 熟悉 HTTP 和 JSON。

将密钥保存在环境中,以便它永远不会到达您的源树:

bash Copy
export SCRAPELESS_API_KEY=your_api_token_here

DeepSeek Scraper API 的工作原理

该角色是异步的。您创建一个任务,然后收集它。

  • 提交: POST https://api.scrapeless.com/api/v2/scraper/request201 使用 {"status": "pending", "task_id": "..."}
  • 收集: GET https://api.scrapeless.com/api/v2/scraper/result/{task_id}202 使用 {"status": "running"} 在运行过程中,然后 200 以获取完整结果
  • Auth header: x-api-token: $SCRAPELESS_API_KEY

202 正在执行 HTTP 语义规范 为其定义的正是工作:请求已被接受,处理尚未完成,结果位于单独位置。在固定间隔内对该位置进行轮询,直到它回答 200。完成的结果保存五分钟,因此请及时收集或改为注册 webhook。

请求参数

输入字段 必填 类型 描述
prompt 字符串 要发送给 DeepSeek 的问题
country 字符串 运行的住宅出口的两字母国家代码,例如 US
thinking 布尔值 将 DeepSeek 的推理轨迹暴露为 THINK 片段
search 布尔值 允许运行检索实时网络来源并将其返回到有效负载中

两个必填字段在提交时进行验证。省略 country 将返回 400Key: 'deepseekParam.Country' Error:Field validation for 'Country' failed on the 'required' tag;省略 prompt 将为 Prompt 返回匹配消息。国家代码遵循 ISO 3166-1 alpha-2 标准

使用 curl 快速捕获

提交任务,轮询完成,并打印结构摘要:

bash Copy
TASK_ID=$(curl -sS -X POST https://api.scrapeless.com/api/v2/scraper/request \
  -H "Content-Type: application/json" \
  -H "x-api-token: ${SCRAPELESS_API_KEY}" \
  -d '{
    "actor": "scraper.deepseek",
    "input": {"prompt": "Explain how HTTP caching headers work.", "country": "US"}
  }' | jq -r '.task_id')
echo "task_id=${TASK_ID}"

for _ in $(seq 1 60); do
  BODY=$(curl -sS -H "x-api-token: ${SCRAPELESS_API_KEY}" \
    "https://api.scrapeless.com/api/v2/scraper/result/${TASK_ID}")
  echo "${BODY}" | jq -e '.status == "success"' >/dev/null 2>&1 && break
  sleep 4
done

echo "${BODY}" | jq -r '"status=" + .status,
  "fragments=" + ([.task_result.fragments[].type] | join(",")),
  "answer_chars=" + (.task_result.markdown | length | tostring),
  "tokens=" + (.task_result.accumulated_token_usage | tostring)'

响应信封

完成的收集调用返回一个普通的 JSON 文档,完全符合 JSON 交换格式标准 的定义,具有两个顶级键: statustask_result

json Copy
// illustrative sample — every key and type below is from live scraper.deepseek runs; long strings abridged
{
  "status": "success",
  "task_result": {
    "markdown": "To handle caching, an HTTP response carries…",
    "html": "<p class=\"ds-markdown-paragraph\">…</p>",
    "fragments": [
      {"type": "RESPONSE", "id": 2, "stage_id": 1, "content": "To handle caching…", "references": []}
    ],
    "accumulated_token_usage": 637,
    "thinking_enabled": false,
    "search_enabled": false,
    "search_triggered": false,
    "status": "FINISHED",
    "quasi_status": "FINISHED",
    "role": "ASSISTANT",
    "message_id": 2,
    "parent_id": 1,
    "conversation_mode": "DEFAULT",
    "inserted_at": 1786037083.6987588,
    "model": "",
    "feedback": null,
    "incomplete_message": null,
    "auto_continue": false,
    "ban_edit": false,
    "ban_regenerate": false,
    "has_pending_fragment": false
  }
}

逐字段:

字段 类型 它包含什么
task_result.markdown 字符串 按照 CommonMark 规范 的 Markdown 格式的答案 — 这是大多数管道需要的字段
task_result.html 字符串 作为渲染的 HTML 的相同答案,携带 DeepSeek 自己的 ds-markdown-* 类名
task_result.fragments[] 数组 生成答案的有序类型步骤流;请参见下一节
task_result.accumulated_token_usage 数字 运行中消耗的令牌
task_result.thinking_enabled 布尔值 反映是否请求了推理轨迹
task_result.search_enabled 布尔值 反映是否请求了实时检索
task_result.search_triggered 布尔值 检索是否确实运行
task_result.status / quasi_status 字符串 在完成的运行中都读取 FINISHED
task_result.role 字符串 ASSISTANT
task_result.message_id / parent_id 数字 对话中的位置;一个新的运行是在父级 1 下的消息 2
task_result.inserted_at 数字 带有小数秒的 Unix 时间戳
task_result.conversation_mode 字符串 DEFAULT 在每个捕获的运行上
task_result.model 字符串 在每个为本指南捕获的运行上都是空的,包括提供 model 输入的运行
task_result.feedback / incomplete_message null 保留;在完成的运行上 null
task_result.auto_continue, ban_edit, ban_regenerate, has_pending_fragment 布尔值 接口状态标志,在完成的运行上均为 false

model 视为不可用,而不是要读取的字段。如果您需要知道哪个配置生成了捕获,请记录您发送的标志与响应一起。

在免费计划上获取您的 API 密钥:app.scrapeless.com


片段流是详细信息所在

fragments 是将此参与者与普通聊天捕获分开的字段。您发送的标志会改变其长度和组成:

发送的标志 片段序列 您获得的内容
都没有 RESPONSE 仅答案
thinking: true THINK, RESPONSE 推理文本及其时长
search: true SEARCH, RESPONSE DeepSeek 发出的查询及其检索到的每个来源
都有 THINK, TOOL_SEARCH, THINK, TOOL_OPEN × N, THINK, RESPONSE 代理循环:规划、搜索、重新规划、打开单独页面、重新规划、回答

片段类型携带不同的密钥,这部分使得简单的解析器无法处理:

  • RESPONSEcontent, id, stage_id, type, referencescontent 是仍嵌入引用标记的答案。
  • THINK — 相同的密钥加上 elapsed_secs。在仅推理模式下,跟踪是一个长块;在代理模式下,它变为多个短的规划注释,位于工具调用之间。
  • SEARCHqueries(DeepSeek 生成的搜索字符串),results(来源),status,以及一个 content,它是 null。没有 stage_id
  • TOOL_SEARCHSEARCH 的代理模式等价物,添加了一个 stage_id
  • TOOL_OPENreference(指向突显 URL 的搜索片段的指针)和一个单一的 result 对象,代表打开的那个页面。没有 content,没有 references

每个来源对象 — 在 SEARCH.results, TOOL_SEARCH.results, 和 TOOL_OPEN.result — 都携带相同的八个密钥:title, url, snippet, site_name, site_icon, published_at, query_indexes, 和 cite_index

为本指南捕获的代理运行产生了 13 个片段:一个开场计划,一个 TOOL_SEARCH,运行了四个查询并返回了 38 个独特的 URL,八个 TOOL_OPEN 片段代表 DeepSeek 选择完全读取的页面,两个额外的规划注释,以及答案。TOOL_OPEN 集是有趣的——这八个 URL 是 DeepSeek 实际读取的,与它仅仅看到的 38 个不同。

这一推理行为显示的是在 DeepSeek-R1 强化学习论文 中描述的相同能力;参与者的贡献是将跟踪作为一个字段提供,而不是渲染面板。


在 Python 中集成 API

一个完整的客户端:提交、轮询完成,并按引用编号索引来源。

python Copy
# deepseek_client.py — submit a prompt to scraper.deepseek and collect the result
import os
import time

import requests

BASE = "https://api.scrapeless.com/api/v2/scraper"
HEADERS = {
    "Content-Type": "application/json",
    "x-api-token": os.environ["SCRAPELESS_API_KEY"],
}


def ask_deepseek(prompt, country="US", thinking=False, search=False, interval=4):
    created = requests.post(
        f"{BASE}/request",
        headers=HEADERS,
        json={
            "actor": "scraper.deepseek",
            "input": {
                "prompt": prompt,
                "country": country,
                "thinking": thinking,
                "search": search,
            },
        },
        timeout=60,
    )
    created.raise_for_status()
    task_id = created.json()["task_id"]

    while True:
        collected = requests.get(f"{BASE}/result/{task_id}", headers=HEADERS, timeout=120)
        if collected.status_code == 200:
            return collected.json()
        if collected.status_code != 202:
            raise RuntimeError(f"task {task_id} did not complete: {collected.text}")
        time.sleep(interval)


def sources_by_citation(result):
    """Every source the run produced, keyed by the cite_index used in the answer."""
    found = {}
    for fragment in result.get("fragments") or []:
        for source in fragment.get("results") or []:
            found[source.get("cite_index")] = source
        if fragment.get("result"):
            found[fragment["result"].get("cite_index")] = fragment["result"]
    return found


if __name__ == "__main__":
    payload = ask_deepseek(
        "What are the latest developments in fusion energy research?",
        search=True,
    )
    result = payload["task_result"]
    fragments = result.get("fragments") or []
    cited = sources_by_citation(result)
    print(f"status={payload['status']} search_triggered={result['search_triggered']}")
    print("fragments=" + ",".join(f.get("type", "?") for f in fragments))
    print(f"answer_chars={len(result['markdown'])} tokens={result['accumulated_token_usage']}")
    print(f"sources={len(cited)}")
    for index in sorted(k for k in cited if isinstance(k, int))[:3]:
        source = cited[index]
        print(f"  [citation:{index}] {source['site_name']} -> {source['url']}")

一个捕获的运行:

text Copy
status=success search_triggered=True
fragments=SEARCH,RESPONSE
answer_chars=7664 tokens=926
sources=11
  [citation:1] Lawrence Livermore National Laboratory (.gov) -> https://lasers.llnl.gov/news/llnl-experts-help-advance-inertial-fusion-energy-us-ife-conference
  [citation:2] Reuters -> https://www.reuters.com/business/energy/fusion-energy-developer-tae-signs-helium-3-future-fuel-supply-option-agreement-2026-08-05/
  [citation:3] Oak Ridge National Laboratory (.gov) -> https://www.ornl.gov/news/oak-ridge-national-lab-cleveland-clinic-and-ibm-achieve-first-known-computations-fusion?utm_source=Sutor-Group-Intelligence-and-Advisory&utm_medium=daily-links&utm_campaign=Substack

这些 [citation:N] 标签是嵌入在答案文本中的相同标记,因此打印的行已经是一个有效的引用索引。请注意第三个 URL —— 来源 URL 以 DeepSeek 遇到它们的方式到达,包括推荐跟踪参数,因此在按域分组捕获或去重之前需要进行标准化。

将调用切换到 thinking=True, search=True 将平坦的 SEARCH 片段替换为代理序列,并给您打开的页面集。该模式是推理跟踪存在的地方,也是负载最不可预测的地方 — 在您构建它之前,请查看接下来的两个部分。


解决引用

DeepSeek 在答案文本中标记其来源,标记格式取决于生成运行的标志。两种标志组合,三种编码,均已针对实时捕获进行确认:

仅搜索。 RESPONSE 片段的 content 携带 [citation:N] 标记,其中 N 匹配 cite_index 片段的条目 SEARCH 的字段。此模式下的顶级 markdown 执行相同信息的第二种编码:这些标记已经解析为内联 Markdown 链接。一个只需要可读文本的管道可以读取 markdown 并完全跳过连接。

同时思考和搜索。 标记变为 [reference:N],而 NRESPONSE 片段的 references 数组的零基索引 — 而不是一个 cite_index。该数组中的每个条目是形式为 {"id": 5, "type": "TOOL_OPEN"} 的回指,标识提供来源的片段。在此模式下,顶级 markdownRESPONSE 内容完全相同,包括标记,因此连接由您来处理。
第二种情况有一个值得了解的诚实限制,在你对此构建报告之前。一个TOOL_OPEN回指针是干净地解析的,因为那个片段恰好包含一个result,因此恰好一个URL。一个TOOL_SEARCH回指针则不是——它命名了一个包含数十个结果的片段,因此它告诉你该声明来自于搜索步骤,但未指明哪个来源。在一次代理捕获中,69个参考中有45个指向TOOL_OPEN片段并解析到特定的URL;剩下的24个则指向整个搜索片段。还请注意,cite_index在代理模式片段内的结果上是null,因此在这里不能作为后备使用。

实践结果:如果每个声明的来源属性是可交付的,则单独使用search: true,并使用cite_index。如果你想要推理轨迹和实际打开的页面列表,则同时使用这两个标志,并将引用绑定视为部分。


常见数据形状问题

  • 未知输入键被接受并在无声中被忽略。 发送web_search: truethinking_enabled: truesearch_enabled: truemodel: "deepseek-reasoner"都返回201并产生一个未设置标志且在有效负载中没有警告的运行。工作名称恰好是thinkingsearch。一个命名正确但类型错误的键表现不同——thinking: "true"作为字符串返回400 invalid params——因此API对其识别的键验证类型并丢弃其余部分。如果你正在移植一个ChatGPT捕获脚本,它的web_search标志将消失,每个DeepSeek答案将返回没有来源。
  • 不支持的国家在收集时失败,而不是在提交时失败。 country: "ZZ"返回一个正常的201,带有task_id;失败出现在收集调用时,表现为400,带有{"message": "execution failed", "status": "failed"}。在你这一方验证国家代码,而不是将提交状态视为确认。
  • markdownRESPONSE内容并不总是相同的字符串。 在仅搜索模式下,markdown更长,因为引用标记已扩展为链接。在其他所有模式中,两者匹配。选择一个字段并保持使用它。
  • references不是引用列表。 它是一个{id, type}回指针的数组,除非在代理模式下,否则它是空的。来源本身存在于搜索和开放片段中。
  • 片段键集按类型不同。 SEARCH包含queriesresults,但没有stage_idTOOL_OPENreference和一个单一的result但没有content。通过type读取片段,永远不要按位置读取。
  • 代理模式的变化远大于平面模式。 仅搜索运行在为本指南进行的每个捕获中都被返回为SEARCH, RESPONSE。在设置了两个标志的情况下,连续捕获相同提示打开了8、15和13个页面,回答长度从3,720到6,707个字符不等,并且多个运行直接从TOOL_SEARCHRESPONSE而未打开单个页面。如果你的管道需要打开的页面集,将一个空的视为普通结果,并阅读系列而不是单一运行。
  • 任务可以以失败状态结束,而它会在收集调用时显现。 少数代理运行以失败而不是成功完成;然后收集调用返回400而不是200,就像不支持的国家那样。上面的客户端会在继续之前检查一个202,并就其他任何事情抛出带有主体的错误,因此任务ID和服务器的消息都会到达你的日志。将失败的任务视为你数据集中记录的结果,而不是需要掩盖的东西。

伴随演员

终端、标头和提交后收集流程在整个系列中保持不变——只有演员名称及其平台特定输入发生变化:

  • scraper.chatgptpromptcountry,带有自己的web_search标志。
  • scraper.gemini — 相同的两个字段输入,返回答案加上引用数组。
  • scraper.perplexity — 必须的countryweb_search标志;返回网页结果和相关提示。
  • scraper.grok — 需要推理mode并返回开放网页和X引用作为独立数组;在Grok爬虫API指南中讨论。
  • scraper.copilotscraper.alexa — Copilot和Alexa答案在相同合同下显示。
    因为每个参与者对其标志的命名不同,因此应根据每个参与者保留输入构建器,而不是在它们之间共享一个字典。基于使用的定价方式为该线路提供,注册时附带免费试用积分,详情请见定价页面

结论:两次调用和一个值得仔细阅读的有效负载

捕获 DeepSeek 需要进行两次 HTTP 调用:POST { actor: "scraper.deepseek", input: { prompt, country } } 来创建一个任务,然后 GET 结果,直到它回答 200。答案在 markdown 中。使 DeepSeek 独特的所有内容 — 理由追踪、搜索查询、它打开的页面 — 都在 fragments 中,只有在你用 thinkingsearch 请求时才会出现。准确命名这两个标志,因为 API 会接受你发送的其他任何内容并默默忽略它。

准备好将 DeepSeek 答案捕获为数据吗?

加入我们的社区以获取免费计划,并与开发 AI 答案管道的开发者交流笔记:Discord · Telegram

app.scrapeless.com 注册以获取免费试用积分,并指向 scraper.deepseek 在你监控程序涵盖的提示和市场。

常见问题解答

Q: 如何验证 DeepSeek 抓取 API 请求?

每个调用都携带头部 x-api-token: <your key>,在提交请求和采集请求中都要使用。一个账户密钥覆盖 scraper.deepseek 和所有其他 Scrapeless 参与者。可以在 app.scrapeless.com 的免费计划上创建密钥。

Q: 为什么请求返回 task_id 而不是答案?

该参与者是异步的,因此提交返回 201{"status": "pending", "task_id": "..."},而答案则来自对 /api/v2/scraper/result/{task_id} 的第二次调用。该端点返回 202,包含 {"status": "running"},直到运行完成,然后返回 200 及完整的 task_result。完成的结果会保存五分钟;Webhook URL 是轮询的替代方案。

Q: 如何获取 DeepSeek 的推理追踪?

在输入中发送 "thinking": true。响应中会包含一个 THINK 片段,content 是推理文本,elapsed_secs 是在此上花费的时间。没有该标志,推理将不生成,thinking_enabled 会返回 false

Q: DeepSeek 抓取器是否返回来源和引用?

是的,当你发送 "search": true 时。来源以对象形式出现,包含 titleurlsnippetsite_namesite_iconpublished_atquery_indexescite_index,附加到 SEARCHTOOL_SEARCH 片段中。没有该标志,将不会检索任何来源,答案仅由模型生成。

Q: 为什么我的 web_search 参数没有效果?

因为那是 ChatGPT 参与者的参数名称。DeepSeek 的标志是 search,未知的键将被接受并用 201 丢弃而不产生错误。thinking_enabledsearch_enabledmodel 同样适用 — 请准确使用 thinkingsearch

Q: 哪些字段是空或可为 null 的?

model 在为本指南捕获的每次运行中都返回为空字符串,feedbackincomplete_message 在完成的运行中均为 null,而 references 除非运行使用了两个标志,否则是空的。search_triggered 在未请求 search 时保持 false。请谨慎阅读,将缺失的字段视为缺失,而非失败。

Q: 我可以在没有 SDK 的情况下运行吗?

可以。这是普通 HTTP —— curl、Python requests、Node fetch 或任何能够发送 JSON POST 和带有一个头的 GET 的客户端。

Q: 捕获 DeepSeek 答案是否合法?

该参与者捕获公开生成的答案内容,但规则因管辖区和平台服务条款而异。请审查适用条款并咨询法律顾问 for your use case,特别是在重新分发捕获内容之前,并且不要收集受 GDPR 或 CCPA 保护的个人数据。当你的管道用以获取 DeepSeek 引用的源 URLs 时,也要尊重每个网站上标准化的爬虫排除协议

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录