crawl4ai 从零到上手GitHub 排名第一的开源 AI 爬虫5 行代码抓取任意网页你有没有遇到过这种情况——想抓一个网页的内容给 ChatGPT 分析结果复制过来的 HTML 里面全是div、script、广告和导航栏真正有用的内容只有中间那几百个字。传统的爬虫方案是写 requests → 解析 HTML → 写正则 → 调 BeautifulSoup → 处理 JS 渲染 → 清理格式 → 转 Markdown。一套流程下来少说几十行代码还得处理反爬、验证码、动态加载这些坑。今天要介绍的这个工具——crawl4ai就是来解决这个问题的。它是目前 GitHub 上排名第一的爬虫项目做到了一件事把任意网页变成干净的 Markdown 文本直接喂给 LLM。我花了半天时间把它从头跑了一遍这篇文章就是完整的实战记录。这东西到底解决了什么问题在 AI 时代爬虫的需求变了。以前我们抓数据是为了存数据库、做分析。现在的典型场景是把一篇技术博客抓下来让 AI 帮你总结要点构建 RAG检索增强生成知识库需要把几十个网页转成纯文本AI Agent 需要实时搜索网页然后根据内容做决策这些场景有一个共同点你要的不是 HTML是干净的、结构化的文本。crawl4ai 就是为这个场景设计的。它不是传统的爬虫框架而是一个「LLM 友好的网页转换器」。它能自动识别网页的主要内容区域去掉导航栏、广告、侧边栏这些噪音输出给你一份干净的 Markdown。而且它是完全开源的不需要任何 API Key不花钱。安装2 分钟搞定Python 版本要求 3.9 以上。我用的是一台普通的 Ubuntu 机器整个过程非常丝滑。# 创建虚拟环境强烈建议python3-mvenv .venvsource.venv/bin/activate# 安装 crawl4aipipinstallcrawl4ai# 初始化会自动安装 Playwright 的 Chromium 浏览器crawl4ai-setup# 检查环境是否就绪crawl4ai-doctorcrawl4ai-setup这一步会下载一个 Chromium 浏览器大约 150MB因为很多现代网页依赖 JavaScript 渲染crawl4ai 内置了 Playwright 来处理这些页面。如果你是 Linux 服务器没有图形界面可能会遇到缺少系统库的问题运行下面这个命令就行python3-mplaywrightinstall--with-deps chromium第一个例子5 行代码抓一个网页先来个最简单的抓取一个网页并输出 Markdownimportasynciofromcrawl4aiimportAsyncWebCrawlerasyncdefmain():asyncwithAsyncWebCrawler()ascrawler:resultawaitcrawler.arun(urlhttps://docs.python.org/3/tutorial/)# 输出干净的 Markdownprint(result.markdown[:2000])asyncio.run(main())就这几行代码crawl4ai 做了这些事情启动了一个无头浏览器Headless Chromium打开目标网页等待 JavaScript 渲染完成识别页面主要内容区域去掉导航栏、侧边栏、页脚等噪音把内容转成干净的 Markdown 格式返回输出大概是这样# The Python Tutorial Python is an easy to learn, powerful programming language... [干净的教程正文没有导航栏和广告]如果你是给 ChatGPT/Claude 准备 prompt直接把result.markdown贴进去就行。进阶控制浏览器行为真实场景中很多网站需要你「装得像个人」。crawl4ai 给了两个配置入口来控制行为。BrowserConfig控制浏览器本身fromcrawl4aiimportAsyncWebCrawler,BrowserConfig,CrawlerRunConfig browser_configBrowserConfig(headlessTrue,# 无头模式不弹窗口verboseFalse,# 关掉详细日志user_agent_moderandom,# 随机 User-Agentviewport_width1920,viewport_height1080,)asyncwithAsyncWebCrawler(configbrowser_config)ascrawler:resultawaitcrawler.arun(urlhttps://example.com)CrawlerRunConfig控制每次请求fromcrawl4aiimportCacheMode run_configCrawlerRunConfig(cache_modeCacheMode.BYPASS,# 跳过缓存每次都重新抓wait_forcss:.content,# 等待某个元素加载完成再抓page_timeout30000,# 页面加载超时毫秒)这两个配置是独立的——你可以创建一个BrowserConfig复用在多个请求上然后给每个请求配不同的CrawlerRunConfig。这样既节省了每次启动浏览器的开销又能灵活控制每个页面的抓取策略。实战场景一批量提取商品信息假设你要抓一个电商网站的产品列表需要提取每个产品的「名称、价格、链接」fromcrawl4ai.extraction_strategyimportJsonCssExtractionStrategy# 定义提取规则schema{name:Products,baseSelector:div.product-item,# 每个产品的容器fields:[{name:title,selector:h3.product-title,type:text},{name:price,selector:span.price,type:text},{name:link,selector:a,type:attribute,attribute:href},],}asyncdefcrawl_products():browser_configBrowserConfig(headlessTrue)# 这个 schema 告诉 crawl4ai 怎么提取结构化数据extractionJsonCssExtractionStrategy(schema)run_configCrawlerRunConfig(cache_modeCacheMode.BYPASS,extraction_strategyextraction,)asyncwithAsyncWebCrawler(configbrowser_config)ascrawler:resultawaitcrawler.arun(urlhttps://books.toscrape.com/,configrun_config,)# 输出结构化 JSONimportjsonprint(json.dumps(result.extracted_content,indent2,ensure_asciiFalse))asyncio.run(crawl_products())输出会是标准的 JSON 数组[{title:A Light in the Attic,price:£51.77,link:catalogue/a-light-in-the-attic_1000/index.html},{title:Tipping the Velvet,price:£53.74,link:catalogue/tipping-the-velvet_999/index.html}]CSS 选择器提取的优点是快、免费、稳定——不调用任何大模型纯本地处理。实战场景二用 LLM 做智能提取CSS 选择器好用但有个问题如果网页结构不规律怎么办比如一个博客列表页有的文章有摘要有的没有有的带标签有的不带。这时候可以用 crawl4ai 的LLM 提取策略——让 AI 来理解网页内容提取你需要的信息fromcrawl4ai.extraction_strategyimportLLMExtractionStrategyfrompydanticimportBaseModel# 定义你要的数据结构classBlogArticle(BaseModel):title:strsummary:strauthor:strtags:list[str]asyncdefllm_extract():llm_strategyLLMExtractionStrategy(provideropenai/gpt-4o,# 通过 LiteLLM 兼容任何提供商api_token你的API_KEY,schemaBlogArticle.schema(),extraction_typeschema,instruction提取页面上所有博客文章的信息。tags 字段用中文标签。,)run_configCrawlerRunConfig(extraction_strategyllm_strategy,)asyncwithAsyncWebCrawler()ascrawler:resultawaitcrawler.arun(urlhttps://some-blog.example.com,configrun_config,)print(result.extracted_content)asyncio.run(llm_extract())LLM 提取比 CSS 选择器慢一些每页多 2-5 秒但极其灵活。网页改版了、结构变了你不需要改代码——AI 自己会「理解」页面内容。LiteLLM 支持几乎所有主流 LLM 提供商OpenAI、DeepSeek、Claude、通义千问、智谱等等。你可以用providerdeepseek/deepseek-chat切换到 DeepSeek成本极低。实战场景三深度爬取——从一个入口开始自动爬完整个网站有时候你需要的不只是一两个页面而是整个网站的内容。比如构建一个 RAG 知识库需要爬取一个文档站的所有页面。crawl4ai 支持多种深度爬取策略fromcrawl4aiimportAsyncWebCrawler,BrowserConfig,CrawlerRunConfigfromcrawl4ai.deep_crawlingimportBFSDeepCrawlStrategyfromcrawl4ai.content_scraperimportContentScrapingStrategy,ScrapingModeasyncdefdeep_crawl():browser_configBrowserConfig(headlessTrue,verboseFalse)# BFS广度优先策略deep_crawl_strategyBFSDeepCrawlStrategy(max_depth2,# 最多爬 2 层深度max_pages20,# 最多爬 20 页include_paths[/docs/],# 只爬 /docs/ 下的页面)scrape_strategyContentScrapingStrategy(modeScrapingMode.MARKDOWN)# CrawlerRunConfig 里放深度爬取配置run_configCrawlerRunConfig(deep_crawl_strategydeep_crawl_strategy,scraping_strategyscrape_strategy,)asyncwithAsyncWebCrawler(configbrowser_config)ascrawler:resultsawaitcrawler.arun(urlhttps://docs.crawl4ai.com,configrun_config,)print(f共爬取{len(results)}个页面)forrinresults:print(f{r.url}—{len(r.markdown)}字符的 Markdown)asyncio.run(deep_crawl())它还支持自适应爬取Adaptive Crawlingcrawl4ai 会根据已获取的内容量自动判断「什么时候该停」。这个功能参考了信息觅食理论Information Foraging避免无效爬取。一个常见踩坑点如果你用的是 WSL 或者 Docker启动浏览器的时候可能会报错。因为 Headless Chromium 需要访问/dev/shm。Docker 里加--shm-size2gdockerrun --shm-size2g...WSL 里如果遇到共享内存问题换IPC模式browser_configBrowserConfig(headlessTrue,extra_args[--disable-dev-shm-usage,--no-sandbox],)它和传统爬虫框架的区别特性crawl4aiScrapyBeautifulSoupJS 渲染内置 Playwright需中间件不支持LLM 提取原生支持不支持不支持输出格式Markdown/JSON自定义HTML上手难度5 行代码需学框架需学 HTML适合场景AI/LLM 数据管道大规模采集小脚本crawl4ai 不是要替代 ScrapyScrapy 在大规模分布式采集方面仍然是最强的它定位的是另一个场景为 AI 准备干净的数据。总结用 crawl4ai 之前我写一个「抓网页 → 清理 → 喂给 LLM」的流程至少几十行代码还得处理各种边界情况。用了这东西之后核心就三行asyncwithAsyncWebCrawler()ascrawler:resultawaitcrawler.arun(url目标网址)print(result.markdown)# 直接给 LLM如果你在做 RAG 项目、AI Agent 开发、或者经常需要把网页内容丢给 ChatGPT 分析这个工具值得加到你的工具箱里。GitHub 地址https://github.com/unclecode/crawl4ai文档非常详细有中文翻译每个 API 都有可直接复制的代码示例。 作者Aliaoo 专注 AI 工具实战、云部署、自动化脚本。每篇都是亲测可跑的教程。️需要云服务器跑项目 CSDN 开发云常年折扣新用户首单特惠 觉得有用就点个赞想追更就点个关注——下次搜到我不靠缘分。
crawl4ai 从零到上手:GitHub 排名第一的开源 AI 爬虫,5 行代码抓取任意网页
发布时间:2026/6/2 9:54:18
crawl4ai 从零到上手GitHub 排名第一的开源 AI 爬虫5 行代码抓取任意网页你有没有遇到过这种情况——想抓一个网页的内容给 ChatGPT 分析结果复制过来的 HTML 里面全是div、script、广告和导航栏真正有用的内容只有中间那几百个字。传统的爬虫方案是写 requests → 解析 HTML → 写正则 → 调 BeautifulSoup → 处理 JS 渲染 → 清理格式 → 转 Markdown。一套流程下来少说几十行代码还得处理反爬、验证码、动态加载这些坑。今天要介绍的这个工具——crawl4ai就是来解决这个问题的。它是目前 GitHub 上排名第一的爬虫项目做到了一件事把任意网页变成干净的 Markdown 文本直接喂给 LLM。我花了半天时间把它从头跑了一遍这篇文章就是完整的实战记录。这东西到底解决了什么问题在 AI 时代爬虫的需求变了。以前我们抓数据是为了存数据库、做分析。现在的典型场景是把一篇技术博客抓下来让 AI 帮你总结要点构建 RAG检索增强生成知识库需要把几十个网页转成纯文本AI Agent 需要实时搜索网页然后根据内容做决策这些场景有一个共同点你要的不是 HTML是干净的、结构化的文本。crawl4ai 就是为这个场景设计的。它不是传统的爬虫框架而是一个「LLM 友好的网页转换器」。它能自动识别网页的主要内容区域去掉导航栏、广告、侧边栏这些噪音输出给你一份干净的 Markdown。而且它是完全开源的不需要任何 API Key不花钱。安装2 分钟搞定Python 版本要求 3.9 以上。我用的是一台普通的 Ubuntu 机器整个过程非常丝滑。# 创建虚拟环境强烈建议python3-mvenv .venvsource.venv/bin/activate# 安装 crawl4aipipinstallcrawl4ai# 初始化会自动安装 Playwright 的 Chromium 浏览器crawl4ai-setup# 检查环境是否就绪crawl4ai-doctorcrawl4ai-setup这一步会下载一个 Chromium 浏览器大约 150MB因为很多现代网页依赖 JavaScript 渲染crawl4ai 内置了 Playwright 来处理这些页面。如果你是 Linux 服务器没有图形界面可能会遇到缺少系统库的问题运行下面这个命令就行python3-mplaywrightinstall--with-deps chromium第一个例子5 行代码抓一个网页先来个最简单的抓取一个网页并输出 Markdownimportasynciofromcrawl4aiimportAsyncWebCrawlerasyncdefmain():asyncwithAsyncWebCrawler()ascrawler:resultawaitcrawler.arun(urlhttps://docs.python.org/3/tutorial/)# 输出干净的 Markdownprint(result.markdown[:2000])asyncio.run(main())就这几行代码crawl4ai 做了这些事情启动了一个无头浏览器Headless Chromium打开目标网页等待 JavaScript 渲染完成识别页面主要内容区域去掉导航栏、侧边栏、页脚等噪音把内容转成干净的 Markdown 格式返回输出大概是这样# The Python Tutorial Python is an easy to learn, powerful programming language... [干净的教程正文没有导航栏和广告]如果你是给 ChatGPT/Claude 准备 prompt直接把result.markdown贴进去就行。进阶控制浏览器行为真实场景中很多网站需要你「装得像个人」。crawl4ai 给了两个配置入口来控制行为。BrowserConfig控制浏览器本身fromcrawl4aiimportAsyncWebCrawler,BrowserConfig,CrawlerRunConfig browser_configBrowserConfig(headlessTrue,# 无头模式不弹窗口verboseFalse,# 关掉详细日志user_agent_moderandom,# 随机 User-Agentviewport_width1920,viewport_height1080,)asyncwithAsyncWebCrawler(configbrowser_config)ascrawler:resultawaitcrawler.arun(urlhttps://example.com)CrawlerRunConfig控制每次请求fromcrawl4aiimportCacheMode run_configCrawlerRunConfig(cache_modeCacheMode.BYPASS,# 跳过缓存每次都重新抓wait_forcss:.content,# 等待某个元素加载完成再抓page_timeout30000,# 页面加载超时毫秒)这两个配置是独立的——你可以创建一个BrowserConfig复用在多个请求上然后给每个请求配不同的CrawlerRunConfig。这样既节省了每次启动浏览器的开销又能灵活控制每个页面的抓取策略。实战场景一批量提取商品信息假设你要抓一个电商网站的产品列表需要提取每个产品的「名称、价格、链接」fromcrawl4ai.extraction_strategyimportJsonCssExtractionStrategy# 定义提取规则schema{name:Products,baseSelector:div.product-item,# 每个产品的容器fields:[{name:title,selector:h3.product-title,type:text},{name:price,selector:span.price,type:text},{name:link,selector:a,type:attribute,attribute:href},],}asyncdefcrawl_products():browser_configBrowserConfig(headlessTrue)# 这个 schema 告诉 crawl4ai 怎么提取结构化数据extractionJsonCssExtractionStrategy(schema)run_configCrawlerRunConfig(cache_modeCacheMode.BYPASS,extraction_strategyextraction,)asyncwithAsyncWebCrawler(configbrowser_config)ascrawler:resultawaitcrawler.arun(urlhttps://books.toscrape.com/,configrun_config,)# 输出结构化 JSONimportjsonprint(json.dumps(result.extracted_content,indent2,ensure_asciiFalse))asyncio.run(crawl_products())输出会是标准的 JSON 数组[{title:A Light in the Attic,price:£51.77,link:catalogue/a-light-in-the-attic_1000/index.html},{title:Tipping the Velvet,price:£53.74,link:catalogue/tipping-the-velvet_999/index.html}]CSS 选择器提取的优点是快、免费、稳定——不调用任何大模型纯本地处理。实战场景二用 LLM 做智能提取CSS 选择器好用但有个问题如果网页结构不规律怎么办比如一个博客列表页有的文章有摘要有的没有有的带标签有的不带。这时候可以用 crawl4ai 的LLM 提取策略——让 AI 来理解网页内容提取你需要的信息fromcrawl4ai.extraction_strategyimportLLMExtractionStrategyfrompydanticimportBaseModel# 定义你要的数据结构classBlogArticle(BaseModel):title:strsummary:strauthor:strtags:list[str]asyncdefllm_extract():llm_strategyLLMExtractionStrategy(provideropenai/gpt-4o,# 通过 LiteLLM 兼容任何提供商api_token你的API_KEY,schemaBlogArticle.schema(),extraction_typeschema,instruction提取页面上所有博客文章的信息。tags 字段用中文标签。,)run_configCrawlerRunConfig(extraction_strategyllm_strategy,)asyncwithAsyncWebCrawler()ascrawler:resultawaitcrawler.arun(urlhttps://some-blog.example.com,configrun_config,)print(result.extracted_content)asyncio.run(llm_extract())LLM 提取比 CSS 选择器慢一些每页多 2-5 秒但极其灵活。网页改版了、结构变了你不需要改代码——AI 自己会「理解」页面内容。LiteLLM 支持几乎所有主流 LLM 提供商OpenAI、DeepSeek、Claude、通义千问、智谱等等。你可以用providerdeepseek/deepseek-chat切换到 DeepSeek成本极低。实战场景三深度爬取——从一个入口开始自动爬完整个网站有时候你需要的不只是一两个页面而是整个网站的内容。比如构建一个 RAG 知识库需要爬取一个文档站的所有页面。crawl4ai 支持多种深度爬取策略fromcrawl4aiimportAsyncWebCrawler,BrowserConfig,CrawlerRunConfigfromcrawl4ai.deep_crawlingimportBFSDeepCrawlStrategyfromcrawl4ai.content_scraperimportContentScrapingStrategy,ScrapingModeasyncdefdeep_crawl():browser_configBrowserConfig(headlessTrue,verboseFalse)# BFS广度优先策略deep_crawl_strategyBFSDeepCrawlStrategy(max_depth2,# 最多爬 2 层深度max_pages20,# 最多爬 20 页include_paths[/docs/],# 只爬 /docs/ 下的页面)scrape_strategyContentScrapingStrategy(modeScrapingMode.MARKDOWN)# CrawlerRunConfig 里放深度爬取配置run_configCrawlerRunConfig(deep_crawl_strategydeep_crawl_strategy,scraping_strategyscrape_strategy,)asyncwithAsyncWebCrawler(configbrowser_config)ascrawler:resultsawaitcrawler.arun(urlhttps://docs.crawl4ai.com,configrun_config,)print(f共爬取{len(results)}个页面)forrinresults:print(f{r.url}—{len(r.markdown)}字符的 Markdown)asyncio.run(deep_crawl())它还支持自适应爬取Adaptive Crawlingcrawl4ai 会根据已获取的内容量自动判断「什么时候该停」。这个功能参考了信息觅食理论Information Foraging避免无效爬取。一个常见踩坑点如果你用的是 WSL 或者 Docker启动浏览器的时候可能会报错。因为 Headless Chromium 需要访问/dev/shm。Docker 里加--shm-size2gdockerrun --shm-size2g...WSL 里如果遇到共享内存问题换IPC模式browser_configBrowserConfig(headlessTrue,extra_args[--disable-dev-shm-usage,--no-sandbox],)它和传统爬虫框架的区别特性crawl4aiScrapyBeautifulSoupJS 渲染内置 Playwright需中间件不支持LLM 提取原生支持不支持不支持输出格式Markdown/JSON自定义HTML上手难度5 行代码需学框架需学 HTML适合场景AI/LLM 数据管道大规模采集小脚本crawl4ai 不是要替代 ScrapyScrapy 在大规模分布式采集方面仍然是最强的它定位的是另一个场景为 AI 准备干净的数据。总结用 crawl4ai 之前我写一个「抓网页 → 清理 → 喂给 LLM」的流程至少几十行代码还得处理各种边界情况。用了这东西之后核心就三行asyncwithAsyncWebCrawler()ascrawler:resultawaitcrawler.arun(url目标网址)print(result.markdown)# 直接给 LLM如果你在做 RAG 项目、AI Agent 开发、或者经常需要把网页内容丢给 ChatGPT 分析这个工具值得加到你的工具箱里。GitHub 地址https://github.com/unclecode/crawl4ai文档非常详细有中文翻译每个 API 都有可直接复制的代码示例。 作者Aliaoo 专注 AI 工具实战、云部署、自动化脚本。每篇都是亲测可跑的教程。️需要云服务器跑项目 CSDN 开发云常年折扣新用户首单特惠 觉得有用就点个赞想追更就点个关注——下次搜到我不靠缘分。