告别手动解析,Python 加 AI 让网页抓取更稳定

传统爬虫的"阿喀琉斯之踵"

做过网页抓取的朋友都有过这样的经历:好不容易写好了正则表达式或 CSS 选择器,脚本运行得完美无缺。然而,某天早上醒来,目标网站悄悄更新了前端框架,或者只是调整了商品价格的 DOM 结构,你的程序瞬间报错,返回一堆空值。这时候,你不得不重新打开浏览器开发者工具,定位新节点,修改代码,再次部署。这种"猫鼠游戏"在传统基于规则的爬虫开发中几乎无法避免,尤其是面对电商、新闻等高频变动的站点时,维护成本往往超过了开发成本。

问题的核心在于,传统爬虫依赖的是精确的结构匹配 ,而网页的本质是语义内容的呈现。当结构服务于呈现时,一旦呈现方式改变,结构就失效了。解决之道,在于引入"理解能力",让程序不再死记硬背"价格在第 3 个 div 的第 2 个 span 里",而是学会识别"这是价格"。这正是 Python 结合大语言模型(LLM)带来的范式转变。

从"规则匹配"到"语义理解"的工作流

新的解决方案并非完全抛弃 Python 生态,而是重新划分了职责边界。在这个架构中,Python 依然负责它最擅长的部分:网络请求、并发控制、重试机制以及数据持久化。而原本最脆弱、最耗时的 HTML 解析与字段提取环节,则交给了 AI 模型。

整个流程可以概括为三个步骤:获取与清洗语义提取验证与存储

首先,利用 requests 库获取页面源码。但这步之后,我们不再直接编写复杂的 XPath。相反,我们使用 BeautifulSoup 进行"降噪"处理。网页中大量的 <script><style> 标签以及无关的广告代码,不仅占用 Token,还会干扰模型的判断。通过简单的遍历删除这些噪声,我们能得到一个只保留核心文本和基础结构的"干净 HTML"。

接下来是关键一步:将清洗后的 HTML 作为上下文输入给大模型。我们需要设计一段清晰的 Prompt,告诉模型:"这是一段商品页面的 HTML,请从中提取商品名称、价格和货币单位,并以严格的 JSON 格式返回。"模型基于其强大的语义理解能力,能够忽略标签 class 名的变化,直接锁定内容含义。即使网站将价格从 <span class="price"> 改成了 <div data-val="price">,对人类来说这只是换了一种写法,对 AI 而言,语义未变,提取结果依然稳定。

实战:构建抗变的电商数据提取器

让我们通过一个具体的电商商品页抓取案例,看看代码是如何落地的。假设我们要抓取某演示站点的宝可梦商品信息。

环境准备与依赖安装

你需要安装基础的 HTTP 请求库、HTML 解析库以及大模型 SDK:

bash 复制代码
pip install requests beautifulsoup4 openai

核心代码实现

以下是一个完整的极简实现,展示了如何串联上述流程:

python 复制代码
import json
import re
import requests
from bs4 import BeautifulSoup
from openai import OpenAI

# 配置项
TARGET_URL = "https://scrapeme.live/shop/Bulbasaur/"
OUTPUT_FILE = "products.jsonl"
MAX_TOKENS_LIMIT = 120000  # 防止 HTML 过长超出模型限制

def fetch_and_clean_html(url):
    """获取页面并清洗噪声"""
    headers = {"User-Agent": "Mozilla/5.0 (compatible; AIScraper/1.0)"}
    response = requests.get(url, headers=headers, timeout=30)
    response.raise_for_status()
    
    soup = BeautifulSoup(response.text, "html.parser")
    
    # 移除脚本和样式标签,减少干扰
    for tag in soup(["script", "style", "noscript", "header", "footer"]):
        tag.decompose()
    
    # 获取 body 内容并压缩空白字符
    clean_text = re.sub(r"\s+", " ", soup.body.get_text(separator=" ", strip=True))
    return clean_text[:MAX_TOKENS_LIMIT]

def extract_with_ai(html_content):
    """调用 AI 模型进行结构化提取"""
    client = OpenAI() # 需配置 OPENAI_API_KEY 环境变量
    
    # 定义期望的 JSON 结构
    json_schema = {
        "type": "object",
        "properties": {
            "product_name": {"type": "string"},
            "price": {"type": "string"},
            "currency": {"type": "string"}
        },
        "required": ["product_name", "price", "currency"],
        "additionalProperties": False
    }

    response = client.chat.completions.create(
        model="gpt-4o", # 或其他支持 JSON Mode 的模型
        messages=[
            {"role": "system", "content": "你是一个数据提取助手。请从提供的 HTML 文本中提取商品信息,仅返回符合 Schema 的 JSON,不要包含 Markdown 标记或其他解释。"},
            {"role": "user", "content": f"URL: {TARGET_URL}\n\nHTML Content:\n{html_content}"}
        ],
        response_format={"type": "json_object", "schema": json_schema}
    )
    
    return json.loads(response.choices[0].message.content)

def main():
    try:
        # 1. 获取与清洗
        print("正在获取并清洗页面...")
        clean_html = fetch_and_clean_html(TARGET_URL)
        
        # 2. AI 语义提取
        print("正在调用 AI 进行语义分析...")
        data = extract_with_ai(clean_html)
        
        # 3. 持久化存储
        with open(OUTPUT_FILE, "a", encoding="utf-8") as f:
            f.write(json.dumps(data, ensure_ascii=False) + "\n")
            
        print(f"提取成功:{data}")
        
    except Exception as e:
        print(f"发生错误:{e}")

if __name__ == "__main__":
    main()

方案对比与优势分析

在这个例子中,如果网站明天将价格标签从 div.product-price 改为 span.cost-value,传统的 BeautifulSoup 或 Scrapy 代码必须修改选择器逻辑才能运行。而在上述 AI 方案中,只要页面上依然清晰展示了价格数字和货币符号,模型就能准确识别并输出 JSON,代码无需任何改动。

这种基于语义的提取方式,将开发者的精力从"维护选择器"转移到了"设计 Prompt"和"验证数据质量"上。虽然单次调用的成本略高于本地解析,但考虑到大幅降低的维护人力和时间成本,特别是在面对反爬策略复杂、页面结构频繁迭代的场景时,这种"以算力换稳定性"的策略显得尤为划算。

通过将 Python 的工程化能力与大模型的认知能力结合,我们不再是编写脆弱的规则脚本,而是在构建具备一定"容错性"和"适应性"的智能数据管道。这不仅是技术的升级,更是解决数据采集痛点的一种更优雅的思维路径。

相关推荐
财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年5月27日
人工智能·python·信息可视化·自然语言处理·ai编程·灵砚智能
盼小辉丶2 小时前
OpenCV-Python实战(24)——打造实时图像滤镜系统
人工智能·python·opencv·计算机视觉
wuxinyan1232 小时前
工业级大模型学习之路028:多智能体系统基础与双智能体协作
人工智能·python·学习
码界筑梦坊2 小时前
150-基于Python的中国海洋水质数据可视化分析系统
开发语言·python·信息可视化·django·毕业设计
稳如磐石.2 小时前
北京研华上架式工控机
大数据·人工智能·python
草莓啵啵~3 小时前
pywinauto-打开程序+连接已打开的程序
开发语言·python
lishi_199110 小时前
一键部署MoviePilotV2实现NAS全自动追剧
python·媒体·moviepilot
测试开发-学习笔记12 小时前
代码详细解释
python
u01196082312 小时前
ray-k8s部署
python