继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Crawl4AI:高效网络爬取的利器

动漫人物
关注TA
已关注
手记 262
粉丝 18
获赞 71

在当今数据驱动的世界中,高效收集和处理信息的技能对于人工智能(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的核心功能,并通过代码示例来展示如何优化网页数据抓取。

💻 安装说明.

有几种方式可以安装 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: 是否不使用缓存

提取的内容有多种形式,例如markdowncleaned_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爬取、媒体提取以及支持多种高级输出格式等功能,是一款功能强大且高效的网页抓取工具,专为满足现代数据收集需求而设计。无论是开发者、研究人员还是企业主,它都能提供必要的资源来简化数据提取流程,并最大化洞察的价值。

参考文献:
  1. Crawl4AI 文档页面
  2. Crawl4AI GitHub 页面
  3. Crawl4AI:帮助 AI 代理自动化网页抓取和数据提取

    [OOP]:面向对象程序设计
    [CRUD]:增删查改
    [JVM]:Java虚拟机
    [SUT]:待测系统

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP