在当今数据驱动的世界中,高效收集和处理信息的技能对于人工智能(AI)的应用成功至关重要。随着人工智能的发展,对训练大型语言模型(LLMs)的结构化数据的需求从未如此高涨。
Crawl4AI 是一个创新的开源 Python 库,旨在简化网络爬虫和数据提取,对于开发者和 AI 爱好者来说是一个不可或缺的工具。本文将探讨 Crawl4AI 的功能、用法和应用场景,展示它如何帮助用户利用网络资源进行 AI 训练。
什么是Crawl4AI(一种爬虫人工智能技术)?Crawl4AI 是一个开源的网络爬虫框架,旨在自动化从网站收集数据。它允许用户同时抓取多个网址,是大规模数据收集项目的理想选择。Crawl4AI 针对 AI 应用程序设计的功能,简化了将原始网络数据转换成结构化格式的过程。
Claude-Sonnet-3.5 生成的图像
Crawl4AI: 主要特点:🆓 开源
开源特性让用户能够完全访问代码,从而实现自定义和扩展性。此外,强大的社区支持和详尽的文档也让新手更快上手。
🚀 惊人的快表现
Crawl4AI的一大亮点是其卓越的速度。该框架经过优化,能够超越许多付费服务,提供更快的数据提取速度,让用户能够快速且高效地提取数据。
🌐 异步架构
允许同时抓取多个URL,大大缩短了大规模数据收集的时间。
🤖 友好的LLM输出格式
支持多种输出格式,包括JSON、干净的HTML格式和Markdown,确保轻松集成到AI模型中。
🎨 提取并返回所有媒体内容
使用 Crawl4AI,用户可以提取各种类型的媒体,包括图像、音频和视频。这个功能特别适合需要多媒体支持的应用,比如社交媒体分析或内容创作。
📜 JavaScript 执行能力
能够抓取动态内容,确保全面的数据,而其他抓取工具可能无法获取这些数据。
📚 多种分块方法
Crawl4AI 支持多种分块方法,例如主题相关、正则表达式和句子相关的分块。这种灵活性让用户可以根据具体需求调整数据提取方式,确保各种应用都能获得最佳效果。
🧠 高级提取技巧
利用强大的工具和技术,如XPath和正则表达(regex),帮助用户精准地从网页中获取所需数据。
📚 元数据提取
收集与主要内容相关的关键元数据,从而丰富AI训练的数据集。
🕵️ 自定义钩子和用户代理支持
用户可以定义用于认证和头部的自定义钩子,并自定义HTTP请求的用户代理,从而更好地控制爬取过程。
错误处理和重试机制
包含强大的错误处理和重试机制,确保即使在网络故障或页面加载失败的情况下也能保持数据完整性。
🔒 速率限制和节流(限制访问速度和流量控制)
有助于避免给目标服务器带来过大压力,并确保符合网络爬虫的最佳做法。
Crawl4AI不仅仅是一个网页爬虫工具;它是一个全面的解决方案,专为高级异步网页爬取和数据提取而设计,特别适合开发人员和数据分析师的需求。
现在,我们将深入了解Crawl4AI的核心功能,并通过代码示例来展示如何优化网页数据抓取。
💻 安装说明.有几种方式可以安装 Crawl4AI — 您可以将它作为 Python 包安装,使用 Docker 进行部署,或者在本地运行它。以下是 Python 包安装步骤:
# 安装所有功能
!pip3 install "crawl4ai[all]"
# 安装完成后,下载必要的模型来提升性能:
!crawl4ai-download-models
# 最后,安装Playwright的依赖项
!playwright install
⚙️ 基本使用不同的安装方式请参见这里
要开始使用 Crawl4AI,我们首先需要创建一个 AsyncWebCrawler
实例。这是核心组件,它将通过异步上下文管理器高效地管理爬虫的生命周期。默认情况下,它会缓存爬虫结果,这意味着对同一 URL 的后续爬取将快很多!
from crawl4ai import AsyncWebCrawler
from crawl4ai.chunking_strategy import RegexChunking
async with AsyncWebCrawler(verbose=True) as crawler:
结果是 = await crawler.arun(url="https://en.wikipedia.org/wiki/3_Idiots", bypass_cache=False)
print(f"提取的内容为:{结果.extracted_content}")
高速运行
在上面的代码中:
url
: 指定要爬的网页。bypass_cache
: 是否不使用缓存
提取的内容有多种形式,例如markdown
和cleaned_html
,以满足您的不同需求。
print(result.markdown) # 输出 result 的 markdown 格式
print(result.cleaned_html) # 输出 result 的 cleaned_html 格式
📸 快来试试截图吧!
它也允许你截取你正在爬取的页面的截图。
import base64
from crawl4ai import AsyncWebCrawler
async with AsyncWebCrawler(verbose=True) as crawler:
result = await crawler.arun(url="https://www.cricbuzz.com/", screenshot=True)
with open("cricbuzz_screenshot.png", "wb") as f:
f.write(base64.b64decode(result.screenshot))
print("截图已保存为 'cricbuzz_screenshot.png',如需查看请打开文件。")
🔀 添加分块策略
我们现在会根据提供的正则表达式模式来拆分文本。
word_count_threshold
:设置有意义的内容块所需的最小单词数。chunking_strategy
:定义用于拆分文本的分块策略。
从 crawl4ai 导入 AsyncWebCrawler 作为异步网络爬虫
从 crawl4ai.chunking_strategy 导入 RegexChunking 作为正则分块策略
async with AsyncWebCrawler(verbose=True) as crawler:
result = await crawler.arun(url='https://en.wikipedia.org/wiki/3_Idiots', chunking_strategy=RegexChunking(patterns=['\n\n']), word_count_threshold=10)
print(f"提取的内容是:{result.extracted_content}")
🧠 添加高级提取策略功能
现在,让我们在爬取中添加一个智能提取策略——JsonCssExtractionStrategy
。JsonCssExtractionStrategy 实现精准的结构化数据提取,通过定义一个带有基础选择器的模式来实现,这些选择器用于页面上的重复元素。模式中的每个字段都拥有自己的选择器,允许抽取嵌套结构或列表。这种方法非常适合将网页内容(如产品列表、文章或搜索结果)转换为干净的 JSON 格式,提供网页数据提取的灵活性和准确性。
from crawl4ai import AsyncWebCrawler
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy
import json
import nest_asyncio
nest_asyncio.apply()
async def extract_news_teasers():
schema = {
"name": "新闻提要提取器",
"baseSelector": ".wide-tease-item__wrapper",
"fields": [
{
"name": "类别",
"selector": ".unibrow span[data-testid='unibrow-text']",
"type": "text",
},
{
"name": "标题",
"selector": ".wide-tease-item__headline",
"type": "text",
},
{
"name": "摘要",
"selector": ".wide-tease-item__description",
"type": "text",
},
{
"name": "时间",
"selector": "[data-testid='wide-tease-date']",
"type": "text",
},
{
"name": "图片",
"type": "nested",
"selector": "picture.teasePicture img",
"fields": [
{"name": "src", "type": "attribute", "attribute": "src"},
{"name": "alt", "type": "attribute", "attribute": "alt"},
],
},
{
"name": "链接",
"selector": "a[href]",
"type": "attribute",
"attribute": "href",
},
],
}
extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)
async with AsyncWebCrawler(verbose=True) as crawler:
result = await crawler.arun(
url="https://www.nbcnews.com/business",
extraction_strategy=extraction_strategy,
bypass_cache=True,
)
assert result.success, "爬取页面失败"
news_teasers = json.loads(result.extracted_content)
print(f"成功提取 {len(news_teasers)} 条新闻摘要")
print(json.dumps(news_teasers[0], indent=2))
🔄 基于会话的动态内容抓取 🔄
Crawl4AI的基于会话的爬虫技术在处理像GitHub这样的平台上的动态内容时特别有用。在这个例子中,我们使用它来提取跨多个页面的提交历史,利用自定义钩子来确保新内容正确加载。
import asyncio
import re
from bs4 import BeautifulSoup
from crawl4ai import AsyncWebCrawler
async def crawl_linux_commits():
first_commit = ""
async def on_execution_started(page):
nonlocal first_commit
try:
while True:
await page.wait_for_selector('li.Box-sc-g0xbh4-0 h4')
commit = await page.query_selector('li.Box-sc-g0xbh4-0 h4')
commit = await commit.evaluate('(element) => element.textContent')
commit = re.sub(r'\s+', '', commit)
if commit and commit != first_commit:
first_commit = commit
break
await asyncio.sleep(0.5)
except Exception as e:
print(f"警告:JavaScript执行后新内容未出现,错误:{e}")
async with AsyncWebCrawler(verbose=True) as crawler:
crawler.crawler_strategy.set_hook('on_execution_started', on_execution_started)
url = "https://github.com/torvalds/linux/commits/master"
session_id = "linux_commits_session"
all_commits = []
js_next_page = """
const button = document.querySelector('a[data-testid="pagination-next-button"]');
if (button) button.click();
"""
for page in range(3): # 爬取总共3页
result = await crawler.arun(
url=url,
session_id=session_id,
css_selector="li.Box-sc-g0xbh4-0",
js=js_next_page if page > 0 else None,
bypass_cache=True,
js_only=page > 0
)
assert result.success, f"未能爬取第 {page + 1} 页的内容"
soup = BeautifulSoup(result.cleaned_html, 'html.parser')
commits = soup.select("li")
all_commits.extend(commits)
print(f"在第 {page + 1} 页中找到了 {len(commits)} 条提交记录")
await crawler.crawler_strategy.kill_session(session_id)
print(f"成功爬取了总共 {len(all_commits)} 条提交记录,包括3页的内容")
asyncio.run(crawl_linux_commits())
- 基于会话的爬取:我们维护会话来处理动态内容并加载新页面。
- JavaScript执行:自定义的JavaScript点击GitHub提交页面上的“下一页”按钮来加载更多提交。
- 自定义钩子:
on_execution_started
钩子确保在继续之前加载更多提交。
这种技术允许你从动态页面提取内容,同时跨多个请求进行状态管理。
实际应用:了解更多详情和高级用法,查阅文档
Crawl4AI(Crawl4AI)适用于多种多样的应用,包括:
- 大型语言模型的训练: Crawl4AI 收集的结构化数据非常适合训练大型语言模型,有助于提升其在各种应用场景中的性能。
- 市场研究: 企业可以利用 Crawl4AI 从竞争对手网站、新闻文章和社会媒体中获取洞察,从而做出数据驱动的决策。
- 内容聚合: 内容创作者可以使用 Crawl4AI 从多个来源收集和整理信息,从而简化内容创作流程。
- 学术研究: 研究人员可以自动从学术出版物和在线数据库中收集数据,促进文献回顾和数据分析。
- 情感分析: 通过抓取评论和社交媒体上的帖子,用户可以分析公众对产品或服务的情感态度。
- 实时数据检索: RAG 系统可以使用 Crawl4AI 从互联网上获取最新信息,提高 AI 生成内容的准确性。
- 动态功能调用: AI 代理可以利用 Crawl4AI 根据实时数据执行功能调用,从而实现更互动和响应的应用程序。
随着数据在各个行业的决策过程中的重要性日益增加,像Crawl4AI这样的工具在利用网页数据方面变得越来越不可或缺。其强大的自动化能力不仅节省了时间,还为数据分析和洞察生成开辟了新的途径。Crawl4AI具备多URL爬取、媒体提取以及支持多种高级输出格式等功能,是一款功能强大且高效的网页抓取工具,专为满足现代数据收集需求而设计。无论是开发者、研究人员还是企业主,它都能提供必要的资源来简化数据提取流程,并最大化洞察的价值。
参考文献:- Crawl4AI 文档页面
- Crawl4AI GitHub 页面
-
[OOP]:面向对象程序设计
[CRUD]:增删查改
[JVM]:Java虚拟机
[SUT]:待测系统