入门 Crawl4AI

欢迎使用 Crawl4AI,一个开源的 LLM 友好型网页爬虫和抓取工具。在本教程中,你将学会:

  1. 运行你的 第一个爬取任务,并使用最小化配置。
  2. 生成 Markdown 输出(并了解内容过滤器如何影响其结果)。
  3. 体验一个简单的 基于 CSS 的提取 方法。
  4. 了解 基于 LLM 的提取(包括开源和闭源模型选项)。
  5. 爬取一个 动态 页面,该页面通过 JavaScript 加载内容。

1. 介绍

Crawl4AI 提供以下功能:

  • 一个异步爬虫,AsyncWebCrawler
  • 通过 BrowserConfigCrawlerRunConfig 可配置浏览器和运行设置。
  • 通过 DefaultMarkdownGenerator 自动将 HTML 转换为 Markdown(支持可选过滤器)。
  • 多种提取策略(基于 LLM 或 “传统” CSS/XPath)。

在本指南结束时,你将完成基本爬取、生成 Markdown、尝试两种提取策略,并爬取一个使用“加载更多”按钮或 JavaScript 更新的动态页面。


2. 你的第一个爬取任务

下面是一个最小化的 Python 脚本,创建了 AsyncWebCrawler,获取网页并打印前 300 个字符的 Markdown 输出:

  1. import asyncio
  2. from crawl4ai import AsyncWebCrawler
  3. async def main():
  4. async with AsyncWebCrawler() as crawler:
  5. result = await crawler.arun("https://example.com")
  6. print(result.markdown[:300]) # 打印前 300 个字符
  7. if __name__ == "__main__":
  8. asyncio.run(main())

发生了什么?

  • AsyncWebCrawler 启动了一个无头浏览器(默认使用 Chromium)。
  • 它获取 https://example.com
  • Crawl4AI 自动将 HTML 转换为 Markdown。

你现在已经成功运行了一个简单的爬取任务!


3. 基础配置(轻量介绍)

Crawl4AI 的爬虫可以通过两个主要类进行高度自定义:

  1. BrowserConfig:控制浏览器行为(无头模式或带 UI,用户代理,JavaScript 开关等)。
  2. CrawlerRunConfig:控制爬取运行方式(缓存、提取、超时、钩子等)。

下面是一个简单的使用示例:

  1. import asyncio
  2. from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
  3. async def main():
  4. browser_conf = BrowserConfig(headless=True) # 设为 False 以观察浏览器
  5. run_conf = CrawlerRunConfig(
  6. cache_mode=CacheMode.BYPASS
  7. )
  8. async with AsyncWebCrawler(config=browser_conf) as crawler:
  9. result = await crawler.arun(
  10. url="https://example.com",
  11. config=run_conf
  12. )
  13. print(result.markdown)
  14. if __name__ == "__main__":
  15. asyncio.run(main())

重要:默认情况下,缓存模式设置为 CacheMode.ENABLED。如果需要获取最新内容,请将其设置为 CacheMode.BYPASS

在后续教程中,我们将探索更高级的配置(如启用代理、PDF 输出、多标签页会话等)。目前,你只需知道如何传递这些对象来管理爬取任务。


4. 生成 Markdown 输出

Crawl4AI 默认会自动将每个爬取的页面转换为 Markdown。但具体的输出取决于你是否指定了 Markdown 生成器内容过滤器

  • result.markdown: 直接的 HTML 转 Markdown 转换结果。
  • result.markdown.fit_markdown: 应用了任何已配置 内容过滤器(如 PruningContentFilter)后的 Markdown。

示例:使用 DefaultMarkdownGenerator 进行过滤

  1. from crawl4ai import AsyncWebCrawler, CrawlerRunConfig
  2. from crawl4ai.content_filter_strategy import PruningContentFilter
  3. from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator
  4. md_generator = DefaultMarkdownGenerator(
  5. content_filter=PruningContentFilter(threshold=0.4, threshold_type="fixed")
  6. )
  7. config = CrawlerRunConfig(
  8. cache_mode=CacheMode.BYPASS,
  9. markdown_generator=md_generator
  10. )
  11. async with AsyncWebCrawler() as crawler:
  12. result = await crawler.arun("https://news.ycombinator.com", config=config)
  13. print("原始 Markdown 长度:", len(result.markdown.raw_markdown))
  14. print("过滤后 Markdown 长度:", len(result.markdown.fit_markdown))

注意:如果 指定内容过滤器或 Markdown 生成器,你通常只能看到原始 Markdown。PruningContentFilter 可能会增加 50ms 处理时间。


5. 简单数据提取(基于 CSS)

Crawl4AI 允许使用 CSS 或 XPath 选择器提取结构化数据(JSON)。以下是一个基于 CSS 的最小示例:

  1. import asyncio
  2. import json
  3. from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode
  4. from crawl4ai.extraction_strategy import JsonCssExtractionStrategy
  5. async def main():
  6. schema = {
  7. "name": "Example Items",
  8. "baseSelector": "div.item",
  9. "fields": [
  10. {"name": "title", "selector": "h2", "type": "text"},
  11. {"name": "link", "selector": "a", "type": "attribute", "attribute": "href"}
  12. ]
  13. }
  14. raw_html = "<div class='item'><h2>Item 1</h2><a href='https://example.com/item1'>Link 1</a></div>"
  15. async with AsyncWebCrawler() as crawler:
  16. result = await crawler.arun(
  17. url="raw://" + raw_html,
  18. config=CrawlerRunConfig(
  19. cache_mode=CacheMode.BYPASS,
  20. extraction_strategy=JsonCssExtractionStrategy(schema)
  21. )
  22. )
  23. data = json.loads(result.extracted_content)
  24. print(data)
  25. if __name__ == "__main__":
  26. asyncio.run(main())

为什么有用?

  • 适用于重复的页面结构(如商品列表、文章等)。
  • 无需 AI,节省 API 成本。
  • 爬虫返回 JSON 字符串,方便解析或存储。