Crawl4AI 教程:3 步搞定免费 AI 友好型网页爬虫
【免费下载链接】crawl4ai🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper. Don't be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai
把网页喂给 RAG 之前,你总得先处理 HTML:去掉导航、广告和排版噪音,再转成模型能读的文本。Crawl4AI 就是一个免费的开源网页爬虫工具,它在真实浏览器里渲染页面,直接输出干净的 Markdown,三行代码就能跑通。
工具定位:Crawl4AI 解决什么问题
如果你用过 requests 加 BeautifulSoup 抓网页,下面几个问题应该很熟悉。Crawl4AI 的思路不是再造一个爬虫,而是把"网页到 AI 数据"这条链路标准化:
- 动态页面:它基于 Playwright 驱动真实浏览器,JavaScript 渲染、懒加载内容都能拿到,而传统 requests 方案只能拿到原始 HTML 骨架。
- 输出格式:抓完直接得到结构化 Markdown,导航、页脚、脚本被自动清理,LLM 可以直接消费,不用自己写清洗规则。
- 结构化提取:内置 LLM 提取策略,用 Pydantic 模型定义字段,返回的是 JSON 而不是待解析的文本。
- 反检测:支持无头指纹伪装和代理配置,应对基础的反爬拦截。
- 服务化:官方 Docker 镜像自带 API 和监控面板,适合生产环境常驻。
快速上手:三步完成第一次抓取
一条命令完成安装
安装分两步:装包,然后执行 setup 初始化浏览器依赖。
pip install -U crawl4ai crawl4ai-setupcrawl4ai-setup会下载 Chromium 内核,首次执行需要几分钟;装完可以跑crawl4ai-doctor自检环境。
跑通首个爬取
下面这段是最小的完整示例,用异步上下文管理器启动爬虫并抓取 example.com。
import asyncio from crawl4ai import AsyncWebCrawler async def main(): async with AsyncWebCrawler() as crawler: result = await crawler.arun(url="https://example.com") print("成功:", result.success) asyncio.run(main())运行后result.success输出True,说明页面抓取完成。
拿到 Markdown 输出
arun返回的CrawlResult对象里,markdown字段就是干净的页面文本。
md = result.markdown print(md[:300]) # 前300个字符你会看到带标题层级的纯文本,没有<div>、没有脚本残留。Crawl4AI 网页爬虫的核心价值就在这里:拿到手的文本可以直接进向量库或提示词。
核心能力实战
精准圈选页面内容:CSS 选择器
整页抓取太吵的时候,用css_selector指定只取哪个区域,选择器写法和普通前端 CSS 一致。
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS, css_selector=".post-content" ) async with AsyncWebCrawler() as crawler: result = await crawler.arun( url="https://en.wikipedia.org/wiki/World_Wide_Web", config=config ) print(result.markdown[:500])预期效果:输出的 Markdown 只包含匹配元素的内部内容,页头和侧边栏不再出现。
LLM 结构化提取:Pydantic 模型配置
当页面里没有规整的表格,而是"散落在段落里的信息",可以让 LLM 按你定义的 Pydantic 模型抽取,返回解析好的 JSON。
import os from pydantic import BaseModel, Field from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, LLMExtractionStrategy, LLMConfig class Recipe(BaseModel): name: str = Field(description="菜名") time: str = Field(description="烹饪时间") strategy = LLMExtractionStrategy( llm_config=LLMConfig(provider="openai/gpt-4o-mini", api_token=os.getenv("OPENAI_API_KEY")), schema=Recipe.model_json_schema(), instruction="从页面中提取菜名和烹饪时间" ) config = CrawlerRunConfig(extraction_strategy=strategy)配置里只需要三样:模型 provider、字段 schema、一句提取指令。跑完后result.extracted_content就是符合模型的 JSON 列表。
多页深度爬取:BFS 策略配置
抓一个入口页容易,沿链接抓一个栏目就麻烦了。深度爬取策略封装了链接发现、去重和过滤,BFS 会逐层向外扩展。
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig from crawl4ai.deep_crawling import BFSDeepCrawlStrategy strategy = BFSDeepCrawlStrategy(max_depth=2, max_pages=20) config = CrawlerRunConfig(deep_crawl_strategy=strategy) async with AsyncWebCrawler() as crawler: results = await crawler.arun( url="https://en.wikipedia.org/wiki/Python_(programming_language)", config=config ) print("共抓取", len(results), "个页面")max_depth控制向外扩展层数,max_pages防止失控。需要只看同域链接时,可以在策略里加SameDomainFilter过滤链。
反检测与代理:浏览器配置
部分站点会拦截默认浏览器指纹或机房 IP。代理和反检测参数放在BrowserConfig里,与单次抓取的CrawlerRunConfig分开管理。
from crawl4ai import BrowserConfig, ProxyConfig browser_config = BrowserConfig( headless=True, proxy_config=ProxyConfig( server="http://proxy.example.com:8080", username="user", password="pass" ) ) async with AsyncWebCrawler(browser_config=browser_config) as crawler: result = await crawler.arun(url="https://example.com")预期效果:所有请求经由代理出口,配合无头模式运行,基础 IP 封禁和指纹识别场景下成功率明显提升。
生产实践:Docker 部署与性能调优
Docker 镜像自带抓取 API、任务监控面板,两条命令即可起服务。
docker pull unclecode/crawl4ai:latest docker run -d -p 11235:11235 --name crawl4ai --shm-size=1g unclecode/crawl4ai:latest起来后访问http://localhost:11235,监控面板和 API 文档在同一入口,适合用--shm-size=1g给浏览器共享内存留足空间。
几个调优要点:
- 并发控制:
AsyncWebCrawler默认有并发上限,批量任务用arun_many(urls=[...])一次提交,由内置调度器按内存压力自适应排队,别自己开大量独立实例。 - 重试与超时:在
CrawlerRunConfig里设置timeout(毫秒)和max_retries,对不稳定的站点先重试再降级到 HTTP 直连策略。 - 缓存策略:重复爬取同一批 URL 时保持
CacheMode.ENABLED并调大cache_ttl,命中缓存的请求基本零开销;调试期用CacheMode.BYPASS避免读到旧数据。 - 资源监控:生产环境挂
CrawlerMonitor,观察浏览器上下文数量和内存占用,上下文数异常增长时优先检查是否有页面泄漏。 - 内存收敛:不需要截图和媒体就别开,
screenshot=False、extract_media=False能显著降低单次抓取内存峰值。
避坑指南:常见问题
Q:安装后浏览器报错或白屏?手动补齐 Playwright 依赖:python -m playwright install --with-deps chromium装完重跑crawl4ai-doctor确认环境状态。
Q:Markdown 里噪音太多?CrawlerRunConfig传excluded_tags=["nav", "footer", "aside"]排除指定标签; 仍不理想就换内容过滤策略(如PruningContentFilter)按密度剪枝。
Q:同一批 URL 反复抓太慢?开启缓存:cache_mode=CacheMode.ENABLED并设置cache_ttl=3600。 注意调试期间切回BYPASS,否则改动页面后拿到的还是旧内容。
Q:目标站点返回 403 或人机验证?换use_undetected无头模式并挂代理,magic=True可让工具自动选择更稳的组合; 验证类站点建议直接接入第三方打码服务,不要硬刚。
写在最后
Crawl4AI 把"渲染—清洗—转换"这三件脏活打包成了一次arun调用,新手从 Markdown 输出起步,进阶再上 LLM 提取和深度爬取,路径是顺的。
下一步建议:把上面第一个示例里的example.com换成你手头真正需要的页面,跑通后接着试 CSS 选择器这一节。
- 快速开始文档:
docs/md_v2/core/quickstart.md - 参数参考:
docs/md_v2/api/parameters.md - LLM 提取示例:
docs/examples/llm_extraction_openai_pricing.py - 快速上手示例:
docs/examples/quickstart.py - 核心源码:
crawl4ai/async_webcrawler.py、crawl4ai/deep_crawling/ - Docker 部署说明:
deploy/docker/README.md
【免费下载链接】crawl4ai🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper. Don't be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考