核心概念:从“规则提取”到“语义理解”
传统的爬虫解析依赖于 XPath、CSS Selector 或正则表达式。这些方法对网页结构的微小变动非常敏感(例如:div 层级变化或 class 名混淆)。
利用龙猫大模型进行解析,本质上是将 HTML 视为自然语言文本,利用大模型的语义理解能力,直接提取即使结构发生变化但语义未变的信息。
适用场景
- 结构多变的目标站:网页经常改版,传统选择器频繁失效。
- 抗反爬混淆:目标使用了 class 名动态随机化(如
class="abc_123"变class="xyz_999")。 - 非结构化提取:需要从大段文本中提取结构化字段(如从新闻正文中提取“事件时间”、“地点”、“人物”)。
实战流程
我们将使用 Python 获取网页,清洗后通过 API 发送给龙猫大模型,并强制要求返回 JSON 格式。
1. 准备工作 (ETL)
直接将整个 HTML 丢给大模型通常会超出 Token 限制且浪费成本。我们需要进行“瘦身”:
- 移除干扰项:
<script>,<style>,<svg>,<!-- comments -->通常不包含需提取的数据。 - 提取 Body:通常只保留
<body>内部的核心内容标签。
2. 构建 Prompt (提示词工程)
为了确保龙猫大模型返回标准的 JSON,我们需要:
- 定义 Schema:明确告诉模型你需要哪些字段,以及字段的类型。
- 约束输出:明确“只返回 JSON,不要包含 Markdown 代码块标记或其他废话”。
3. 代码示例
python
import requests
from bs4 import BeautifulSoup
import json
# 模拟调用龙猫大模型 API 的函数
def call_longmao_model(prompt, html_content):
"""
此处替换为实际的龙猫大模型 SDK 或 API 调用代码
"""
print("正在发送请求给龙猫大模型...")
# 假设模型返回了如下字符串
return '''
{
"articles": [
{
"title": "2026年Web爬虫新趋势",
"publish_date": "2026-01-15",
"author": "技术博主",
"summary": "本文探讨了AI在反爬虫对抗中的应用..."
}
]
}
'''
def clean_html(raw_html):
"""
清洗 HTML,移除无关标签以节省 Token
"""
soup = BeautifulSoup(raw_html, 'html.parser')
# 移除 script, style, svg 等无关标签
for script in soup(["script", "style", "svg", "head", "iframe"]):
script.decompose()
# 获取纯文本或保留部分结构的 HTML (视模型能力而定,通常保留 tag 有助于定位)
# 这里我们保留精简后的 HTML 结构
return str(soup.body)[:10000] # 截取前 10000 字符防止超长
def parse_with_ai(url):
# 1. 获取网页
headers = {'User-Agent': 'Mozilla/5.0'}
resp = requests.get(url, headers=headers)
# 2. 清洗数据
clean_content = clean_html(resp.text)
# 3. 构建提示词
schema_desc = """
请提取网页中的文章列表。返回格式必须是合法的 JSON,结构如下:
{
"articles": [
{"title": "文章标题", "publish_date": "发布日期", "author": "作者", "summary": "简短摘要"}
]
}
"""
prompt = f"""
你是一个专业的数据解析助手。请根据以下 HTML 内容,提取相关数据。
{schema_desc}
注意:
1. 只返回纯 JSON 字符串,不要使用 markdown 格式。
2. 如果找不到数据,返回空列表。
HTML 内容片段:
{clean_content}
"""
# 4. 调用模型
result_str = call_longmao_model(prompt, clean_content)
# 5. 解析 JSON
try:
data = json.loads(result_str.strip())
print("解析成功:", json.dumps(data, ensure_ascii=False, indent=2))
return data
except json.JSONDecodeError:
print("模型返回了非标准 JSON,可能需要重试或清洗")
return None
# 使用示例
if __name__ == "__main__":
parse_with_ai("https://example.com/news")优缺点分析 (SWOT)
| 维度 | AI 解析 (龙猫大模型) | 传统解析 (XPath/Regex) |
|---|---|---|
| :--- | :--- | :--- |
| 抗干扰性 | ✅ 极高 (不仅看结构,更懂语义) | ❌ 低 (结构一变就挂) |
| 开发效率 | ✅ 快 (无需逐个分析 DOM 树) | ❌ 慢 (需人工调试选择器) |
| 运行成本 | ❌ 高 (API 调用费用) | ✅ 低 (本地 CPU 计算) |
| 运行速度 | ❌ 慢 (网络 IO + 推理延迟) | ✅ 极快 (毫秒级) |
💡 最佳实践建议
- 混合模式:对于列表页(结构简单且量大),使用
XPath快速提取详情页 URL;对于详情页(内容杂乱、正文提取难),使用 AI 解析。 - 容错重试:如果 AI 返回的 JSON 解析失败,可以增加一个简单的“修复 Prompt”再次请求,或者使用正则表达式提取返回内容中的 JSON 部分。