2026/11/6 1:30:42

还在手写 XPath?AI 爬虫 Agent 已经 Prompt 一把梭了

还在手写 XPath?AI 爬虫 Agent 已经 Prompt 一把梭了 前言传统爬虫写腻了试试让 AI 来干朋友们你有没有过这种崩溃时刻——花了两小时写好的爬虫脚本刚跑通目标网站改了个 class 名整个逻辑就崩了 。更气人的是不同页面结构还不统一你写的 XPath 在 A 页面好使在 B 页面就返回空列表。然后你开始疯狂加 try-except堆防御性代码最后发现维护爬虫的时间比写爬虫还长。我写了 8 篇爬虫实战文章爬过抖音、微博、懂车帝、携程、小红书、知乎、豆瓣对这种痛感同身受。直到我发现了AI Agent 爬虫这个方向——你不需要告诉 AI 去第 3 个 table 的第 2 列找 td你只需要说提取商品名称、价格、库存状态它就给你搞定了。今天这篇文章我们用ScrapeGraphAI Crawl4AI这两个当红炸子鸡和传统爬虫做一次正面硬刚对比。同样的任务传统写法 vs AI 写法效果差异一目了然。一、AI 爬虫 vs 传统爬虫到底差在哪先上一张对比表直观感受一下表格维度传统爬虫AI 爬虫 (ScrapeGraphAI/Crawl4AI)数据定位方式手写 CSS/XPath 选择器自然语言 Prompt 描述需求页面改版影响选择器失效必须重写AI 自动适配基本无感开发速度慢需要分析 DOM 结构快几行代码搞定运行成本免费仅服务器有 LLM API 费用准确性100%选择器写对的话95%偶尔需要后处理学习门槛需要掌握 HTML/CSS/XPath会写 Prompt 就行适合场景高频大规模、结构稳定快速验证、页面多变核心差异就一句话传统爬虫是告诉电脑怎么找AI 爬虫是告诉电脑你要什么。这个范式转换就像是以前你告诉外卖员左转 200 米再右转进小区 3 号楼现在你直接说送到我家他导航自己搞定。二、环境搭建先把武器准备好两个库一起装bash# 安装 ScrapeGraphAI最新版 2.x需 Python 3.12 pip install scrapegraphai # 安装 Playwright 浏览器引擎ScrapeGraphAI 依赖它渲染页面 playwright install # 安装 Crawl4AI pip install crawl4ai # Crawl4AI 初始化下载浏览器、校验依赖 crawl4ai-setup # 验证环境是否正常 crawl4ai-doctor⚠️ 踩坑提醒Python 版本ScrapeGraphAI 最新版要求Python 3.12用了 match-case 语法低于这个版本装不上别问我怎么知道的 Playwright 安装失败如果playwright install报错试试python -m playwright install chromium这个更稳网络问题首次运行需要下载 Chromium 内核约 150MB国内网络可能需要挂代理三、5 分钟上手ScrapeGraphAI 单页爬取ScrapeGraphAI 最核心的就是SmartScraperGraph——一个单页爬取器你只需要提供两个东西Prompt要提取什么和SourceURL 地址。用 OpenAI GPT-4o-minipythonfrom scrapegraphai.graphs import SmartScraperGraph import json # 配置 LLM使用 OpenAI graph_config { llm: { api_key: YOUR_OPENAI_API_KEY, # 替换为你的 Key model: openai/gpt-4o-mini, # 性价比之王 }, verbose: True, # 开启详细日志方便调试 headless: True, # 无头模式生产环境必开 } # 创建爬取图一个 Prompt 一个 URL 就够了 smart_scraper SmartScraperGraph( prompt提取页面上所有项目的名称和描述, sourcehttps://perinim.github.io/projects, configgraph_config, ) # 运行拿到结构化结果 result smart_scraper.run() print(json.dumps(result, indent4, ensure_asciiFalse))输出结果直接就是干净的 JSONjson{ projects: [ { name: ScrapeGraphAI, description: AI-powered web scraping library using LLM }, { name: Project B, description: Another cool project } ] }用 Ollama 本地模型免费不想花钱调 API用本地模型完全免费pythonfrom scrapegraphai.graphs import SmartScraperGraph # 配置本地 Ollama 模型 graph_config { llm: { model: ollama/llama3.2, # 先 ollama pull llama3.2 model_tokens: 8192, format: json, # Ollama 必须显式指定 base_url: http://localhost:11434, # Ollama 默认地址 }, embeddings: { model: ollama/nomic-embed-text, # 嵌入模型也要本地 base_url: http://localhost:11434, }, verbose: True, headless: True, } smart_scraper SmartScraperGraph( prompt提取页面上所有项目的名称和描述, sourcehttps://perinim.github.io/projects, configgraph_config, ) result smart_scraper.run() print(result)看到没零选择器零 XPath就一个 Prompt。这就是 AI 爬虫的魔力 ✨四、实战1电商价格监控——传统写法 vs AI 写法现在来一场真正的对比。任务从电商页面提取商品名称、价格、库存状态。传统写法Selenium XPathpythonfrom selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 启动浏览器 driver webdriver.Chrome() driver.get(https://example-shop.com/products) # 等待页面加载你得知道要等多久 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, product-item)) ) # 手写 XPath 定位每个字段页面一改版这里就崩 products driver.find_elements(By.XPATH, //div[classproduct-item]) results [] for product in products: try: name product.find_element(By.XPATH, .//h3[classproduct-name]).text except: name N/A # 选择器失效的防御性代码 try: price product.find_element(By.XPATH, .//span[classprice-current]).text except: price N/A try: stock product.find_element(By.XPATH, .//div[classstock-status]).text except: stock N/A results.append({name: name, price: price, stock: stock}) driver.quit() # 打印结果 for item in results: print(item)问题显而易见3 个 try-except 块全是防御性代码XPath 写死页面改版全废不同网站要重新分析 DOM重写选择器代码量 40 行核心逻辑其实就 3 个字段AI 写法ScrapeGraphAIpythonfrom scrapegraphai.graphs import SmartScraperGraph import json graph_config { llm: { api_key: YOUR_OPENAI_API_KEY, model: openai/gpt-4o-mini, }, headless: True, } # 一个 Prompt 搞定不用管页面结构 scraper SmartScraperGraph( prompt提取页面上每个商品的名称、当前价格和库存状态, sourcehttps://example-shop.com/products, configgraph_config, ) result scraper.run() print(json.dumps(result, indent4, ensure_asciiFalse))对比一下表格对比项传统写法AI 写法代码行数~40 行~15 行选择器维护3 个 XPath页面改版就废零选择器AI 自动适配换网站重写所有选择器只改 URL 和 Prompt防御性代码需要 try-except不需要运行费用免费约 $0.001/次GPT-4o-mini说白了传统爬虫的 80% 代码在处理怎么找数据AI 爬虫把这部分全部自动化了你只需要关注要什么数据。五、实战2用 Crawl4AI 构建新闻聚合 AgentCrawl4AI 的强项是把网页转成 LLM 友好的 Markdown支持异步并发爬取。非常适合做新闻聚合——先爬多个新闻站再丢给 LLM 做摘要。异步并发爬取 LLM 摘要pythonimport asyncio import json from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode from crawl4ai import LLMExtractionStrategy from pydantic import BaseModel, Field # 定义结构化输出的 Schema class NewsItem(BaseModel): title: str Field(description新闻标题) summary: str Field(description50 字以内的新闻摘要) category: str Field(description新闻分类科技/财经/社会/其他) # 配置 LLM 提取策略 extraction_strategy LLMExtractionStrategy( provideropenai/gpt-4o-mini, api_tokenYOUR_OPENAI_API_KEY, schemaNewsItem.model_json_schema(), extraction_typeschema, instruction提取每条新闻的标题、摘要和分类, ) # 运行配置 run_config CrawlerRunConfig( extraction_strategyextraction_strategy, cache_modeCacheMode.BYPASS, # 不用缓存拿最新数据 word_count_threshold50, # 过滤太短的页面 ) # 要爬的新闻站点列表 news_urls [ https://news.ycombinator.com, https://www.nbcnews.com/business, https://techcrunch.com, ] async def aggregate_news(): 并发爬取多个新闻站并提取结构化信息 async with AsyncWebCrawler() as crawler: # arun_many 并发爬取多个 URL results await crawler.arun_many( urlsnews_urls, configrun_config, max_concurrent3, # 3 个浏览器标签并发 ) all_news [] for result in results: if result.success and result.extracted_content: # 解析 LLM 提取的结构化数据 items json.loads(result.extracted_content) for item in items: all_news.append({ **item, source_url: result.url, }) # 按分类整理输出 for news in all_news: print(f[{news.get(category, 其他)}] {news.get(title, N/A)}) print(f 摘要: {news.get(summary, N/A)}) print(f 来源: {news.get(source_url, N/A)}) print() return all_news # 运行 if __name__ __main__: news asyncio.run(aggregate_news()) print(f共聚合 {len(news)} 条新闻)这个案例的核心亮点**arun_many 并发爬取 **3 个新闻站同时爬不用串行等待**LLMExtractionStrategy **爬完直接用 LLM 提取结构化数据一步到位**Pydantic Schema 约束 **输出格式严格遵循你定义的模型不怕 LLM 瞎编字段**CrawlResult 对象 **result.markdown拿干净文本result.extracted_content拿结构化数据如果你想不用 LLM只用 Crawl4AI 拿 Markdown 再自己处理更简单pythonimport asyncio from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode async def simple_crawl(): config CrawlerRunConfig(cache_modeCacheMode.BYPASS) async with AsyncWebCrawler() as crawler: result await crawler.arun(urlhttps://news.ycombinator.com, configconfig) # result.markdown 就是干净的 Markdown 文本 # 直接丢给你的 LLM 做 RAG 或摘要都行 print(result.markdown.raw_markdown[:500]) # 看前 500 字符 asyncio.run(simple_crawl())CLI 一行命令也能用bash# 基础爬取输出 Markdown crwl https://news.ycombinator.com -o markdown # 用 LLM 提取结构化数据 crwl https://news.ycombinator.com -q Extract top 10 news titles六、实战3SearchGraph 多页搜索爬取前面两个案例都是给一个 URL 爬一个页面。但很多时候我们的需求是** 搜索某个关键词从多个搜索结果中提取信息 **。这就是 SearchGraph 的主场。pythonfrom scrapegraphai.graphs import SearchGraph import json # 配置用 OpenAI本地模型同理 graph_config { llm: { api_key: YOUR_OPENAI_API_KEY, model: openai/gpt-4o-mini, }, verbose: True, headless: True, } # 创建搜索爬取图 search_graph SearchGraph( prompt提取每个搜索结果中关于 Python AI 框架的名称、主要特点、GitHub 星数, sourcePython AI framework 2026 best, # 搜索关键词 configgraph_config, ) # 运行自动搜索 → 访问 Top N 结果 → 提取信息 result search_graph.run() print(json.dumps(result, indent4, ensure_asciiFalse))SearchGraph 的工作流程plaintext你的 Prompt ↓ 搜索引擎查询自动 ↓ 访问 Top N 搜索结果页面 ↓ 每个页面用 AI 提取结构化数据 ↓ 汇总输出 JSON和传统方式对比传统做法你得先调搜索 API 拿 URL 列表再逐个爬取解析最后汇总。SearchGraph 一行run()全搞定。用 API 版本更简洁如果你不想本地跑 LLM用 ScrapeGraphAI 云端 API 也行pythonfrom scrapegraph_py import ScrapeGraphAI sgai ScrapeGraphAI() # 自动读取 SGAI_API_KEY 环境变量 # 搜索 结构化提取一步到位 res sgai.search( 2026 年最受欢迎的 Python AI 框架, num_results5, # 返回 5 个结果 prompt提取框架名称、主要特点和星数, formatmarkdown, ) if res.status success: print(res.data)七、避坑指南那些踩过的坑1. Python 版本问题ScrapeGraphAI 从 2.x 开始要求 **Python 3.12 **不是 3.10。如果你还在用 3.9/3.10要么升级 Python要么装旧版本不推荐功能差很多。bash# 检查你的 Python 版本 python --version # 需要 3.122. 本地模型 vs 云端 API 怎么选表格对比项Ollama 本地模型OpenAI API费用免费按 Token 计费GPT-4o-mini 很便宜速度慢取决于你的显卡快准确性中等7B 模型容易漏字段高GPT-4o-mini 效果很好隐私数据不出本地数据经过 OpenAI 服务器推荐场景隐私敏感 / 预算有限追求效果和速度我的建议先用 GPT-4o-mini 跑通流程真的便宜一次爬取几分钱确认效果后再考虑换本地模型降本。3. 请求频率控制AI 爬虫虽然方便但也要守规矩pythonimport time import asyncio # 简单的请求间隔控制 async def crawl_with_delay(urls, delay2): async with AsyncWebCrawler() as crawler: for url in urls: result await crawler.arun(urlurl) # 处理结果... await asyncio.sleep(delay) # 每次请求间隔 2 秒原则别把人家服务器打挂了请求之间加个延迟高峰期避开。4. AI 提取不一定 100% 准确这是 AI 爬虫最大的坑——LLM 有时候会幻觉**遗漏字段 **复杂页面可能漏提取某些条目**数值错误 **价格等数字偶尔会提取错**格式不统一 **同一个字段不同页面可能格式不同对策对关键数据做后处理验证python# 简单的数据验证 def validate_product(data): # 检查价格是否为有效数字 if data.get(price): try: price float(data[price].replace(¥, ).replace(,, )) if price 0: data[price_valid] False except ValueError: data[price_valid] False return data # 对 AI 提取的结果做验证 for item in result.get(products, []): validate_product(item)5. 合规性提醒⚠️ 不管用什么爬虫技术都要注意**遵守 robots.txt **检查目标网站是否允许爬取**遵守法律法规 **《数据安全法》《个人信息保护法》不是闹着玩的**不要爬取敏感数据 **用户隐私、付费内容等**控制频率 **别搞 DDOS八、传统 vs AI什么时候该用哪个AI 爬虫不是万能的传统爬虫也没过时。关键是选对场景表格场景推荐方案原因页面结构稳定每天爬 10 万页传统爬虫零 API 费用性能更稳快速验证数据可行性AI 爬虫几分钟搞定不用写选择器页面频繁改版AI 爬虫AI 自动适配不用维护选择器多个不同结构的数据源AI 爬虫同一个 Prompt 搞定不同网站高频实时价格监控传统 AI 混合传统负责高频采集AI 负责解析兜底竞品分析/市场调研AI 爬虫SearchGraph 一把梭我的实战经验是先用 AI 爬虫做 MVP 验证快验证通了再考虑是否需要优化为传统方案降本。** 不是非此即彼而是各取所长 **。总结这篇我们对比了传统爬虫和 AI 爬虫的核心差异用 3 个实战案例展示了ScrapeGraphAI的 SmartScraperGraph一个 Prompt 爬一页SearchGraph 搜索 多页一把梭Crawl4AI的异步并发 Markdown 输出专为 LLM 喂数据设计传统写法 vs AI 写法的代码量对比AI 方案代码量减少 60%且不怕页面改版AI 爬虫不是银弹但它确实在开发效率和维护成本这两个维度上碾压传统方案。2026 年了试试让 AI 来帮你爬数据吧 互动区你在爬虫开发中遇到过最头疼的问题是什么页面改版反爬还是数据清洗你更倾向用本地模型Ollama还是云端 APIOpenAI为什么如果让你用 AI 爬虫爬一个网站你会选择哪个评论区告诉我下期可能就写它 觉得有用就收藏一下吧下次页面改版的时候你会回来谢我的 标签AI爬虫、ScrapeGraphAI、Crawl4AI、Python爬虫、LLM应用、Web Scraping、AI Agent、数据采集