大模型时代的爬虫新范式:基于 Prompt 的数据提取实践
随着人工智能技术的飞速发展,大型语言模型(LLM)在自然语言理解、代码生成及非结构化数据处理方面展现出了惊人的能力。最近在学习大模型相关知识时,我意识到 Prompt(提示词)工程不仅可以用于对话,还能高效地完成数据提取任务。如果让大模型直接处理 HTML 代码并输出结构化数据,传统的爬虫工程师是否还需要掌握复杂的 JS 逆向和 XPath 选择器?
一、案例演示:利用大模型提取豆瓣电影信息
为了验证这一想法,我们选取了豆瓣电影列表页面的 HTML 代码作为测试样本。传统爬虫需要编写 CSS 选择器或正则表达式来定位标题、评分、简介等字段,而使用大模型则只需提供清晰的指令。
1. 原始 HTML 片段
以下是从目标页面获取的部分 HTML 结构(已做简化处理):
<div class="indent">
<table width="100%" class="">
<tbody>
<tr class="item">
<td width="100" valign="top">
<a class="nbg" href="https://movie.douban.com/subject/34453198/" title="梦境">
<img src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2910694617.webp" width="75" alt="梦境" class="">
</a>
</td>
<td valign="top">
<div class="pl2">
<a href="https://movie.douban.com/subject/34453198/" class="">
梦境
/ <span style="font-size:13px;">仙境 / Wonderland</span>
</a>
<p class="pl">2024-06-05(韩国) / 汤唯 / 裴秀智 / ... / 剧情 / 爱情 / 科幻</p>
<div class="star clearfix">
<span class="rating_nums">6.4</span>
<span class="pl">(6899 人评价)</span>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
2. 设计 Prompt
我们编写了一个简洁的 Prompt,要求模型提取特定字段并以 JSON 格式返回:
这是一段电影列表 HTML 代码,请解析并提取以下信息:
1. 电影名 (name)
2. 封面链接 (picture)
3. 简介 (info)
4. 评分 (score)
5. 评论人数 (commentsNumber)
请使用小写英文单词作为属性名,以 JSON 数组的格式返回,不要包含其他解释性文字。
3. 执行结果
将 HTML 与 Prompt 发送给主流大模型(如国内主流模型或 ChatGPT 系列),均能准确提取出结构化数据:
[
{
"name": "梦境",
"picture": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2910694617.webp",
"info": "2024-06-05(韩国) / 汤唯 / 裴秀智 / ... / 剧情 / 爱情 / 科幻",
"score": "6.4",
"commentsNumber": "6899 人评价"
},
{
"name": "犯罪都市 4",
"picture": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2903301473.webp",
"info": "2024-02-23(柏林电影节) / ... / 动作 / 犯罪 / 惊悚",
"score": "6.6",
"commentsNumber": "23916 人评价"
}
]
二、技术分析与行业影响
1. 传统爬虫 vs 大模型爬虫
| 维度 | 传统爬虫 (XPath/CSS/JS 逆向) | 大模型辅助爬虫 |
|---|
| 开发难度 | 高,需熟悉 DOM 结构与反爬机制 | 低,主要依赖 Prompt 工程 |
| 维护成本 | 高,页面结构变动需重写规则 | 中,Prompt 可复用性强 |
| 准确率 | 极高(确定性逻辑) | 较高(存在幻觉风险) |
| 响应速度 | 快(毫秒级) | 慢(秒级至分钟级) |
| 成本 | 服务器资源为主 | API 调用费用 + Token 消耗 |
2. 对爬虫工程师的挑战
测试结果显示,对于非实时、非高频的结构化数据提取需求,大模型确实大幅降低了技术门槛。过去爬虫工程师需要花费大量时间研究 JS 逆向加密参数、Cookie 验证等复杂流程,而现在可能只需要关注如何获取干净的 HTML 内容以及优化 Prompt 质量。
但这并不意味着爬虫岗位会消失,而是角色发生了转变:
- 从'抓取者'转变为'数据治理者':重点在于如何清洗、校验大模型输出的数据准确性。
- 架构设计能力:需要设计混合架构,例如用传统爬虫处理基础列表页,用大模型处理详情页复杂内容。
- 成本控制:如何在保证效果的前提下降低 Token 消耗是新的核心指标。
三、Python 实战实现方案
虽然大模型降低了规则编写的难度,但自动化流程仍需通过代码串联。以下是一个基于 Python 的简易实现框架,展示了如何集成 HTTP 请求与大模型 API。
1. 环境准备
pip install requests openai
2. 核心代码示例
import requests
import json
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.example.com/v1"
)
def fetch_html(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers, timeout=10)
return response.text
def extract_with_llm(html_content):
prompt = """
这是一个电影列表的 HTML 片段,请提取每部电影的 name, picture, info, score, commentsNumber。
返回标准 JSON 数组格式,不要 Markdown 标记。
HTML:
{}""".format(html_content[:5000])
try:
completion = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
content = completion.choices[0].message.content
content = content.replace("```json", "").replace("```", "")
return json.loads(content)
except Exception as e:
print(f"Error: {e}")
return []
if __name__ == "__main__":
url = "https://movie.douban.com/top250?start=0"
html = fetch_html(url)
data = extract_with_llm(html)
(json.dumps(data, ensure_ascii=, indent=))
四、局限性与最佳实践
尽管大模型展现了强大的潜力,但在生产环境中直接使用仍存在风险。
1. 稳定性问题
大模型的输出具有概率性,偶尔会出现字段缺失或格式错误。建议在代码层增加健壮性校验,例如使用 Pydantic 进行数据模型验证,失败后触发重试机制。
2. 隐私与合规
在使用第三方大模型服务时,需注意数据隐私政策。敏感数据不应明文传输给公共 API。对于企业级应用,建议部署私有化大模型或使用支持数据不出域的云服务。
3. 性能优化
- 分片处理:HTML 内容过长可能导致超出 Token 限制,需按条目拆分发送。
- 缓存策略:相同 URL 的提取结果应缓存,避免重复调用 API。
- 混合模式:简单字段(如 ID、URL)优先用正则或 CSS 提取,复杂文本描述才调用大模型,以平衡成本与效率。
五、总结与展望
大模型正在重塑数据采集的技术栈。它并非要完全取代传统爬虫,而是提供了一种更灵活、更低成本的补充方案。未来的爬虫工程师需要同时具备网络协议知识、前端分析能力以及 AI 应用能力。
对于个人开发者而言,利用 LLM 快速构建原型、处理非标准化数据源已成为提升效率的关键技能。而对于企业,探索'传统爬虫 + 大模型'的混合架构,将是应对日益复杂的网页结构和海量数据需求的重要方向。无论技术如何演进,对数据的理解与价值挖掘始终是核心所在。