入门 Crawl4AI
欢迎使用 Crawl4AI,一个开源的 LLM 友好型网页爬虫和抓取工具。在本教程中,你将学会:
- 运行你的 第一个爬取任务,并使用最小化配置。
- 生成 Markdown 输出(并了解内容过滤器如何影响其结果)。
- 体验一个简单的 基于 CSS 的提取 方法。
- 了解 基于 LLM 的提取(包括开源和闭源模型选项)。
- 爬取一个 动态 页面,该页面通过 JavaScript 加载内容。
1. 介绍
Crawl4AI 提供以下功能:
- 一个异步爬虫,
AsyncWebCrawler。 - 通过
BrowserConfig和CrawlerRunConfig可配置浏览器和运行设置。 - 通过
DefaultMarkdownGenerator自动将 HTML 转换为 Markdown(支持可选过滤器)。 - 多种提取策略(基于 LLM 或 “传统” CSS/XPath)。
在本指南结束时,你将完成基本爬取、生成 Markdown、尝试两种提取策略,并爬取一个使用“加载更多”按钮或 JavaScript 更新的动态页面。
2. 你的第一个爬取任务
下面是一个最小化的 Python 脚本,创建了 AsyncWebCrawler,获取网页并打印前 300 个字符的 Markdown 输出:
import asynciofrom crawl4ai import AsyncWebCrawlerasync def main():async with AsyncWebCrawler() as crawler:result = await crawler.arun("https://example.com")print(result.markdown[:300]) # 打印前 300 个字符if __name__ == "__main__":asyncio.run(main())
发生了什么?
AsyncWebCrawler启动了一个无头浏览器(默认使用 Chromium)。- 它获取
https://example.com。 - Crawl4AI 自动将 HTML 转换为 Markdown。
你现在已经成功运行了一个简单的爬取任务!
3. 基础配置(轻量介绍)
Crawl4AI 的爬虫可以通过两个主要类进行高度自定义:
BrowserConfig:控制浏览器行为(无头模式或带 UI,用户代理,JavaScript 开关等)。CrawlerRunConfig:控制爬取运行方式(缓存、提取、超时、钩子等)。
下面是一个简单的使用示例:
import asynciofrom crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheModeasync def main():browser_conf = BrowserConfig(headless=True) # 设为 False 以观察浏览器run_conf = CrawlerRunConfig(cache_mode=CacheMode.BYPASS)async with AsyncWebCrawler(config=browser_conf) as crawler:result = await crawler.arun(url="https://example.com",config=run_conf)print(result.markdown)if __name__ == "__main__":asyncio.run(main())
重要:默认情况下,缓存模式设置为
CacheMode.ENABLED。如果需要获取最新内容,请将其设置为CacheMode.BYPASS。
在后续教程中,我们将探索更高级的配置(如启用代理、PDF 输出、多标签页会话等)。目前,你只需知道如何传递这些对象来管理爬取任务。
4. 生成 Markdown 输出
Crawl4AI 默认会自动将每个爬取的页面转换为 Markdown。但具体的输出取决于你是否指定了 Markdown 生成器 或 内容过滤器。
result.markdown: 直接的 HTML 转 Markdown 转换结果。result.markdown.fit_markdown: 应用了任何已配置 内容过滤器(如PruningContentFilter)后的 Markdown。
示例:使用 DefaultMarkdownGenerator 进行过滤
from crawl4ai import AsyncWebCrawler, CrawlerRunConfigfrom crawl4ai.content_filter_strategy import PruningContentFilterfrom crawl4ai.markdown_generation_strategy import DefaultMarkdownGeneratormd_generator = DefaultMarkdownGenerator(content_filter=PruningContentFilter(threshold=0.4, threshold_type="fixed"))config = CrawlerRunConfig(cache_mode=CacheMode.BYPASS,markdown_generator=md_generator)async with AsyncWebCrawler() as crawler:result = await crawler.arun("https://news.ycombinator.com", config=config)print("原始 Markdown 长度:", len(result.markdown.raw_markdown))print("过滤后 Markdown 长度:", len(result.markdown.fit_markdown))
注意:如果 不 指定内容过滤器或 Markdown 生成器,你通常只能看到原始 Markdown。PruningContentFilter 可能会增加 50ms 处理时间。
5. 简单数据提取(基于 CSS)
Crawl4AI 允许使用 CSS 或 XPath 选择器提取结构化数据(JSON)。以下是一个基于 CSS 的最小示例:
import asyncioimport jsonfrom crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheModefrom crawl4ai.extraction_strategy import JsonCssExtractionStrategyasync def main():schema = {"name": "Example Items","baseSelector": "div.item","fields": [{"name": "title", "selector": "h2", "type": "text"},{"name": "link", "selector": "a", "type": "attribute", "attribute": "href"}]}raw_html = "<div class='item'><h2>Item 1</h2><a href='https://example.com/item1'>Link 1</a></div>"async with AsyncWebCrawler() as crawler:result = await crawler.arun(url="raw://" + raw_html,config=CrawlerRunConfig(cache_mode=CacheMode.BYPASS,extraction_strategy=JsonCssExtractionStrategy(schema)))data = json.loads(result.extracted_content)print(data)if __name__ == "__main__":asyncio.run(main())
为什么使用?
- 适用于重复的页面结构(如商品列表、文章等)。
- 无需 AI,节省 API 成本。
- 爬虫返回 JSON 字符串,方便解析或存储。
