首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >告别脆弱的 CSS 选择器:python用 AI 构建自适应智能爬虫

告别脆弱的 CSS 选择器:python用 AI 构建自适应智能爬虫

原创
作者头像
用户12818508
发布于 2026-11-04 17:34:32
发布于 2026-11-04 17:34:32
1580
举报

传统爬虫的核心痛点在于脆弱性。你精心编写的 div.content > span.price 选择器,在网站前端一次不经意的重构后就会彻底失效。即便使用了 Playwright 或 Selenium 应对动态渲染,元素定位逻辑依然依赖于固定的 DOM 结构。

大语言模型(LLM)的介入,正在改变这一局面。AI 爬虫不再“死记硬背”标签路径,而是像人类一样理解页面语义,甚至在结构变更时实现“自愈”。本文将拆解三种结合 AI 的智能爬虫实现范式,并提供可落地的 Python 代码思路。

范式一:语义提取——用 Prompt 替代选择器

最直接的 AI 融合方式是让模型直接读取清洗后的页面文本或精简 HTML,根据你的自然语言描述或 JSON Schema 输出结构化数据。你不再关心数据在哪个 div 里,只关心“我要什么”。

以开源库 websense 为例,它的设计哲学是“语义理解优先”。你只需提供一个示例或 Schema,它就能自动完成抓取、清洗和解析。

代码语言:javascript
复制
from websense import Scraper

scraper = Scraper(model="gpt-4o-mini")

# 不需要写任何 CSS 选择器
data = scraper.scrape(
    "https://wl.jogonsoft.com",
    example={
        "product_name": "string",
        "price": 0.0,
        "in_stock": True,
        "key_features": ["string"]
    }
)
print(data)

工程要点:直接丢入原始 HTML 会给模型带来巨大的 Token 开销和噪声干扰。websense 内部的三段式流水线(Fetch → Clean → Parse)值得借鉴。在送入 LLM 之前,务必使用 BeautifulSoup 或 trafilatura 剔除 <script>、<style> 及冗余属性,仅保留语义骨架。阿里云开发者社区的一篇实践也印证了这一点:HTML 精炼能显著降低 Token 消耗并提升提取稳定性。

范式二:自愈选择器——当规则失效时让 AI 兜底

纯 LLM 提取的代价是延迟与成本(每次请求都需推理)。更务实的混合架构是:日常运行走高速的 CSS/XPath 规则,仅在规则失效时触发 AI 修复。

EvoScrape 项目实现了这一思路。其工作流程是:检查保存的选择器 → 若失败,抓取当前页面 HTML → 分析候选元素并评分(依据文本相似度、类名语义、层级位置)→ 选出最佳替补 → 验证替补能取到合理值 → 自动保存新选择器并继续运行。

代码语言:javascript
复制
# 伪代码示意自愈逻辑
def extract_with_healing(page, field, old_selector):
    try:
        return page.locator(old_selector).inner_text()
    except:
        # 规则失效,触发 AI 分析
        candidates = analyze_dom_with_llm(page.content(), 
                                          target_description="商品价格,通常包含 ¥ 或 $ 符号")
        new_selector = candidates[0].selector
        # 关键:验证新选择器提取的值是否合理(如包含数字)
        value = page.locator(new_selector).inner_text()
        if is_valid_price(value):
            save_selector(field, new_selector)  # 持久化,下次直接用
            return value
        raise

这种规则优先、AI 兜底的策略,兼顾了吞吐量与鲁棒性。对于监控类任务(如竞品价格追踪),你可以在夜间低峰期跑 AI 修复任务,白天全量采集时直接使用修复后的选择器。

范式三:代码生成——让模型写提取脚本,而非直接提取数据

llm-scraper-py 提供了一个极具工程价值的思路:利用 LLM 生成一段可复用的 JavaScript/Python 提取代码,然后在浏览器上下文中执行该代码,而非每次都让模型返回 JSON。

代码语言:javascript
复制
from llm_scraper_py import LLMScraper, OpenAIModel
from pydantic import BaseModel

class Product(BaseModel):
    name: str
    price: float
    rating: float

scraper = LLMScraper(OpenAIModel(api_key="..."))

# 让模型观察页面并生成提取代码
result = await scraper.agenerate(page, Product)
generated_js = result.code

# 在后续同构页面上直接执行生成的代码,无需再调 LLM
extracted = await page.evaluate(generated_js)

优势:对于列表页(如电商搜索结果),你只需要对第一个商品调用一次模型生成代码,后续几十个商品全部复用该代码在浏览器内执行。Token 成本从 O(N) 降为 O(1),且提取速度回归毫秒级。

架构建议:什么时候该用 AI,什么时候不该用

结合搜索结果中的对比分析与实践经验,决策边界大致如下:

场景

推荐方案

理由

站点固定、结构稳定、高频采集

传统规则 + 代理池

延迟敏感,成本敏感

多站点异构、规则维护成本高

LLM 语义提取(Schema 驱动)

通用 Prompt 跨站复用,省去逐站适配

已有规则库、偶发失效

规则优先 + AI 自愈兜底

兼顾效率与鲁棒性

列表页批量提取

LLM 生成代码 → 本地执行

一次性推理成本,无限次执行

最后的提醒:AI 爬虫并未改变爬虫的边界。robots.txt、请求频率控制、身份标识(User-Agent)依然是必须遵守的准则。LLM 的能力在于理解页面,而不在于绕过封禁。将 AI 用于“更聪明地解析公开信息”,而非“更隐蔽地突破限制”,才是这项技术长期产生价值的路径。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 范式一:语义提取——用 Prompt 替代选择器
  • 范式二:自愈选择器——当规则失效时让 AI 兜底
  • 范式三:代码生成——让模型写提取脚本,而非直接提取数据
  • 架构建议:什么时候该用 AI,什么时候不该用
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档