项目快照:unclecode/crawl4ai,约 78,450 个 Star,8,119 个 Fork;最新推送时间 2026-08-17T09:01:57Z。本文基于仓库公开资料撰写。

项目地址:https://github.com/unclecode/crawl4ai · https://crawl4ai.com

crawl4ai 从代码、运行环境到实践流程的项目封面
crawl4ai 的项目能力与实践流程示意。

项目速览(TL;DR)

crawl4ai 是一个使用 Python 编写的开源网页抓取与采集项目,核心目标是把网页内容转换为适合大语言模型(Large Language Model,LLM)处理的结构化 Markdown。仓库资料显示,项目采用 Apache-2.0 许可证,默认分支为 main,当前 GitHub 元信息为 78450 个 Star 和 8119 个 Fork。

它提供异步浏览器抓取接口、命令行接口(Command-Line Interface,CLI)、深度抓取策略、LLM 提取能力、Docker 部署方式,以及面向 Markdown、检索增强生成(Retrieval-Augmented Generation,RAG)和数据流水线的输出能力。仓库 README 标注的最新更新为 v0.9.2;使用时仍应以仓库当前 README 和发布说明为准。

  • 项目语言:Python。
  • 许可证:Apache-2.0。
  • 最低 Python 版本:Python 3.10。
  • Docker 服务端口:11235。
  • 默认分支:main。
  • 官网与文档:Crawl4AI 官网与文档。

定位与目标用户

本项目定位于“面向 LLM 的网页爬虫与抓取器”,重点不只是获取 HTML,而是把网页内容整理为 Markdown、引用信息和可供后续模型或数据处理程序消费的结果。根据 README,项目面向 RAG、智能代理(Agent)和数据流水线等场景。

目标用户需要处理公开网页或已获授权的网站内容,并且希望在抓取、清洗、链接处理和模型提取之间使用同一套 Python 工具。项目同时提供 CLI 与 Docker 入口,因此既可用于本地脚本,也可作为内部服务部署;具体生产规模、服务等级协议(Service Level Agreement,SLA)和官方并发指标,资料中未提供。

  • 需要将网页正文转换为 Markdown 的 Python 开发者。
  • 需要为 RAG 知识库准备网页数据的工程团队。
  • 需要通过深度抓取遍历文档站点的采集任务。
  • 需要在授权环境中使用会话、代理、Cookie、用户脚本或钩子控制浏览器行为的团队。
  • 需要通过 Docker 部署抓取服务,并自行管理 API 密钥、网络边界和运行时资源的运维人员。

核心功能

核心能力可分为网页渲染、内容清洗、深度遍历和结构化提取四个层次。输入可以是 URL、抓取策略和提取问题,输出则由抓取结果对象或 CLI 指定的 Markdown 输出构成。

Markdown 生成与内容筛选

README 将 Clean Markdown 描述为带有准确格式的结构化 Markdown,将 Fit Markdown 描述为基于启发式规则过滤噪声和无关内容的输出方式。链接还可以转换为编号引用列表,并保留页面中的引用线索;资料未给出完整字段定义,因此不能据此推导固定的 Markdown schema。

在 Python 示例中,AsyncWebCrawler 创建异步抓取器,arun 接收 URL,返回结果对象,调用方通过 result.markdown 读取 Markdown。该流程依赖 Playwright 浏览器组件完成页面访问,具体清洗规则和输出字段应以当前文档为准。

异步抓取与浏览器控制

项目通过异步上下文管理器使用 AsyncWebCrawler,示例中的 async with 负责建立和释放抓取资源。项目依赖中包含 aiohttp、anyio、playwright、patchright 和 playwright-stealth,这些依赖共同构成网络请求、异步调度和浏览器自动化相关的运行基础。

README 的功能说明还列出会话、代理、Cookie、用户脚本和钩子。资料没有提供每个配置对象的完整接口签名,所以本文不虚构这些能力的参数名称;需要使用时,应查阅当前官方文档和仓库源码。

深度抓取与 URL 发现

CLI 示例提供基于 BFS(Breadth-First Search,广度优先搜索)的深度抓取方式:--deep-crawl bfs 指定遍历策略,--max-pages 10 限制最多处理 10 个页面。该输入由 CLI 转换为抓取任务,输出仍可指定为 Markdown。

v0.8.0 发布说明还提到 resume_state、on_state_change 和 prefetch=True。前两项用于深度抓取的崩溃恢复状态,后者用于 URL 发现模式;README 声称 prefetch 模式可带来 5-10x 的 URL 发现速度,但该数据属于 README 的项目说明,不应视为独立基准测试结果。

LLM 提取

CLI 支持使用 -q 传入问题,例如从产品页面提取所有产品价格。依赖清单中的 unclecode-litellm==1.81.13 表明项目包含模型调用适配依赖;Docker Compose 注释列出 OpenAI、DeepSeek、Anthropic、Groq、Together、Mistral 和 Gemini 等 API 密钥变量,但资料没有给出默认模型、请求格式、返回 schema 或各提供商的兼容范围。

因此,LLM 提取的完整运行条件是:抓取内容可访问、对应模型服务凭据已在授权环境中配置,并且当前版本支持所选提供商。示例中的问题文本应限定为数据抽取任务,不应把抓取工具用于绕过访问控制、提交账号操作或处理未获授权的隐私数据。

系统架构与关键模块

从仓库资料可确认,项目由 Python 包、Playwright 浏览器运行时、CLI、可选模型依赖和 Docker 服务组合而成。下面的模块关系是根据 pyproject.toml、Dockerfile、docker-compose.yml 与 README 归纳,不代表仓库未公开部分的内部实现细节。

  • Python 包层:安装包名为 Crawl4AI,包查找范围为 crawl4ai*。
  • 异步抓取层:README 示例使用 AsyncWebCrawler 与 arun。
  • 浏览器层:依赖 Playwright,并通过 crawl4ai-setup 与 playwright install --with-deps 准备 Chromium。
  • 命令行层:crwl 映射到 crawl4ai.cli:main,负责基础抓取、深度抓取和问题驱动提取。
  • 模型与文本处理层:包含 LiteLLM 适配、Pydantic、NLTK、rank-bm25、snowballstemmer 等依赖;部分模型能力通过可选依赖安装。
  • 容器服务层:Dockerfile 使用 Supervisor、Redis 和 Gunicorn 相关配置启动服务,Compose 将服务映射到主机的 11235 端口。

Dockerfile 还显示,构建阶段会复制 deploy/docker/supervisord.conf、deploy/docker/requirements.txt、deploy/docker/static 和其他 Docker 部署文件。运行时使用 appuser,应用目录被设置为不可写,输出目录位于 /var/lib/crawl4ai/outputs。

依赖与运行环境

项目要求 Python 版本不低于 3.10,分类器列出了 Python 3.10、3.11、3.12 和 3.13。Dockerfile 的基础镜像为 python:3.12-slim-bookworm,并安装 Chromium 所需的系统库、Redis、Supervisor 和构建工具。

基础安装会带上浏览器、异步网络、HTML 解析、图像处理、配置解析和 CLI 依赖。PyTorch、Transformers、PDF 与 Selenium 等内容被放在可选依赖组中,不能假设基础安装已经包含这些组件。

依赖组或组件 资料中的内容 用途
基础运行时 Python >=3.10 满足项目声明的最低 Python 版本。
浏览器 playwright >=1.49.0、patchright >=1.49.0 支持浏览器驱动和页面抓取运行时。
HTML 解析 lxml >=5.3,<7、beautifulsoup4 ~=4.12、cssselect >=1.2.0 支持网页文档解析与选择。
PDF 可选组 pdf = ["pypdf"] 提供 PDF 相关可选依赖。
torch 可选组 torch、nltk、scikit-learn 提供与 Torch、文本处理和机器学习相关的可选能力。
transformer 可选组 transformers、tokenizers、sentence-transformers 提供 Transformer 与句向量相关依赖。
sync 可选组 selenium 提供同步 Selenium 相关可选依赖。

快速开始(含最小可运行示例)

最小闭环由安装、浏览器准备、运行抓取和诊断验证组成。以下命令来自 README,适合在隔离的本地 Python 环境或已获授权的测试环境执行。

安装与浏览器准备

Bash
python -m venv .venv
source .venv/bin/activate
pip install -U crawl4ai
crawl4ai-setup

README 同时提供了 crawl4ai-doctor 验证命令。若浏览器相关组件尚未安装,可执行下列命令安装 Chromium 及其依赖;操作系统权限和系统包管理器行为不在仓库资料范围内。

Bash
python -m playwright install --with-deps chromium
crawl4ai-doctor

Python 最小示例

Python
import asyncio
from crawl4ai import *

async def main():
    async with AsyncWebCrawler() as crawler:
        result = await crawler.arun(
            url="https://docs.crawl4ai.com",
        )
        print(result.markdown)

if __name__ == "__main__":
    asyncio.run(main())

示例输入是文档站点 URL,输出为抓取结果中的 Markdown 文本。示例没有使用模型密钥,也没有提交表单或修改远程资源;在实际任务中应先确认目标站点的授权、robots 规则和服务条款。

CLI 最小验证

Bash
crwl https://docs.crawl4ai.com -o markdown
crwl https://docs.crawl4ai.com --deep-crawl bfs --max-pages 10

-o markdown 用于指定 Markdown 输出,深度抓取命令使用 BFS 策略并将页面上限设为 10。若命令无法启动浏览器,优先运行 crawl4ai-doctor,再检查 Playwright Chromium 是否完成安装。

配置说明

项目配置分布在 Python 安装参数、Docker 构建参数和 Compose 运行环境中。下表只列出资料中明确出现的字段;未写出的默认模型、超时、并发和缓存策略不作推断。

字段名 类型 默认值 作用
INSTALL_TYPE 字符串 default Docker 构建时选择基础、all、torch 或 transformer 安装类型。
ENABLE_GPU 布尔字符串 false Docker 构建时控制是否尝试安装 NVIDIA CUDA Toolkit;Dockerfile 限定了 amd64 条件。
TAG 字符串 latest Compose 中用于拼接默认镜像标签。
IMAGE 字符串 unclecode/crawl4ai:${TAG:-latest} Compose 中覆盖默认镜像名称。
C4AI_VER 字符串 0.9.2 Dockerfile 中的 Crawl4AI 构建版本参数,并写入 C4AI_VERSION。
USE_LOCAL 布尔字符串 true Dockerfile 安装脚本中控制从本地源码还是 GitHub 分支安装。
GITHUB_BRANCH 字符串 main 从 GitHub 安装时使用的分支。
REDIS_HOST 字符串 localhost Dockerfile 设置的 Redis 主机。
REDIS_PORT 整数型字符串 6379 Dockerfile 设置的 Redis 端口;Compose 注释要求不要暴露该端口。
OPENAI_API_KEY 字符串 未提供 Compose 注释列出的 LLM 提供商凭据字段。
LLM_PROVIDER 字符串 未提供 Compose 注释列出的可选模型提供商覆盖字段。

Compose 使用 .llm.env 作为环境文件,资料要求创建该文件,但没有提供完整的 .llm.env.example 内容。API 密钥应使用测试或生产密钥管理机制注入,不应写入源码、镜像层、日志或公开仓库。

进阶用法

进阶能力适合将一次性抓取扩展为可恢复、可筛选和可交付的数据任务。资料明确给出了深度抓取、预取、状态回调和 LLM 问题提取等入口,但没有提供所有策略类和配置对象的完整 API 定义。

深度抓取与恢复状态

深度抓取适合文档站点这类需要从入口 URL 继续发现链接的场景。CLI 通过 --deep-crawl bfs 选择 BFS,并通过 --max-pages 设置页面上限;长时间任务可以使用 README 提到的 resume_state 和 on_state_change 机制保存与观察状态。

预取模式

README 将 prefetch=True 描述为 URL 发现模式,用于减少发现阶段的等待。它适合把“发现候选 URL”和“完整抓取页面内容”分离的任务;资料没有给出该参数适用的全部策略、内存开销或失败重试规则,部署前应在目标数据集上验证。

问题驱动的模型提取

Bash
crwl https://docs.crawl4ai.com -q "Extract the page title and headings"

上面的命令沿用 README 的 -q 用法,问题文本仅用于测试页面内容提取。若改用 Docker Compose 中列出的 LLM 提供商,需要在 .llm.env 中配置相应的 <提供商>_API_KEY;本文不填入真实密钥,也不指定仓库资料未说明的模型名称。

可观测性与运维

Docker 配置提供了健康检查、资源限制、只读根文件系统、进程数上限和 Redis 存活检查。运维人员可以据此建立容器存活、HTTP 健康和资源使用的基础监控,但资料没有给出业务指标、结构化日志字段、追踪协议或 SLA。

  • Compose 健康检查访问 http://localhost:11235/health。
  • Dockerfile 健康检查还执行 redis-cli ping。
  • Compose 内存限制为 4G,预留为 1G。
  • Compose 的 shm_size 为 1gb,用于浏览器共享内存。
  • pids_limit 为 512,并设置 no-new-privileges:true。
  • Compose 将根文件系统设置为只读,并为临时目录和运行时目录提供 tmpfs。

Dockerfile 的健康检查在可用内存少于 2048MB 时返回失败,并检查 Redis 与 11235 端口。该行为属于容器健康判断,不等同于项目对实际抓取容量的性能承诺。

安全与合规边界

网页抓取涉及网络访问、第三方内容、Cookie、代理和模型服务凭据,应只用于已获授权的目标和测试环境。项目不能替代网站所有者的许可、隐私评估、数据保留制度、robots 规则审查或组织内部审批。

  • 仅抓取公开且允许访问的内容,或事先获得目标站点和数据主体的明确授权。
  • 不要把账号密码、会话 Cookie、个人信息和 API 密钥写入代码、镜像或日志。
  • 对抓取结果实施访问控制、最小化采集、保留期限和删除流程。
  • 对外部网页内容视为不可信输入,避免直接执行页面脚本、下载未知文件或把模型输出当作安全指令。
  • 部署 Docker 服务时限制网络出口、控制端口暴露,并保持 Redis 仅在容器内部使用。

README 记录 v0.9.0 将 Docker API 服务调整为安全默认配置,包括默认启用认证、未提供令牌时绑定 loopback,以及把请求体视为不可信边界。README 还记录 v0.8.7 的安全加固内容;这些是版本发布说明中的事实,不表示当前部署已经满足所有组织安全基线,仍需结合当前代码和配置审计。

许可证与商用条款

仓库 LICENSE 明确使用 Apache License 2.0。该许可证授予永久、全球、非排他、免版税的版权许可,并包含专利许可条款;具体权利和终止条件以仓库 LICENSE 原文为准。

Apache-2.0 允许在符合许可证条件的前提下复制、修改、分发和用于商业场景。分发原项目或衍生作品时,需要向接收方提供许可证、保留版权与专利及归属声明,并对修改过的文件附加显著的修改说明;如果发行包包含 NOTICE 文件,还需按 LICENSE 要求保留其中的归属信息。

许可证不授予对许可方商号、商标、服务标志或产品名称的使用权,合理描述项目来源的使用除外。项目的云 API 处于 README 所述的 Closed Beta 状态,云服务资格、价格、SLA 和商业支持不属于 Apache-2.0 对源码许可的自动承诺,相关事项应以官方页面和单独协议为准。

局限性与已知限制

资料能够确认项目提供抓取与提取能力,但没有给出跨站点成功率、吞吐量、并发上限、内存曲线、浏览器兼容矩阵或生产 SLA。不能根据 Star、Fork 或 README 中的“5-10x”描述推导通用性能结论。

  • 浏览器依赖需要额外安装 Chromium;缺失系统库或浏览器缓存时,抓取可能无法启动,官方资料建议使用 crawl4ai-doctor 检查。
  • Docker 构建包含浏览器、Redis 和可选机器学习依赖,镜像构建与运行资源会随 INSTALL_TYPE 和 ENABLE_GPU 变化。
  • LLM 提取依赖外部模型提供商和凭据,资料没有承诺模型输出稳定性、成本、延迟或结果准确率。
  • 网页结构、访问权限、反自动化策略和内容许可由目标站点决定,项目资料没有承诺对任意站点可用。
  • Docker Compose 的健康检查包含内存门槛、Redis 和 HTTP 检查;这可能使资源不足的容器被标记为不健康。
  • 项目在 pyproject.toml 中标记为 Beta 开发状态,升级前应阅读对应版本发布说明并进行回归测试。

官方仓库未提供详细目录说明、完整服务 API、并发建议和错误码列表,建议以最新 README、官方文档和当前源码为准。

适合谁

以下信号同时满足两项或以上时,项目与任务的匹配度较高。最终选择仍应由授权范围、数据处理要求和现有技术栈共同决定。

  • 团队使用 Python 3.10 及以上版本,并且可以接受 Playwright 浏览器运行时。
  • 任务输出需要 Markdown、网页引用信息或面向 RAG 的清洗文本,而不是只保存原始 HTML。
  • 需要从文档入口 URL 扩展到多个页面,并且可以用页面上限控制任务边界。
  • 团队能够自行管理 LLM 提供商密钥、Docker 资源、网络出口和抓取结果的访问权限。
  • 任务运行在已获授权的公开数据或内部测试环境中,能够落实隐私、留存和删除要求。

不适合谁

以下信号表明需要谨慎评估,或者应选择不依赖浏览器抓取的替代设计。资料未列出其他具体替代项目,因此本文不虚构项目对比结果。

  • 运行环境不能安装 Chromium、系统依赖或 Docker 所需的浏览器共享内存。
  • 任务要求官方保证固定吞吐量、严格 SLA、确定性模型结果或已公开的并发上限。
  • 组织不能接受外部模型服务,且不准备部署或配置本地模型依赖。
  • 目标数据包含高敏感个人信息,但团队没有脱敏、访问控制、保留期限和授权流程。
  • 目标站点明确禁止自动化访问,或者任务依赖绕过登录、验证码、访问控制或检测机制。

常见问题与排查(FAQ / Troubleshooting)

排查应先区分安装问题、浏览器问题、配置问题和目标站点问题。下面的处理步骤只覆盖仓库资料明确提供的命令和配置,不替代目标环境的日志审计。

安装后无法启动浏览器怎么办

先执行 crawl4ai-doctor,然后按 README 的方式执行 python -m playwright install --with-deps chromium。Dockerfile 中则通过 crawl4ai-setup 和 playwright install --with-deps 准备浏览器;若使用自定义镜像,应确认这些步骤确实完成。

为什么 Docker 容器显示不健康

检查 http://localhost:11235/health 是否可访问,并检查 Redis 的 redis-cli ping。Dockerfile 还会在可用内存低于 2048MB 时返回失败,而 Compose 设置了 4G 内存上限和 1G 预留,需要结合宿主机资源检查。

LLM 提取没有结果时检查什么

先确认 URL 在授权测试环境中可访问,再检查 .llm.env 是否加载了对应 API 密钥。资料没有提供统一的模型默认值和错误码,因此需要查看当前版本文档、容器日志及所选提供商的响应状态,不应把空结果直接解释为网页没有内容。

如何限制深度抓取范围

CLI 示例使用 --max-pages 10 设置页面数量上限,并用 --deep-crawl bfs 选择 BFS 策略。更细的域名、路径、去重和恢复参数,官方仓库资料未完整提供,建议查阅当前文档后再投入长时间任务。

是否可以直接暴露 Redis 端口

不应这样配置。Compose 注释明确要求 Redis 在容器内部使用且不要暴露 6379 端口;对外只映射服务的 11235 端口,并按当前版本的认证和网络配置进行安全评估。

部署与升级检查清单

部署前的收益在于把抓取行为、凭据和运行资源边界固定下来。以下清单来自 Dockerfile、Compose 和 README 中出现的配置,适用于内部测试部署的初始检查。

  1. 确认 Python、Docker、Chromium 和系统依赖满足当前版本要求。
  2. 确认 .llm.env 不会被提交到版本控制,并只注入授权使用的模型凭据。
  3. 确认主机只按需暴露 11235,Redis 6379 不对外发布。
  4. 确认 Compose 的只读根文件系统、tmpfs、非 root 用户和能力降级设置未被无理由删除。
  5. 确认输出目录 /var/lib/crawl4ai/outputs 的权限符合内部数据访问策略。
  6. 升级前阅读 v0.9.2、v0.9.0、v0.8.7 等对应发布说明,并在测试站点执行基础抓取、深度抓取和模型提取回归。

Dockerfile 将应用运行用户切换为 appuser,并把应用目录设置为 root 所有且不可写。若自定义 entrypoint、挂载目录或 Compose 覆盖项改变了这些边界,应重新进行权限和持久化风险审查。

版本与维护信息

仓库 README 标注 v0.9.2 为维护补丁版本,修复内容包括流式抓取关闭时 MemoryAdaptiveDispatcher 的任务或页面泄漏、Docker Playground 高级配置、Monitor WebSocket 认证、Playwright headless-shell 打包以及 ENABLE_GPU=true 的 Docker 构建问题。

README 还记录 v0.9.0 的 Docker API 安全默认配置,以及 v0.8.7 的安全加固和抓取、深度抓取、LLM 相关修复。版本选择不能只看仓库 Star 数量;应根据目标环境对浏览器、模型依赖、Docker 安全配置和现有代码兼容性的验证结果决定。

项目地址与资源

以下链接均来自仓库元信息、README 或项目配置,可用于获取源码、文档、发布说明和社区入口。

“Crawl4AI turns the web into clean, LLM ready Markdown for RAG, agents, and data pipelines.”

来源:README