Skip to content

核心概念:从“规则提取”到“语义理解”

传统的爬虫解析依赖于 XPathCSS 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 + 推理延迟)✅ 极快 (毫秒级)

💡 最佳实践建议

  1. 混合模式:对于列表页(结构简单且量大),使用 XPath 快速提取详情页 URL;对于详情页(内容杂乱、正文提取难),使用 AI 解析
  2. 容错重试:如果 AI 返回的 JSON 解析失败,可以增加一个简单的“修复 Prompt”再次请求,或者使用正则表达式提取返回内容中的 JSON 部分。
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.7.1