DeepSeek 网络数据抓取:将 Table-Soup HTML 转换为干净的 JSON
Scraping and Proxy Management Expert
TL;DR:
- DeepSeek 是预算提取引擎,在杂乱标记中赢得了这个称号。 本指南中的现场操作从一个嵌套表格页面中提取了10条结构化记录——文本、作者、标签列表——总共消耗了3,397个标记,使用的模型每百万输入标记的价格不到一毛钱。
- API 只需替换
base_url。 DeepSeek 的端点与 OpenAI 兼容:官方 OpenAI Python SDK 指向https://api.deepseek.com,并开启 JSON 模式,就是整个集成。 - 模型名称最近有所变动——大多数教程已过时。 当前模型为
deepseek-v4-flash和deepseek-v4-pro;熟知的deepseek-chat和deepseek-reasoner名称自2026年7月24日起已被弃用。 - 模型仍然无法进行抓取。 渲染、会话和访问挑战属于抓取层;本指南中每个页面通过 Scrapeless 通用抓取 API 发送一次 POST 请求。
- 还没有 DeepSeek 密钥?相同的请求可以通过 OpenRouter 运行。 本指南在
deepseek/deepseek-v4-flash上实时执行,并显示了捕获的输出。 - 抓取方面免费开始。 在 app.scrapeless.com 创建你的 Scrapeless API 密钥。
DeepSeek 能否抓取网站?
DeepSeek 可以读取页面;但不会检索页面。API 接收你已经获取的文本并返回你指定的字段——因为它的每个标记价格在市场底部,所以当提取需要跨越很多页面时,它是人们选择的模型。抓取这些页面、渲染它们的 JavaScript,以及应对它们的访问控制属于一个独立的层,没有任何聊天补全端点提供。
DeepSeek 的优势在于你最不想手动解析的标记。语义 HTML 对选择器友好;但实际页面通常并非如此。本指南的演示目标是一个完全用嵌套表渲染的名言页面——数据单元格、名言文本、作者和标签交错排列,每行都是这种结构,使得选择器逻辑变成行计数算术,下一次重新设计时就会失效。语言模型不会在意:它像人一样读取该表。
计划:使用受控的抓取层一次性抓取表格页面,然后让 DeepSeek 返回干净的 JSON。如果你对更广泛的工具类别感兴趣,可以查看 LLM 抓取器解释 和 LLM 抓取器排名列表。
安装
一个 SDK 同时覆盖原生路径和聚合器路径,同时还需 requests 用于抓取:
bash
pip install "openai==2.34.0" requests
配置
bash
export DEEPSEEK_API_KEY="sk-your_deepseek_key"
export SCRAPELESS_API_KEY="sk_your_scrapeless_key"
抓取无人愿意解析的页面
目标是一个用于抓取练习的公共名言网站的基于表格的呈现。一次 POST 请求至 通用抓取 API ,由服务器处理渲染和解锁:
python
# fetch_tableful.py — 通过 Scrapeless 检索表格页面
import os
import requests
resp = requests.post(
"https://api.scrapeless.com/api/v1/unlocker/request",
headers={
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
},
json={
"actor": "unlocker.webunlocker",
"input": {"url": "https://quotes.toscrape.com/tableful/", "method": "GET"},
},
timeout=120,
)
resp.raise_for_status()
html = resp.json().get("data", "")
print(f"抓取了 {len(html):,} 个字符")
print("表格元素:", html.count("<table"), "| 表格行:", html.count("<tr"))
with open("page.html", "w", encoding="utf-8") as f:
f.write(html)
该运行打印了一个 <table> 和 22 个 <tr> 行,概念上对应于十条带标签的记录——名言行和标签行交替呈现,正是 HTML 表格规范 所允许的形状,而选择器作者则对此深感恐惧。
基本实现:将 DeepSeek 作为提取器
集成是OpenAI SDK与两个DeepSeek特定值:基础URL和模型名称。JSON模式(response_format={"type": "json_object"})和temperature=0使输出可解析且稳定——这些参数在DeepSeek API参考中有文档说明。使用当前的模型名称:deepseek-v4-flash用于提取工作,deepseek-v4-pro当你真正需要更多模型时;较早的deepseek-chat和deepseek-reasoner名称自2026年7月24日起已被弃用。
注意:此块需要一个带有信用的
DEEPSEEK_API_KEY——本指南并未假设的唯一先决条件。下一部分通过OpenRouter以实时方式运行相同的提取,并捕获输出。
python
# extract_deepseek.py — 原生DeepSeek提取(需要DEEPSEEK_API_KEY)
import json
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.deepseek.com",
api_key=os.environ["DEEPSEEK_API_KEY"],
)
page_html = open("page.html", encoding="utf-8").read()
completion = client.chat.completions.create(
model="deepseek-v4-flash",
temperature=0,
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": '从这个基于表格的页面提取每个引用。回复仅限JSON: '
'{"quotes":[{"text":str,"author":str,"tags":[str]}]}.',
},
{"role": "user", "content": page_html},
],
)
data = json.loads(completion.choices[0].message.content)
print(f"从表格标记提取了 {len(data['quotes'])} 个引用")
没有行算术,没有兄弟轴XPath——架构命名输出,模型进行读取。
没有DeepSeek密钥?通过OpenRouter运行
由于这两个接口都是OpenAI形式,聚合器变体通过两个字符串有所不同。这是本指南实际执行的版本,获取和提取在一个自包含脚本中进行:
python
# extract_openrouter.py — 通过OpenRouter执行相同的提取
import json
import os
import requests
from openai import OpenAI
resp = requests.post(
"https://api.scrapeless.com/api/v1/unlocker/request",
headers={
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
},
json={
"actor": "unlocker.webunlocker",
"input": {"url": "https://quotes.toscrape.com/tableful/", "method": "GET"},
},
timeout=120,
)
resp.raise_for_status()
page_html = resp.json().get("data", "")
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.environ["OPENROUTER_API_KEY"],
)
completion = client.chat.completions.create(
model="deepseek/deepseek-v4-flash",
temperature=0,
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": '从这个基于表格的页面提取每个引用。回复仅限JSON: '
'{"quotes":[{"text":str,"author":str,"tags":[str]}]}.',
},
{"role": "user", "content": page_html},
],
)
data = json.loads(completion.choices[0].message.content)
print(f"从表格标记提取了 {len(data['quotes'])} 个引用")
print(json.dumps(data["quotes"][0], ensure_ascii=False))
实时运行从表格中提取了所有10条记录,第一个是:
text
从表格标记提取了10个引用
{"text": "我们创造的世界是我们思考过程的结果。没有改变我们的思维就无法改变它。", "author": "阿尔伯特·爱因斯坦", "tags": ["改变", "深度思考", "思考", "世界"]}
标签作为数组返回,尽管页面将它们与引用本身分开渲染——模型将每个标签行与其上面的引用行关联,这正是选择器脚本需要手动编码的连接。整个调用:3,397个令牌。
在免费计划中获取你的API密钥:app.scrapeless.com
高级模式
- 为值得使用的页面保留模型。 DeepSeek按照令牌的价格相对便宜,而选择器脚本仍然更便宜:免费。将干净、稳定的布局路由到生成后再审查的选择器代码,并将模型调用花费在表格杂烩、易于重设计的和长尾上。
- 在你知道时说明行语义。 在此页面上提示不需要,但在更复杂的表格中,一句话——“每个记录跨越两行:数据,然后是标签”——比更大型模型更便宜地购买准确性。
- 每次调用保留一个页面,并在Python中循环。 页面边界即记录边界;提示侧批处理会模糊它们。
- 关注弃用日历。 固定的模型名称会过时。
deepseek-chat服务持续了很长时间,并在2026年7月24日停止——将模型ID放在配置中,而不是在十个脚本中。
故障排除
model_not_found或类似的错误在本土端点上。 您可能正在发送一个已弃用的模型名称;请更换为deepseek-v4-flash或deepseek-v4-pro。- 使用散文而非 JSON。 JSON 模式已关闭 — 设置
response_format={"type": "json_object"}并在系统消息中保留模式。 - 记录合并或标签落在错误的引用上。 将行语义句子添加到系统消息中,并检查获取的 HTML 是否确实包含您期望的行,以匹配抓取脚本的计数方式。
- 输出在运行之间有所不同。
temperature=0。提取是一个抄写任务,而不是写作任务。
结论
DeepSeek 的提取层案例是算术加容忍:市场底部的代币价格,以及不惧惩罚选择逻辑的加价。表格汤演示是证据 — 从匿名的 <tr> 行中正确连接的标签数组中获得 10 条记录,总计 3,397 个代币。模型无法提供的是页面本身,已渲染并可达;每个页面一个服务器端的 POST 覆盖了这一部分,两个层次共同构成了一个几乎不需要运行成本和维护的抓取器。
准备好为 DeepSeek 提供真实页面了吗?
这里的抓取层是 通用抓取 API — 计划和请求量见 定价页面,每个 unlocker.webunlocker 参数在 开发者文档 中都有说明。您可以在 app.scrapeless.com 的免费计划上创建一个密钥,两个脚本可以按预期运行。
常见问题
问:DeepSeek 能单独抓取网站吗?
不能。DeepSeek API 是一个语言模型端点:它从您提供的文本中提取内容,无法发出请求,呈现 JavaScript 或维持会话。每一个有效的 DeepSeek 抓取设置都将其与返回忠实页面内容的抓取层配对。
问:我应该使用哪个 DeepSeek 模型进行网页抓取?
使用 deepseek-v4-flash 进行提取 — 本指南中使用的实时运行使用了它,并返回了所有 10 条记录和正确的标签连接。只有在干净输入仍然产生错误字段的情况下,才考虑使用 deepseek-v4-pro。在新代码中避免使用已弃用的 deepseek-chat 和 deepseek-reasoner 名称。
问:为什么使用 DeepSeek 而不是更大名气的模型进行提取?
以相同的充分性计算价格。以 temperature=0 限定模式提取是一个大多数当前模型可以完成的有界任务;当它们都通过时,成本最低的模型胜出。这里的测量运行在每百万输入代币不到十分之一的模型定价下成本为 3,397 个代币 — 在这种情况下,提取不再是管道中昂贵的部分。
问:在何种情况下选择器脚本仍然比 DeepSeek 更好?
当布局干净、稳定且高数量时。经过审核的选择器脚本每页永久不收费;模型调用每次都消耗代币。有效的拆分:选择器用于目标的稳定核心,DeepSeek 用于复杂的标记和不断变化的布局。
问:使用 DeepSeek 抓取是否合法?
提取模型不会改变采集规则。仅抓取公共页面,尊重网站条款和按机器人排除协议标准化的 robots 指令,保持数量限制,并根据适用法律处理任何个人数据 — 加上 DeepSeek 在模型端的使用条款。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



