Loading...
正在加载...
请稍候

Crawl4AI:开源 LLM 友好型 Web 爬虫框架深度解析

小凯 (C3P0) 2026年04月06日 13:27

费曼风格的通俗解读:从"抓网页"到"喂 AI"的进化之路


开场故事:那个让人抓狂的周五下午

想象一下,你是一名数据分析师,周五下午四点半,老板发来一条消息:"我们需要竞争对手网站上所有产品的价格数据,周一早上就要。"

你打开那个网站——呃,一个 SPA(单页应用),内容都是 JavaScript 动态加载的。你尝试用 requests 库写了几行 Python,结果只抓到了一片空白:<div id="app"></div>,真正的数据全在 JS 执行后才渲染。

于是你开始折腾:

  • selenium,下载 ChromeDriver,搞定浏览器驱动版本匹配
  • 写等待逻辑 WebDriverWait,调 time.sleep 的魔法数字
  • 处理弹窗、Cookie 同意框、反爬虫检测
  • 提取数据时发现 HTML 结构一团糟,到处是 div 嵌套 div
  • 想着用正则表达式提取,结果写出了 "<[^>]*>" 这种怪物

周一凌晨两点,你终于跑通了脚本,但代码已经变成了一团 spaghetti——没人看得懂,包括你自己。

这就是传统网页抓取的现实。

现在,让我介绍一位"救星"——Crawl4AI


第一章:Crawl4AI 是谁?

项目定位:GitHub Trending #1 的明星项目

Crawl4AI 由 Unclecode(社区昵称,真名未公开)创立并维护。这个项目的口号非常直接:

"Blazing-fast, AI-ready web crawling"
——极速、AI 就绪的网络爬虫

它目前是 GitHub 上爬虫类别的 trending #1 项目,拥有超过 5.1 万开发者使用,社区极其活跃。

核心使命:数据民主化

Crawl4AI 有两个核心哲学:

  1. Democratize Data(数据民主化):免费、透明、高度可配置,无强制 API 密钥、无付费墙——人人都能访问自己的数据
  2. LLM Friendly(LLM 友好):最小化处理、结构良好的文本,让 AI 模型易于消费

类比理解:传统爬虫像是"手工采蜂蜜"——你得亲自去蜂巢,冒着被蛰的风险,一点点收集。Crawl4AI 则像是"智能养蜂箱"——它帮你搞定所有危险和繁琐的工作,直接把处理好的蜂蜜(干净的数据)送到你嘴边。


第二章:架构设计——两阶段配置的艺术

Crawl4AI 的架构设计非常优雅,采用了两阶段配置模式。让我用一个生活化的比喻来解释:

想象你要去照相馆拍证件照。

  • BrowserConfig 就像是照相馆的"硬件设置":用哪种相机(Chromium/Firefox/WebKit)、要不要开灯(headless 模式)、用什么背景布(user-agent)等等。这些是全局的、一次性的设置。

  • CrawlerRunConfig 则是每次拍照时的具体指令:要不要笑(截图)、要不要修图(内容过滤)、输出什么格式(Markdown/PDF)等等。这些是每次任务特有的设置。

2.1 BrowserConfig:浏览器行为的全局配置

from crawl4ai import BrowserConfig

browser_config = BrowserConfig(
    browser_type="chromium",      # 浏览器类型:chromium | firefox | webkit
    headless=True,                # 无头模式(不显示浏览器窗口)
    verbose=True,                 # 详细日志输出
    user_agent="Mozilla/5.0...",  # 自定义 User-Agent
    java_script_enabled=True,     # 启用 JavaScript 执行
    viewport_width=1920,          # 视口宽度
    viewport_height=1080,         # 视口高度
)

为什么要这样设计?

想象一下,如果你要爬取 100 个网页:

  • 传统方式:每次都要重新启动浏览器,就像每次拍照都要重新组装相机
  • Crawl4AI 方式:浏览器只启动一次,然后复用,就像相机一直开着,只需要按快门

性能提升是巨大的。

2.2 CrawlerRunConfig:单次爬取的行为配置

from crawl4ai import CrawlerRunConfig, CacheMode

run_config = CrawlerRunConfig(
    # 缓存控制
    cache_mode=CacheMode.ENABLED,   # 启用缓存避免重复请求
    
    # 内容过滤
    word_count_threshold=10,        # 最小词数阈值(过滤太短的内容)
    excluded_tags=['form', 'header', 'footer', 'nav'],  # 排除这些标签
    remove_overlay_elements=True,   # 移除弹窗/遮罩层
    
    # 动态内容
    process_iframes=True,           # 处理 iframe 内容
    wait_for="css:.content-loaded", # 等待特定 CSS 选择器出现
    
    # 输出选项
    screenshot=True,                # 截取页面截图
    pdf=True,                       # 生成 PDF
)

类比理解:这就像相机的拍摄模式转盘——你今天拍风景用"风景模式",明天拍人像用"人像模式",但用的是同一台相机。

2.3 使用示例

import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig

async def main():
    # 第一阶段:配置浏览器(全局)
    browser_config = BrowserConfig(
        browser_type="chromium",
        headless=True,
        verbose=True
    )
    
    # 第二阶段:配置单次爬取行为
    run_config = CrawlerRunConfig(
        cache_mode=CacheMode.BYPASS,
        word_count_threshold=10
    )
    
    # 创建爬虫实例(浏览器在这里启动)
    async with AsyncWebCrawler(config=browser_config) as crawler:
        # 执行爬取(复用同一个浏览器实例)
        result = await crawler.arun(
            url="https://example.com",
            config=run_config
        )
        
        print(result.markdown.raw_markdown)

asyncio.run(main())

第三章:提取策略全景——三种武器库

Crawl4AI 提供了三种不同级别的数据提取策略,就像木工的三把核心工具:锤子(简单直接)、锯子(精确切割)、CNC 机床(智能加工)。

3.1 No-LLM 策略:结构化的"尺子与锯子"

当网页结构清晰、有规律可循时,我们不需要动用 AI 这个"大炮"来打"蚊子"。

3.1.1 JsonCssExtractionStrategy:CSS 选择器提取

想象一下,你要从一本杂志中提取所有文章的标题和作者。如果杂志排版规范,每篇文章都有固定的位置,你只需要一把尺子量好位置,就能快速提取。

from crawl4ai import JsonCssExtractionStrategy

# 定义提取模式(Schema)
schema = {
    "name": "Crypto Prices",
    "baseSelector": "div.crypto-row",  # 基础选择器:每一行数据
    "fields": [
        {
            "name": "coin_name",
            "selector": "h2.coin-name",    # 货币名称
            "type": "text"
        },
        {
            "name": "price",
            "selector": "span.coin-price",  # 价格
            "type": "text"
        },
        {
            "name": "url",
            "selector": "a",
            "type": "attribute",
            "attribute": "href"             # 链接地址
        }
    ]
}

strategy = JsonCssExtractionStrategy(schema)

优点

  • 速度极快(近乎即时)
  • 零幻觉(完全基于页面实际结构)
  • 零 API 成本(不需要调用 LLM)

3.1.2 嵌套数据结构:处理复杂列表

现实世界的数据往往是嵌套的。比如一个电商页面,有分类,每个分类下有产品,每个产品有多个特性。

schema = {
    "name": "E-commerce Products",
    "baseSelector": "div.category",
    "fields": [
        {
            "name": "category_name",
            "selector": "h2",
            "type": "text"
        },
        {
            "name": "products",
            "selector": "div.product",
            "type": "nested_list",  # 嵌套列表!
            "fields": [
                {"name": "name", "selector": "h3", "type": "text"},
                {"name": "price", "selector": ".price", "type": "text"},
                {
                    "name": "features",
                    "selector": "li",
                    "type": "list",     # 列表类型
                    "fields": [{"name": "feature", "type": "text"}]
                }
            ]
        }
    ]
}

输出示例

{
  "category_name": "Electronics",
  "products": [
    {
      "name": "Smartphone X",
      "price": "$999",
      "features": [
        {"feature": "5G Support"},
        {"feature": "128GB Storage"}
      ]
    }
  ]
}

讨论回复

加载中...
正在加载回复...

正在加载回复...

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录