☰
Crawl4AI 完整教程:5分钟把网页变成大模型能直接用的数据
2026/11/3 16:06:53 网站建设 项目流程

Crawl4AI 完整教程:5分钟把网页变成大模型能直接用的数据

【免费下载链接】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

Crawl4AI 是一个开源的、面向大模型的网页爬虫与抓取工具:它用无头浏览器渲染页面,自动把 HTML 转换成干净的 Markdown,并提供 CSS 选择器提取和 LLM 结构化提取两条数据出口。它面向做 RAG、AI Agent 和数据管道的开发者,解决动态页面抓不全、HTML 清洗费时、结构化字段难提取这三类问题。

装好并验证只需一条命令

pip install -U crawl4ai && crawl4ai-setup && crawl4ai-doctor

三条命令串起来:安装库、安装 Playwright 浏览器内核、体检环境。crawl4ai-doctor会检查浏览器、系统依赖是否就绪,有缺项会直接给出修复建议,装完先跑它比装出问题再排查省事得多。

跑通第一次抓取:

import asyncio from crawl4ai import AsyncWebCrawler async def main(): # 默认启动无头 Chromium,自动渲染并生成 Markdown async with AsyncWebCrawler() as crawler: result = await crawler.arun("https://example.com") print(result.markdown[:300]) # 打印转换后的前300字符 asyncio.run(main())

所有行为由两个配置对象控制:BrowserConfig管浏览器(内核、代理、指纹),CrawlerRunConfig管单次抓取(缓存、提取策略、超时、注入的 JS)。下面四个场景都围绕这两个对象展开。

场景一:单页抓取,顺手清掉噪音

新闻、博客类页面里导航和侧栏占了大量篇幅。给配置挂上PruningContentFilter,它会按文本密度剪枝,输出一份更适合喂给 LLM 的精简 Markdown:

from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode from crawl4ai.content_filter_strategy import PruningContentFilter from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS, excluded_tags=["nav", "footer", "aside"], # 先按标签剔除 markdown_generator=DefaultMarkdownGenerator( content_filter=PruningContentFilter( threshold=0.48, threshold_type="fixed" # 文本密度过滤阈值 ) ), ) async with AsyncWebCrawler() as crawler: result = await crawler.arun("https://en.wikipedia.org/wiki/Apple", config=config) print(result.markdown.fit_markdown) # 剪枝后的正文

注意result.markdown里有两个版本:raw_markdown是原始转换结果,fit_markdown是过完内容过滤器后的结果。过滤器大约增加 50ms 处理时间,重复抓取时可以改cache_mode=CacheMode.ENABLED走缓存省时间。

场景二:用 CSS 选择器只取目标区域

整页都拿回来再清洗,不如一开始就只取需要的部分。css_selector参数让 Markdown 生成只作用于选中区域:

config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS, css_selector=".article-content" # 只提取该选择器匹配的内容 ) async with AsyncWebCrawler() as crawler: result = await crawler.arun("https://techcrunch.com", config=config) print(result.markdown[:1000])

如果目标是"结构化 JSON"而不是一段文本,可以用JsonCssExtractionStrategy定义一个 schema(基础选择器 + 字段级选择器),result.extracted_content直接返回 JSON 数组,不需要 LLM 参与,速度快且结果稳定。适合商品列表、文章列表这类重复结构的页面。

场景三:让 LLM 自动输出结构化字段

页面结构不规律、或者字段本身需要"理解"(比如从描述里判断价格)时,换 LLM 提取:用 Pydantic 模型描述想要什么,把 schema 交给LLMExtractionStrategy。

import os from pydantic import BaseModel, Field from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, LLMConfig, CacheMode from crawl4ai.extraction_strategy import LLMExtractionStrategy class Product(BaseModel): name: str = Field(..., description="产品名称") price: str = Field(..., description="产品价格") config = CrawlerRunConfig( cache_mode=CacheMode.BYPASS, extraction_strategy=LLMExtractionStrategy( llm_config=LLMConfig(provider="openai/gpt-4o-mini", api_token=os.getenv("OPENAI_API_KEY")), schema=Product.model_json_schema(), # 由 Pydantic 模型生成 instruction="从页面中提取所有产品信息", ), ) async with AsyncWebCrawler() as crawler: result = await crawler.arun("https://www.amazon.com/s?k=laptop", config=config) print(result.extracted_content) # 结构化 JSON

provider支持 OpenAI、Anthropic、DeepSeek、Ollama 等多种接入方式,本地模型和云端模型可以在同一套代码里切换。

场景四:跑成一个常驻服务

个人脚本之外,更常见的生产形态是把 Crawl4AI 装进 Docker,对外暴露 REST API,配一个浏览器池管理并发:

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

容器起来后,http://localhost:11235提供服务:/crawl抓取单页、/crawl/stream流式抓取,另有截图、PDF 导出、LLM 提取等端点;浏览器访问/dashboard是监控面板,/playground是交互式调试台。多容器横向扩展时,可以结合 deploy/docker/ 目录下的config.yml配置 JWT 认证和浏览器池参数。

值得知道的几个关键配置

  • 反检测:BrowserConfig(use_undetected_browser=True)启用反指纹内核;user_agent_mode="random"随机 User-Agent;配合代理字典proxy_config={"server": ..., "username": ..., "password": ...}做轮换,应对拦截类站点。
  • 深度爬取:BFSDeepCrawlStrategy/DFSDeepCrawlStrategy从入口页按层或按路径展开,用max_depth、max_pages、same_domain控制边界,源码见 crawl4ai/deep_crawling/。
  • 批量抓取:arun_many(urls)一次提交多个 URL,内部自动并发和限流,比手写任务循环更省心。
  • 动态内容:js_code注入点击/滚动脚本,wait_for等待条件成立再取页面,session_id可以在多次抓取间保持登录态。

常见坑:现象、原因与解法

现象:安装后第一次运行报浏览器相关错误。原因:pip install只装 Python 包,系统级浏览器依赖和 Chromium 需要单独安装。 解法:重跑crawl4ai-doctor,或直接python -m playwright install --with-deps chromium补齐依赖。

现象:抓回来的 Markdown 明显缺内容,只有首屏。原因:内容是 JS 延迟加载的,页面还没加载完就取了 HTML。 解法:用js_code执行点击/滚动,配合wait_for或delay_before_return_html等待内容出现后再返回。

现象:目标站点频繁返回验证页或拒绝连接。原因:浏览器指纹暴露(headless 特征、固定 UA、IP 复用)。 解法:开use_undetected_browser,叠加随机 UA 和代理轮换;仍被拦则考虑降低频率。

现象:批量抓取时内存飙高。原因:无头浏览器按并发数各占一份内存。 解法:控制arun_many的并发规模,CacheMode.ENABLED让重复 URL 走缓存,调试完关掉不必要的截图和媒体提取。

接下来可以做什么

  • 完整入门教程(含动态页面示例):docs/md_v2/core/quickstart.md
  • LLM 提取的完整示例:docs/examples/llm_extraction_openai_pricing.py
  • 提取策略源码:crawl4ai/extraction_strategy.py
  • Docker 部署与 API 说明:deploy/docker/README.md

最实际的第一步:把上面"场景一"的代码改成你要抓的那个页面,看看fit_markdown的输出质量,再决定要不要上 CSS 提取或 LLM 提取。

本文基于 v0.9.0 版本编写,功能变动详见 CHANGELOG.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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询