Crawl4AI: 赋能AI用户的开源智能网页爬虫与数据提取

Crawl4AI: 赋能AI用户的开源智能网页爬虫与数据提取

在当今人工智能时代,网络爬虫扮演着至关重要的角色。它们不仅是数据收集的强大工具,更是驱动机器学习、自然语言处理等技术发展的关键引擎。

然而,对于用户来说,在面对复杂多变的网络环境和各异的网站结构时,常常会遇到诸多挑战。爬取中文网站时,编码问题、反爬机制、以及对中文语义的理解都成为了阻碍数据获取的绊脚石。

正是在这样的背景下,我发现了 Crawl4AI,一款专为大型语言模型(LLM)和人工智能应用设计的高效、灵活且完全开源的网页爬虫与数据提取工具。

它致力于降低用户在数据获取方面的门槛,赋能开发者以快速、高效、便捷的方式从网络中提取所需信息。

概览

Crawl4AI 是一款功能丰富、且对 LLM 非常友好的爬虫框架。它拥有以下核心优势:

  • 完全开源且免费:Crawl4AI 采用 Apache 2.0 协议,允许用户自由使用、修改和分发,无需担心付费或商业限制。
  • 专为 AI 设计:自动将网页内容转换为结构清晰、简洁的 Markdown 格式,极大地简化了 RAG(检索增强生成)流程和微调任务的数据获取步骤。
  • 速度快,效率高:Crawl4AI 拥有出色的性能,能够在短时间内抓取大量页面,并通过启发式算法降低对昂贵模型的依赖。
  • 高度灵活可配置:支持多种配置选项,包括自定义 User-Agent、代理设置、会话管理等,轻松应对各种反爬策略。

核心优势

Crawl4AI 的强大之处体现在以下几个核心方面:

  1. 速度与效率
    Crawl4AI 追求极致性能,凭借其架构优化,能以极快的速度抓取网页。与同类工具相比,Crawl4AI 在速度上具有显著优势。

  2. 灵活的配置

    Crawl4AI 提供了两个核心配置类,BrowserConfig​ 和 CrawlerRunConfig​,方便用户灵活地定制爬虫的行为:

    • BrowserConfig​:用于配置浏览器级别的设置,例如是否启用无头模式、设置 User-Agent、配置代理等。
    • CrawlerRunConfig​:用于配置单次抓取任务的行为,例如缓存模式、内容选择、内容过滤、JavaScript 执行等。
  3. 多结构数据提取

    Crawl4AI 支持多种数据提取策略,能够从网页中提取出结构化的信息:

    • JSON CSS Extraction:使用 CSS 选择器从结构化的网页中提取数据,速度快、效率高。
    • JSON XPath Extraction:使用 XPath 表达式从 XML 或 HTML 文档中提取数据,更加灵活。
    • LLM Extraction:结合大型语言模型,从非结构化的网页中提取信息,适用于处理复杂或语义化的内容。
  4. 可扩展的大规模数据处理能力
    Crawl4AI 通过内存自适应调度器(MemoryAdaptiveDispatcher​)来支持大规模并发爬取,可以根据系统内存使用情况动态地调整并发任务数量,防止内存溢出,保证爬虫的稳定运行。同时还提供了流式处理的支持,能够在抓取的同时处理数据,无需等待所有任务完成,大大提高了效率。

  5. 协议支持
    Crawl4AI 默认支持 HTTP(S) 协议,但同时也考虑到网络爬虫的伦理和法律问题,提供了 robots.txt​ 协议的支持,可以通过设置 check_robots_txt=True​ 来遵守网站的爬取规则,避免对网站造成不必要的负担。

快速上手

以下是使用 Crawl4AI 的快速上手指南:

1. 安装

使用 pip 安装 Crawl4AI:

pip install crawl4ai
crawl4ai-setup
2. 编写 Python 脚本

创建一个 Python 脚本,例如 crawl.py​,并添加以下代码:

import asyncio
from crawl4ai import AsyncWebCrawlerasync def main():async with AsyncWebCrawler() as crawler:result = await crawler.arun(url="https://www.example.com")print(result.markdown[:500])if __name__ == "__main__":asyncio.run(main())
3. 运行脚本

在命令行中运行该脚本:

python crawl.py
4. 使用命令行界面(CLI)

如果你只需要快速的抓取一个网页,可以使用我们提供的CLI工具:

crwl https://www.nbcnews.com/business -o markdown

高级功能

Crawl4AI 提供了许多高级功能,可以满足各种复杂的爬取需求。

1. 高级的网页遍历方法:深度爬取

Crawl4AI 支持深度爬取,可以通过配置 deep_crawl_strategy​ 参数来控制爬取的深度和范围。目前支持三种深度爬取策略:

  • BFSDeepCrawlStrategy​(广度优先搜索):逐层遍历网页。
  • DFSDeepCrawlStrategy​(深度优先搜索):沿着一条路径深入挖掘,直到无法再深入为止。
  • BestFirstCrawlingStrategy​:基于评分函数来决定下一个要爬取的链接,优先爬取最有价值的页面。
2. 代理与安全

你可以通过 BrowserConfig​ 中的 proxy​ 或 proxy_config​ 参数来配置代理,实现 IP 轮换和匿名爬取。

browser_config = BrowserConfig(proxy_config={"server": "http://proxy.example.com:8080","username": "user","password": "pass",}
)
3. 会话管理

通过设置 CrawlerRunConfig​ 中的 session_id​ 参数,可以在多次请求之间保持会话状态,例如模拟用户登录后的操作。

run_config = CrawlerRunConfig(session_id="my_session"
)
4. 浏览器配置与用户代理

你可以通过 BrowserConfig​ 中的 user_agent​ 参数来设置自定义的用户代理,或者使用 user_agent_mode​ 参数来随机生成用户代理,以模拟真实用户的行为,避免被网站的反爬机制识别。

browser_config = BrowserConfig(user_agent_mode="random",user_agent_generator_config={"device_type": "mobile", "os_type": "android"},
)
5. LLM配置

Crawl4AI现在提供 LlmConfig​ 对象,用于配置 LLM 提供程序。这简化了在需要 LLM 的策略和函数中传递provider字符串、API 令牌和基本 URL 的过程,从而可以重复使用并快速试验不同的 LLM 配置。
您可以通过以下两种方式传递LLM密钥:

a)在本地设置环境变量并在 LlmConfig 对象内部调用它

os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"llm_config = LlmConfig(provider="openai/gpt-4", api_token=os.getenv("OPENAI_API_KEY"))

b)将 api_token 直接传递给 LlmConfig 对象:

llm_config = LlmConfig(provider="openai/gpt-4", api_token="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
6. 结构化数据提取

Crawl4AI 支持多种结构化数据提取方式,包括:

  • JSON CSS Extraction:使用 CSS 选择器从 HTML 页面中提取数据。
  • JSON XPath Extraction:使用 XPath 表达式从 HTML 页面中提取数据。
  • LLM Extraction:使用大型语言模型从非结构化的文本中提取数据。
7. 内容过滤

Crawl4AI 提供了多种内容过滤策略,可以根据关键词、BM25 算法或大型语言模型来过滤网页内容,提取出最相关的信息。例如,使用 BM25ContentFilter​ 可以根据用户查询来过滤网页内容:

from crawl4ai.content_filter_strategy import BM25ContentFilterfilter = BM25ContentFilter(user_query="machine learning")

应用场景

Crawl4AI 在实际应用中拥有广泛的应用场景:

  1. 研究助手:用于快速抓取和整理学术论文、研究报告等信息,辅助科研人员进行文献综述和数据分析。
  2. 数据分析:用于抓取电商网站的商品信息、社交媒体的用户数据等,为商业决策提供数据支持。
  3. AI 模型训练:用于构建高质量的训练数据集,提升 AI 模型的性能。
  4. 新闻聚合:定时抓取多个新闻网站的内容,生成个性化的新闻摘要或报告。

提问环节:

请具体说明一下该项目的数据缓存和多网页爬取?

1. 数据缓存

数据缓存是 Crawl4AI 的一项重要特性,它可以将抓取到的网页内容保存在本地,下次再次请求相同页面时,直接从缓存中读取,而无需重新发起网络请求。这极大地提高了爬取效率,并降低了对目标网站的访问压力。

1.1 缓存模式

Crawl4AI 使用 CacheMode​ 枚举类型来控制缓存行为。你可以在 CrawlerRunConfig​ 中指定缓存模式:

from crawl4ai import CrawlerRunConfig, CacheModeconfig = CrawlerRunConfig(cache_mode=CacheMode.ENABLED)  # 启用缓存(默认)

以下是 CacheMode​ 的各个选项:

  • CacheMode.ENABLED​: 默认模式,先尝试从缓存读取数据,如果缓存不存在,则发起网络请求,并将结果写入缓存。
  • CacheMode.DISABLED​: 禁用所有缓存功能,每次都发起网络请求。
  • CacheMode.READ_ONLY​: 只从缓存读取数据,不写入新数据到缓存。
  • CacheMode.WRITE_ONLY​: 只将数据写入缓存,不从缓存读取数据。
  • CacheMode.BYPASS​: 绕过缓存,直接发起网络请求,并将结果写入缓存。
1.2 清理缓存

Crawl4AI 提供了 aclear_cache()​ 和 aflush_cache()​ 两个方法来管理缓存:

  • aclear_cache()​:清空数据库中的所有缓存数据,但保留数据库文件。

    async with AsyncWebCrawler() as crawler:await crawler.aclear_cache()
    
  • aflush_cache()​:直接删除数据库文件,下次使用时会重新创建数据库。

    async with AsyncWebCrawler() as crawler:await crawler.aflush_cache()
    

2. 多网页爬取

Crawl4AI 提供了 arun_many()​ 方法,可以同时抓取多个网页,大幅提升爬取效率。同时,Crawl4AI 通过调度器(Dispatcher)来控制并发数量,避免对目标网站造成过大的压力。

2.1 使用 arun_many()​ 方法
import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfigasync def main():urls = ["https://example.com/page1","https://example.com/page2","https://example.com/page3"]async with AsyncWebCrawler() as crawler:results = await crawler.arun_many(urls=urls)  # 自动处理并发for result in results:if result.success:print(f"成功抓取:{result.url}")else:print(f"抓取失败:{result.url},错误信息:{result.error_message}")if __name__ == "__main__":asyncio.run(main())
2.2 调度器(Dispatcher)

Crawl4AI 使用调度器来管理并发任务,主要有两种调度器:

  • MemoryAdaptiveDispatcher​:根据系统内存使用情况动态调整并发数量,避免内存溢出。

    from crawl4ai import MemoryAdaptiveDispatcherdispatcher = MemoryAdaptiveDispatcher(memory_threshold_percent=80)
    
    • memory_threshold_percent​:内存使用阈值,当内存使用超过该值时,调度器会暂停任务。
    • max_session_permit​:允许的最大并发任务数。
    • check_interval​:检查内存使用情况的间隔时间(秒)。
  • SemaphoreDispatcher​:使用信号量来控制并发数量,简单直接。

    from crawl4ai import SemaphoreDispatcherdispatcher = SemaphoreDispatcher(semaphore_count=5)
    
    • semaphore_count​:允许的最大并发任务数。
2.3 使用示例:内存自适应调度器
import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, MemoryAdaptiveDispatcherasync def main():urls = ["https://example.com/page1","https://example.com/page2","https://example.com/page3"]dispatcher = MemoryAdaptiveDispatcher(memory_threshold_percent=80)async with AsyncWebCrawler() as crawler:results = await crawler.arun_many(urls=urls, config=CrawlerRunConfig(), dispatcher=dispatcher)for result in results:if result.success:print(f"Successfully crawled: {result.url}")else:print(f"Failed to crawl: {result.url}")if __name__ == "__main__":asyncio.run(main())
2.4 流式处理(Streaming)

arun_many()​ 也支持流式处理,可以在抓取的同时处理数据,无需等待所有任务完成。

import asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfigasync def main():urls = ["https://example.com/page1","https://example.com/page2","https://example.com/page3"]config = CrawlerRunConfig(stream=True)  # 开启流式处理async with AsyncWebCrawler() as crawler:async for result in crawler.arun_many(urls=urls, config=config):if result.success:print(f"Successfully crawled: {result.url}")else:print(f"Failed to crawl: {result.url}")if __name__ == "__main__":asyncio.run(main())
2.5 总结

这个项目的维护和更新也是比较频繁,社区活跃度还是比较高,目前不用担心不能使用的问题。

这也是我的日常获取信息的工具,推荐有条件的朋友可以用用看。

项目地址:

Crawl4ai

点个关注,不麋鹿!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下载b站视频音频

文章目录 方案一:jjdown如何使用 方案二:bilibili哔哩哔哩下载助手如何使用进入插件网站插件下载插件安装 使用插件下载视频音频:复制音频下载地址 方案三:bat命令下载单个音频下载单个视频下载单个音视频 方案一:jjdo…

【Git】linux搭建Gitea配置mysql数据库

WindowsServer搭建内网Gitea【中文更方便使用】 1. 安装Gitea # 下载 wget https://dl.gitea.io/gitea/1.23.5/gitea-1.23.5-linux-amd642. 创建用户 # 创建 gitea 用户 sudo adduser --system --shell /bin/bash --comment Git Version Control --create-home --home-dir /…

AI绘画软件Stable Diffusion详解教程(6):文生图、提示词细说与绘图案例

文生图即以文字描述来生成图像,这是目前所有AI绘画软件的基本功能之一。要想画一副好的图片,除了选择好的模型,在文生图中,提示词特别关键。 一、什么是提示词(Prompt) 提示词又称创意、关键词、咒语、ca…

MATLAB实现遗传算法优化风电_光伏_光热_储热优化

1. 问题定义 目标:最小化输出负荷与需求负荷的偏差平方和。决策变量:每个时间步长的风电、光伏、光热和储热输出功率。约束条件: 风电、光伏、光热的输出功率不得超过其最大容量。储热系统的输出功率(充放电)不得超过…

Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(一)

Ubuntu20.04本地配置IsaacLab的G1训练环境(一) 配置Omniverse环境配置IsaacSim配置IsaacLab 写在前面,如果Ubuntu剩余空间低于60G,则空间不足,除非你不需要资产包。但资产包中却包含了G1模型、Go2模型等机器人模型和代…

Linux文管读写书签

文件:~/.config/gtk-3.0/bookmarks 格式:file://路径 名称,每个一行。 QTreeWidgetItem清空item所有子节点 读取书签 void MainWindow::genBookmark() {QString fp QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) &…

芋道打包时报错:缺失@unocss插件

在遇到打包时,报这个错误,提示构建失败是因为 ESLint 在加载 unocss 插件时,找不到 unocss/eslint-plugin 模块 解决办法:安装缺失的依赖:保证unocss/eslint-plugin已经被正确安装, 使用以下命令安装&…

【JAVA架构师成长之路】【JVM实战】第2集:生产环境内存飙高排查实战

课程标题:生产环境内存飙高排查实战——从堆转储到代码修复的15分钟指南 目标:掌握内存泄漏与OOM问题的系统性排查方法,快速定位代码或配置缺陷 0-1分钟:问题引入与核心现象 线上服务内存持续增长,触发频繁Full GC甚至OOM(OutOfMemoryError),导致服务崩溃。常见诱因:…

PROFINET转PROFIBUS从案例剖析网关模块的协议转换功能

一、 案例背景 在当下追求高效协同的工业自动化生产体系里,设备间的无缝互联互通堪称关键要素。某企业的生产车间中,有一台性能稳定的变频器,其配备的是PROFIBUS接口。与此同时,操控整个生产线的核心大脑——西门子1500 PLC&…

flutter环境最新踩坑

## Flutter 开发常见问题排查与解决 ### 1. 项目初始化与依赖问题 bash # 清理项目 flutter clean # 获取依赖 flutter pub get # 详细日志运行 flutter run -v ### 2. 网络和下载问题 - 网络慢可能导致依赖下载卡住 - 使用 -v 参数可查看详细日志 - 检查网络连接 - 可以尝…

xss笔记与打靶(更新中)

这个文章好 https://blog.csdn.net/huangyongkang666/article/details/123624164?fromshareblogdetail&sharetypeblogdetail&sharerId123624164&sharereferPC&sharesource2401_88818565&sharefromfrom_link 什么是xss XSS(跨站脚本攻击&…

Visual Studio 2022新建c语言项目的详细步骤

步骤1:点击创建新项目 步骤2:到了项目模板 --> 选择“控制台应用” (在window终端运行代码。默认打印"Hello World") --> 点击 “下一步” 步骤3:到了配置新项目模块 --> 输入“项目名称” --> 更改“位置”路径&…

SQL进阶技巧:上课时长计算

目录 0 问题描述 1 数据准备 2 问题解决 核心难点 时间区间标记与分组 区间合并与时长计算

HashMap 在多线程环境下可能引发哪些问题?如何解决?

HashMap 在多线程环境下可能引发哪些问题? 答案: 在多线程同时操作 HashMap 时,可能引发 死循环、数据丢失、脏数据读取 等问题。 根本原因: HashMap 的设计是非线程安全的,多线程并发修改其结构(如扩容、…

告别GitHub连不上!一分钟快速访问方案

一、当GitHub抽风时,你是否也这样崩溃过? 😡 npm install卡在node-sass半小时不动😭 git clone到90%突然fatal: early EOF🤬 改了半天hosts文件,第二天又失效了... 根本原因:传统代理需要复杂…

【软考-架构】2.1、操作系统概述-进程管理-同步互斥

✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 操作系统知识操作系统概述进程组成和状态💯考试真题前趋图进程资源图💯考试真题问题1问题2 ✨【重点】进程同步与互斥✨💯考试真题问题…

基于开源库编写MQTT通讯

目录 1. MQTT是什么?2. 开发交互UI3. 服务器核心代码4. 客户端核心代码5. 消息订阅与发布6. 通讯测试7. MQTT与PLC通讯最后. 核心总结 1. MQTT是什么? MQTT(Message Queuing Terlemetry Transport)消息队列遥测协议;是…

在VScode下配置C/C++环境(tasks.json、launch.json、c_cpp_properties.json)

文章目录 1. tasks.json、launch.json配置文件中参数(属性)的说明2. tasks.json介绍3. launch.json介绍4. 直接生成tasks.json、launch.json配置文件的另外一种方式5. c_cpp_properties.json介绍6. 运行多个C/C文件7. 命令行方式编译C 1. tasks.json、launch.json配置文件中参数…

ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)

目录 1.局部地图跟踪 1.1 更新局部关键帧UpdateLocalKeyFrames 1.2 更新局部地图点(来自局部关键帧)UpdateLocalPoints() 1.3 投影匹配 2. 对比四种跟踪方式以及使用的投影匹配 3.关键帧创建 3.1 判断是否需要创建新关键帧: NeedNewKeyFrame() 3…

PostgreSQL时间计算大全:从时间差到时区转换(保姆级教程)

一、时间计算的三大核心场景 当你遇到这些需求时,本文就是你的救星🌟: 倒计时功能:计算活动剩余天数 用户行为分析:统计操作间隔时间 跨国系统:多时区时间统一管理 报表生成:自动计算同比/环…