首页
/ Crawl4AI 深度实战指南:从 LLM 友好 Markdown 生成到 Docker 安全部署的完整技术解析

Crawl4AI 深度实战指南:从 LLM 友好 Markdown 生成到 Docker 安全部署的完整技术解析

2026-09-05 18:59:48作者:农烁颖Land

Crawl4AI 是一个面向 LLM 场景的开源 Python 网页爬虫与抓取框架,核心目标是将网页转换为可直接用于 RAG、AI Agent 和数据管线的干净 Markdown。本篇基于仓库根目录 README.md 的完整内容,结合 crawl4ai/ 源码与 deploy/docker/ 部署实现,系统讲解安装配置、arun/arun_many API、四种缓存模式、启发式 Markdown 过滤、无 LLM 与 LLM 两种结构化提取、Docker 服务端部署与 v0.9.0 安全加固等核心内容,读完即可在本地或容器中搭建可复用的 LLM 友好数据抓取管线。

项目定位与当前版本

Crawl4AI 解决的核心问题是:爬虫输出与 LLM 输入之间的"格式鸿沟"。传统爬虫返回原始 HTML,需要大量后处理;而 Crawl4AI 直接把网页清洗为带标题、表格、代码块和引用标注的 Markdown,并在此基础上提供结构化数据提取、深度爬取、浏览器完全控制与 Docker 化服务部署能力。

crawl4ai/version.py 可以看到,当前仓库的稳定版本为 0.9.0,README 中标注其为"Secure-by-Default Docker Server"安全发布:自托管 Docker API 默认开启认证、默认绑定回环地址、请求体被视为不可信的信任边界,而 pip 安装的库(SDK / 进程内使用方式)保持不变。README 开头的"New in v0.9"提示:如果你自托管了 Docker API,升级前应先阅读 deploy/docker/MIGRATION.md 迁移指南。

README 归纳了项目被开发者选中的五个理由,对应源码中的主要模块:

卖点 对应实现
LLM 就绪输出(干净 Markdown、表格、代码、引用标注) crawl4ai/markdown_generation_strategy.pycrawl4ai/content_filter_strategy.py
异步浏览器池 + 缓存 + 最小跳转 crawl4ai/browser_manager.pycrawl4ai/cache_context.py
会话、代理、Cookie、用户脚本、Hooks 全控制 crawl4ai/async_configs.pycrawl4ai/proxy_strategy.py
自适应智能(学习站点模式、只探索相关内容) crawl4ai/adaptive_crawler.py
CLI 与 Docker 部署、零密钥 crawl4ai/cli.pydeploy/docker/server.py

安装:pip、可选依赖与 Docker 两种方式

README 提供了三档 pip 安装路径,全部命令可直接复制运行。

基本安装

pip install -U crawl4ai        # 安装/升级包
pip install crawl4ai --pre    # 如需预发布版本
crawl4ai-setup                # 执行安装后初始化(主要安装并配置 Playwright 浏览器)
crawl4ai-doctor               # 验证安装状态

这些命令并非 README 的凭空描述,而是 pyproject.toml[project.scripts] 段注册的控制台入口:

[project.scripts]
crawl4ai-download-models = "crawl4ai.model_loader:main"
crawl4ai-migrate = "crawl4ai.migrations:main"
crawl4ai-setup = "crawl4ai.install:post_install"
crawl4ai-doctor = "crawl4ai.install:doctor"
crwl = "crawl4ai.cli:main"

也就是说 crawl4ai-setup 实际调用 crawl4ai/install.py 中的 post_install()crawl4ai-doctor 调用同文件的 doctor()crwl 命令则进入 crawl4ai/cli.py 的主入口。

默认安装的是基于 Playwright 的异步版本。若遇到浏览器相关问题,可手动安装:

python -m playwright install --with-deps chromium

其他安装选项

  • 同步版本(已弃用)pip install crawl4ai[sync]。README 明确说明同步版(基于 Selenium)已弃用并将在未来版本移除,新项目应使用异步 API。
  • 开发安装(需要修改源码的贡献者):
git clone <仓库地址>
cd crawl4ai
pip install -e .                    # 可编辑模式基本安装
pip install -e ".[torch]"           # 附加 PyTorch 能力
pip install -e ".[transformer]"     # 附加 Transformer 能力
pip install -e ".[cosine]"          # 附加余弦相似度能力
pip install -e ".[sync]"            # 附加同步爬虫(Selenium)
pip install -e ".[all]"             # 安装全部可选能力

Docker 部署

Docker 镜像内置了重新设计的 FastAPI 服务,功能包括实时监控面板、带页面预热(pre-warming)的浏览器池、交互式 playground、MCP 集成、HTML 提取/截图/PDF 生成/JS 执行等完整 API 端点,以及多架构自动检测与内存优化。

docker pull unclecode/crawl4ai:latest
docker run -d -p 11235:11235 --name crawl4ai --shm-size=1g unclecode/crawl4ai:latest

# 监控面板:http://localhost:11235/dashboard
# Playground:http://localhost:11235/playground

服务端的任务提交采用"同步返回结果或返回 task_id 轮询"的双模式,README 给出的验证脚本如下:

import requests

# 提交爬取任务
response = requests.post(
    "http://localhost:11235/crawl",
    json={"urls": ["https://example.com"], "priority": 10}
)
if response.status_code == 200:
    print("Crawl job submitted successfully.")

if "results" in response.json():
    results = response.json()["results"]
    print("Crawl job completed. Results:")
    for result in results:
        print(result)
else:
    task_id = response.json()["task_id"]
    print(f"Crawl job submitted. Task ID:: {task_id}")
    result = requests.get(f"http://localhost:11235/task/{task_id}")

从源码结构看,服务端实现位于 deploy/docker/server.py,浏览器池调度在 deploy/docker/crawler_pool.py,监控 REST 接口在 deploy/docker/monitor_routes.py,v0.9.0 的安全默认值(认证、信任边界、CORS 拒绝、Redis 回环绑定)则集中体现在 deploy/docker/auth_gate.pydeploy/docker/server.py 中,迁移细节见 deploy/docker/MIGRATION.md。更完整的调用示例可参考 docs/examples/docker_example.py

快速上手:Python API 与 CLI 两条路径

Python 最小示例

import asyncio
from crawl4ai import *

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

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

AsyncWebCrawler 定义于 crawl4ai/async_webcrawler.py。其构造签名为 __init__(crawler_strategy=None, config: BrowserConfig=None, base_directory=..., thread_safe=False, logger=None, **kwargs),其中 base_directory 可通过环境变量 CRAWL4_AI_BASE_DIRECTORY 覆盖,默认为用户主目录——这是缓存与浏览器 profile 的落盘根目录。arun(url, config, **kwargs) 返回 CrawlResultContainer(定义于 crawl4ai/models.py),arun_many(urls, config, dispatcher, ...) 则支持批量 URL 与多种调度器。

CLI:crwl

README 给出的三条常用 CLI 命令:

# 基本抓取,输出 Markdown
crwl https://www.nbcnews.com/business -o markdown

# 深度爬取:BFS 策略,最多 10 页
crwl https://docs.crawl4ai.com --deep-crawl bfs --max-pages 10

# 使用 LLM 提取并附带问题
crwl https://www.example.com/products -q "Extract all product prices"

CLI 入口对应 crawl4ai/cli.py,深度爬取参数最终会路由到 crawl4ai/deep_crawling/bfs_strategy.pydfs_strategy.pybff_strategy.py 三个策略实现。

核心配置对象:读懂 arun 背后的两类 Config

Crawl4AI 的配置体系是两大类的组合,源码位于 crawl4ai/async_configs.py

  • BrowserConfig(第 669 行起):管"浏览器怎么起"。文档字符串列出的关键属性包括:browser_typechromium/firefox/webkit,默认 chromium)、headless(默认 True)、browser_modebuiltin/dedicated/cdp/docker 四种模式,默认 dedicated)、cdp_url(默认 ws://localhost:9222/devtools/browser/)、browser_context_id 等。
  • CrawlerRunConfig(第 1330 行起):管"每次抓取怎么做"。文档字符串注明它集中了原先散落在 arun() 的 kwargs,覆盖深度爬取策略、内容处理阈值(word_count_threshold 默认 MIN_WORD_THRESHOLD,通常为 200)、提取策略、分块策略、Markdown 生成器、CSS 选择器、缓存行为等。

CacheMode:四种缓存模式

缓存行为由 crawl4ai/cache_context.py 中的 CacheMode 枚举定义,README 示例中出现的四种取值语义为:

模式 行为 典型场景
ENABLED 读 + 写缓存 常规抓取
DISABLED 完全不缓存 调试
READ_ONLY 只读不写 复用他人写入的缓存
WRITE_ONLY 只写不读 文档站等静态内容的批量预热
BYPASS 绕过缓存(强制刷新) 新闻、博客等高频变化内容

WRITE_ONLYBYPASS 的组合用法在 v0.7.3 的"多配置路由"示例中得到体现(后文详述)。

高级用法一:启发式 Markdown 生成(Clean / Fit Markdown)

README 的第一个高级示例展示了如何用内容过滤器把页面 Markdown 压缩为 AI 友好的"Fit Markdown":

import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai.content_filter_strategy import PruningContentFilter, BM25ContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator

async def main():
    browser_config = BrowserConfig(
        headless=True,
        verbose=True,
    )
    run_config = CrawlerRunConfig(
        cache_mode=CacheMode.ENABLED,
        markdown_generator=DefaultMarkdownGenerator(
            content_filter=PruningContentFilter(threshold=0.48, threshold_type="fixed", min_word_threshold=0)
        ),
        # 备选:基于用户查询的 BM25 过滤
        # markdown_generator=DefaultMarkdownGenerator(
        #     content_filter=BM25ContentFilter(user_query="WHEN_WE_FOCUS_BASED_ON_A_USER_QUERY", bm25_threshold=1.0)
        # ),
    )

    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url="https://docs.micronaut.io/4.9.9/guide/",
            config=run_config
        )
        print(len(result.markdown.raw_markdown))
        print(len(result.markdown.fit_markdown))

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

示例输出的 raw_markdownfit_markdown 长度差,直观体现了过滤效果。从源码结构看:DefaultMarkdownGenerator 实现在 crawl4ai/markdown_generation_strategy.pyPruningContentFilterBM25ContentFiltercrawl4ai/content_filter_strategy.py 中实现;其中 BM25 变体按用户查询计算词频相关性,bm25_threshold 控制保留门槛,这与 README 功能列表中"BM25 算法提取核心信息"一一对应。markdown 字段的 StringCompatibleMarkdown 包装(见 models.py 中的说明注释)保证了老代码把 result.markdown 当字符串用依然兼容,同时暴露 raw_markdownfit_markdown 等结构化属性。

README 的功能清单中,Markdown 生成还包括:链接转带编号的引用列表、自定义生成策略(实现自己的 MarkdownGenerationStrategy 即可替换)、以及标签/元数据驱动的内容提取。

高级用法二:执行 JavaScript 与无 LLM 的结构化提取

当页面内容是 JS 动态渲染的(例如 Tab 切换后才显示的课程列表),可以组合 js_codeJsonCssExtractionStrategy,全程不调用 LLM:

import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
from crawl4ai import JsonCssExtractionStrategy
import json

async def main():
    schema = {
        "name": "KidoCode Courses",
        "baseSelector": "section.charge-methodology .w-tab-content > div",
        "fields": [
            {"name": "section_title", "selector": "h3.heading-50", "type": "text"},
            {"name": "section_description", "selector": ".charge-content", "type": "text"},
            {"name": "course_name", "selector": ".text-block-93", "type": "text"},
            {"name": "course_description", "selector": ".course-content-text", "type": "text"},
            {"name": "course_icon", "selector": ".image-92", "type": "attribute", "attribute": "src"}
        ]
    }

    extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)

    browser_config = BrowserConfig(headless=False, verbose=True)
    run_config = CrawlerRunConfig(
        extraction_strategy=extraction_strategy,
        js_code=["""(async () => {const tabs = document.querySelectorAll("section.charge-methodology .tabs-menu-3 > div");for(let tab of tabs) {tab.scrollIntoView();tab.click();await new Promise(r => setTimeout(r, 500));}})();"""],
        cache_mode=CacheMode.BYPASS
    )

    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url="https://www.kidocode.com/degrees/technology",
            config=run_config
        )

        companies = json.loads(result.extracted_content)
        print(f"Successfully extracted {len(companies)} companies")
        print(json.dumps(companies[0], indent=2))

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

关键点:schemabaseSelector(重复单元的定位选择器)加若干 fieldstext 取文本、attribute 取属性值)组成;js_code 列表在页面加载后注入执行,此处逐个点击 Tab 使隐藏内容进入 DOM;最终 JSON 字符串落在 result.extracted_content。该策略的实现位于 crawl4ai/extraction_strategy.pyCrawlResult.extracted_content 字段定义见 crawl4ai/models.py。同文件还包含正则提取(CosineExtraction 系列)等无 LLM 方案,README 功能列表中对应"CSS-Based Extraction"与"Schema Definition"两条。

高级用法三:基于 LLM 的结构化提取

需要语义理解时,改用 LLMExtractionStrategy,配合 Pydantic 模型声明输出结构:

import os
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode, LLMConfig
from crawl4ai import LLMExtractionStrategy
from pydantic import BaseModel, Field

class OpenAIModelFee(BaseModel):
    model_name: str = Field(..., description="Name of the OpenAI model.")
    input_fee: str = Field(..., description="Fee for input token for the OpenAI model.")
    output_fee: str = Field(..., description="Fee for output token for the OpenAI model.")

async def main():
    browser_config = BrowserConfig(verbose=True)
    run_config = CrawlerRunConfig(
        word_count_threshold=1,
        extraction_strategy=LLMExtractionStrategy(
            # 支持 Litellm 覆盖的任意提供商,例如本地 Ollama:
            # provider="ollama/qwen2", api_token="no-token",
            llm_config=LLMConfig(provider="openai/gpt-4o", api_token=os.getenv('OPENAI_API_KEY')),
            schema=OpenAIModelFee.schema(),
            extraction_type="schema",
            instruction="""From the crawled content, extract all mentioned model names along with their fees for input and output tokens.
            Do not miss any models in the entire content. One extracted model JSON format should look like this:
            {"model_name": "GPT-4", "input_fee": "US$10.00 / 1M tokens", "output_fee": "US$30.00 / 1M tokens"}."""
        ),
        cache_mode=CacheMode.BYPASS,
    )

    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url='https://openai.com/api/pricing/',
            config=run_config
        )
        print(result.extracted_content)

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

参数说明:extraction_type="schema" 表示按 Pydantic schema 输出;instruction 是附加给 LLM 的自然语言指令;word_count_threshold=1 降低了最小词数门槛(默认约 200),保证短页面也能进入提取。从源码结构看,LLMExtractionStrategy 内部通过 Litellm 路由到不同提供商(注意 v0.8.6 因供应链事件改用 unclecode-litellm 发行版);v0.7.8 起 LLMConfig 新增 backoff_base_delaybackoff_max_attemptsbackoff_exponential_factor 三个重试退避参数,且 LLMExtractionStrategy 支持 input_format="html" / "markdown" / "fit_markdown" 指定喂给 LLM 的内容形态。LLM 提取的实现见 crawl4ai/extraction_strategy.py,提示词模板在 crawl4ai/prompts.py

高级用法四:自定义用户 profile 的持久化浏览器

针对登录态、Cookie 与反爬较严的站点,可用 use_persistent_context=True + 用户数据目录复用浏览器身份,并通过 magic=True 让爬虫自动重试与处理:

import os, sys
from pathlib import Path
import asyncio, time
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode

async def test_news_crawl():
    # 创建持久化用户数据目录
    user_data_dir = os.path.join(Path.home(), ".crawl4ai", "browser_profile")
    os.makedirs(user_data_dir, exist_ok=True)

    browser_config = BrowserConfig(
        verbose=True,
        headless=True,
        user_data_dir=user_data_dir,
        use_persistent_context=True,
    )
    run_config = CrawlerRunConfig(cache_mode=CacheMode.BYPASS)

    async with AsyncWebCrawler(config=browser_config) as crawler:
        url = "ADDRESS_OF_A_CHALLENGING_WEBSITE"

        result = await crawler.arun(url, config=run_config, magic=True)

        print(f"Successfully crawled {url}")
        print(f"Content length: {len(result.markdown)}")

README 同时提示:若目标站点有 CAPTCHA,可评估接入第三方打码服务(如 README Tip 提到的 CapSolver,支持 reCAPTCHA v2/v3、Cloudflare Turnstile、AWS WAF 等),仓库内 docs/examples/capsolver_captcha_solver/ 提供了 API 与浏览器扩展两种集成方式的完整示例代码。使用时须遵守目标站点服务条款与适用法律。

功能矩阵:README 能力清单与源码位置对照

README 的 Features 区块列了六大类能力,逐条映射到仓库源码便于延伸阅读:

能力分类 具体能力 源码/示例位置
Markdown 生成 干净 Markdown、Fit 过滤、引用列表、自定义策略、BM25 markdown_generation_strategy.pycontent_filter_strategy.py
结构化提取 LLM 提取、分块策略(主题/正则/句子)、余弦相似度、CSS/XPath 提取、Schema 定义 extraction_strategy.pychunking_strategy.py
浏览器集成 托管浏览器、CDP 远程连接、持久化 Profile、会话管理、代理、请求头/Cookie/UA 全控制、Chromium/Firefox/WebKit、动态视口 async_configs.pybrowser_manager.pybrowser_profiler.pyproxy_strategy.py
爬取与抓取 媒体(含 srcset/picture)、JS 执行与等待、截图、raw:/file:// 直读、全量链接提取(含 iframe)、Hooks(字符串与函数双 API)、缓存、元数据、懒加载等待、全页滚动扫描 async_crawler_strategy.pyasync_dispatcher.py
部署 Docker + FastAPI、JWT 认证、API 网关、多平台云部署配置 deploy/docker/
附加能力 隐身模式(Stealth)、标签定向提取、链接分析、健壮错误处理、CORS 与静态服务 antibot_detector.pylink_preview.pydomain_mapper.py

其中 CrawlResultcrawl4ai/models.py)的字段集本身就是能力清单:htmlfit_htmlcleaned_htmlmarkdownmedialinksscreenshotpdfmhtmlextracted_contentmetadatanetwork_requestsconsole_messagestablesstatus_code/redirected_url、缓存校验元数据(head_fingerprintcache_status)以及反爬重试统计 crawl_stats 等,覆盖了"抓取一次拿到什么"的全部维度。

深度爬取与抗反爬:跨版本积累的关键能力

README 的 Recent Updates 区块浓缩了多个版本的重要能力,这里按主题归并(每个版本的完整说明见 docs/blog/release-v0.9.0.mdrelease-v0.8.7.mdrelease-v0.8.5.mdrelease-v0.8.0.mdrelease-v0.7.7.md 等发布说明):

崩溃恢复与 Prefetch 模式(v0.8.0)

深度爬取可断点续跑:on_state_change 回调在每个 URL 处理后触发,resume_state 参数可从存档检查点继续;状态是 JSON 可序列化的,可直接落 Redis 或数据库:

from crawl4ai.deep_crawling import BFSDeepCrawlStrategy

strategy = BFSDeepCrawlStrategy(
    max_depth=3,
    resume_state=saved_state,        # 从检查点继续
    on_state_change=save_to_redis,   # 每处理完一个 URL 触发
)

配套的 prefetch=True 模式跳过 Markdown、提取与媒体处理,仅返回 HTML 和链接,README 称其比全量处理快 5-10 倍,适合"先发现、再选择处理"的两阶段爬取:

config = CrawlerRunConfig(prefetch=True)
result = await crawler.arun("https://example.com", config=config)
# 只返回 HTML 与链接,不生成 Markdown

该两阶段流程的完整演示见 docs/examples/prefetch_two_phase_crawl.py

反爬检测与代理升级(v0.8.5)

三层检测(已知厂商指纹、通用拦截特征、结构完整性检查)加自动代理链重试:

from crawl4ai import CrawlerRunConfig
from crawl4ai.async_configs import ProxyConfig

config = CrawlerRunConfig(
    proxy_config=[ProxyConfig.DIRECT, ProxyConfig(server="http://my-proxy:8080")],
    max_retries=2,
    fallback_fetch_function=my_web_unlocker,   # 兜底解锁函数
)

同版本还提供 Shadow DOM 扁平化(CrawlerRunConfig(flatten_shadow_dom=True),对应 crawl4ai/js_snippet/flatten_shadow_dom.js)、cancel()/should_cancel 的深度爬取优雅取消,以及 set_defaults() / get_defaults() / reset_defaults() 的配置默认值 API。反爬检测核心逻辑在 crawl4ai/antibot_detector.py

多配置路由与未检测浏览器(v0.7.3)

arun_many 接受一个 CrawlerRunConfig 列表,按 url_matcher(通配符或函数)自动为每个 URL 路由到匹配的配置:

from crawl4ai import CrawlerRunConfig, MatchMode, CacheMode

configs = [
    # 文档站:激进缓存
    CrawlerRunConfig(
        url_matcher=["*docs*", "*documentation*"],
        cache_mode=CacheMode.WRITE_ONLY,
        markdown_generator_options={"include_links": True}
    ),
    # 新闻/博客:永远取新内容
    CrawlerRunConfig(
        url_matcher=lambda url: 'blog' in url or 'news' in url,
        cache_mode=CacheMode.BYPASS
    ),
    # 兜底配置
    CrawlerRunConfig()
]

results = await crawler.arun_many(urls, config=configs)
# 每个 URL 自动获得匹配的配置

配合 browser_type="undetected" 可启动未检测 Chrome(README 示例附带 --disable-blink-features=AutomationControlledextra_args),对应示例目录 docs/examples/undetectability/

监控、Hook 与表格提取(v0.7.7 / v0.7.5 / v0.7.4)

  • 监控/dashboard 面板与 /monitor/health/monitor/requests/monitor/browsers/monitor/endpoints/stats 等 REST 端点,WebSocket 每 2 秒推送,浏览器池采用 permanent/hot/cold 三层架构并带 Janitor 自动清理——实现位于 deploy/docker/monitor.pydeploy/docker/monitor_routes.py
  • Hook 系统:函数式 Hook 写普通 Python 函数后经 hooks_to_string()Crawl4aiDockerClient 自动转换传给 Docker API;注意 v0.9.0 起 Docker 服务端的 Hook 改为声明式(declarative),请求体中的自定义 Hook 代码通道已被移除,详见迁移指南 deploy/docker/MIGRATION.md
  • LLMTableExtraction:大表智能分块(enable_chunkingchunk_token_thresholdoverlap_threshold),实现见 crawl4ai/table_extraction.py;结果通过 result.tables[{headers, rows, caption, summary}])直接转 DataFrame。

v0.9.0 安全默认值与升级注意事项

当前仓库 HEAD 即 v0.9.0,这是对自托管 Docker API 的一次破坏性升级(仅影响服务端,pip 库不变)。README 强调的防御纵深包括:

  1. 认证默认开启:不显式配置 token 时服务器绑定回环地址,外部不可达;
  2. 信任边界重构:请求体视为不可信,output_path 被制品库(artifact store)取代,杜绝任意文件写;
  3. 请求内浏览器内省与 Hook 代码通道移除,Hook 改为声明式;
  4. TLS 校验默认开启、CORS 默认拒绝、Redis 加密码且仅监听回环

此前 v0.8.7 修复了 Docker API 的一系列严重漏洞(AST 沙箱逃逸 RCE、Hook 沙箱 RCE、硬编码 JWT 密钥、webhook 与 crawl 端点 SSRF、任意文件写、监控认证绕过、存储型 XSS、未授权 JS 执行)并引入 DomainMapper(crawl4ai/domain_mapper.py);v0.8.6 因 PyPI 供应链投毒将 litellm 替换为 unclecode-litellm。相关安全细节与草稿文档可参考 deploy/docker/SECURITY-VERIFY.mddocs/security/GHSA-DRAFT-RCE-LFI.md,安全测试套件在 deploy/docker/tests/(如 test_security_ssrf_crawl.pytest_security_authz.py)。结论:如果你在运行 v0.8.x 的自托管 Docker API,升级前务必逐条对照 deploy/docker/MIGRATION.md

版本规则、许可与引用

版本号约定(PEP 440)

  • 稳定版:pip install -U crawl4ai
  • 预发布版:pip install crawl4ai --pre(后缀 dev/a/b/rc 依次代表开发版、Alpha、Beta、候选版)
  • 指定版本:pip install crawl4ai==0.4.3b1
  • 官方建议:生产环境使用稳定版,功能尝鲜再用 --pre

许可证与署名

项目采用 Apache License 2.0(见 LICENSE),README 要求使用者通过徽章或文字方式署名,徽章资源位于 docs/assets/powered-by-disco.svgpowered-by-night.svg 等四种主题)。

引用格式

@software{crawl4ai2024,
  author = {UncleCode},
  title = {Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper},
  year = {2024},
  publisher = {GitHub},
  journal = {GitHub Repository},
  commit = {Please use the commit hash you're working with}
}

延伸阅读地图

掌握本文后,你可以按"安装 → arun 单页抓取 → 内容过滤/结构化提取 → 深度爬取与断点续跑 → Docker 化多租户服务"的路径,逐步把 Crawl4AI 从开发机上的脚本工具升级为生产环境中带认证、监控与浏览器池的安全抓取服务。

登录后查看全文
热门项目推荐
相关项目推荐