入门 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 asyncio
from crawl4ai import AsyncWebCrawler
async 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 asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode
async 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, CrawlerRunConfig
from crawl4ai.content_filter_strategy import PruningContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator
md_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 asyncio
import json
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy
async 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 字符串,方便解析或存储。