开源分享| Crawl4AI: 使用AI让抓取数据、整理合二为一!

科技   2024-11-07 08:22   浙江  

🚀 Crawl4AI: 让数据抓取成为 AI 友好的新选择!

今天想跟大家分享一款开源工具 Crawl4AI,它不仅免费,还让大型语言模型(LLMs)和 AI 应用的网页数据抓取变得更高效、更智能!Crawl4AI 设计上主要为了能兼容 AI 生成内容需求,专注于稳定、快速的数据提取,尤其是在反爬、动态内容和代理支持等复杂场景下表现出色。

🧑‍💻 强大助手:Crawl4AI 的“Copilot”

Crawl4AI 的最大亮点之一是它的智能助手。这是一个针对开发者和数据科学家的 AI 驱动的爬虫帮手,不但可以自动生成复杂的抓取代码,还会根据具体需求提供示例与指导,方便用户学习和适应 Crawl4AI。

主要功能亮点:

  • 生成 Markdown 格式内容:自动提取页面文章主内容并生成 markdown。
  • 防反爬支持:内置高级反反爬机制,能智能避开网站的反爬虫检测。
  • 多浏览器支持:可以在 Chromium、Firefox 和 WebKit 间无缝切换。
  • 数据缓存与批处理优化:更好的缓存系统和速率控制,显著提升性能。

🚀 Crawl4AI 的核心功能

🌟 LLM 友好输出

Crawl4AI 专为与 AI 友好的格式设计,可以直接导出 JSON、HTML 和 Markdown 格式,确保输出的数据格式规范、干净,适合直接供 AI 模型使用。

🌐 多浏览器支持

它支持 Chromium、Firefox 和 WebKit,用户可以根据需求自由选择浏览器,适应不同的抓取场景。支持多页面、多 URL 的并发抓取,效率极高。

📜 数据结构化提取

Crawl4AI 支持多种数据提取策略,除了基本的 CSS 选择器外,还提供基于话题、正则、句子的分段方式。用户可以使用预先定义的结构化提取策略,例如根据 CSS 选择器指定特定的标签和字段,直接抓取结构化内容。

📊 多种自定义提取策略

Crawl4AI 提供包括余弦聚类在内的多种高级提取方式,用户可以用少量指令便可控制提取数据的精度,还可以传递关键字或设定来进一步优化抓取。

🔄 防反爬策略与代理支持

它提供了代理支持和用户代理自定义选项,可以配合设置复杂的多页面会话和延迟内容加载,确保能够绕过大部分反爬机制。


📘 快速上手

安装 Crawl4AI 只需几行代码:

pip install crawl4ai

如果需要更高级的异步抓取模式,安装时只需加上 [sync] 参数:

pip install crawl4ai[sync]

安装playwright。

playwright install   

使用 Crawl4AI 可以非常轻松地实现复杂的抓取任务,比如提取文章内容和结构化数据。

🌐 异步提取网页内容示例

以下代码展示了如何使用异步爬虫抓取Github Trending 内容,并输出 Markdown 格式的文本:

import nest_asyncio
nest_asyncio.apply()
import asyncio
from crawl4ai import AsyncWebCrawler

async def main():
    async with AsyncWebCrawler(verbose=Trueas crawler:
        result = await crawler.arun(url="https://github.com/trending")
        print(result.markdown)

if __name__ == "__main__":
    asyncio.run(main())

🖼️ 执行 JavaScript 并使用 CSS 选择器

有些网页需要点击按钮才能加载更多内容,此时可以配合 JavaScript 操作:

import asyncio
from crawl4ai import AsyncWebCrawler

async def main():
    async with AsyncWebCrawler(verbose=Trueas crawler:
        js_code = ["const loadMoreButton = Array.from(document.querySelectorAll('button')).find(button => button.textContent.includes('Load More')); loadMoreButton && loadMoreButton.click();"]
        result = await crawler.arun(
            url="https://www.nbcnews.com/business",
            js_code=js_code,
            css_selector=".wide-tease-item__description",
            bypass_cache=True
        )
        print(result.extracted_content)

if __name__ == "__main__":
    asyncio.run(main())

🌐 使用代理支持复杂抓取任务

为了保护隐私,抓取时可以启用代理支持:

import asyncio
from crawl4ai import AsyncWebCrawler

async def main():
    async with AsyncWebCrawler(verbose=True, proxy="http://127.0.0.1:7890"as crawler:
        result = await crawler.arun(
            url="https://www.nbcnews.com/business",
            bypass_cache=True
        )
        print(result.markdown)

if __name__ == "__main__":
    asyncio.run(main())

🔬 高级功能:结构化数据提取策略

Crawl4AI 提供了多种提取策略,包括基于 JSON-CSS 的结构化提取。以下示例展示了如何配置提取策略来获取新闻摘要:

import asyncio
import json
from crawl4ai import AsyncWebCrawler
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy

async def extract_news_teasers():
    schema = {
        "name""News Teaser Extractor",
        "baseSelector"".news-item",
        "fields": [
            {"name""headline""selector"".headline""type""text"},
            {"name""summary""selector"".summary""type""text"},
            {"name""link""selector""a[href]""type""attribute""attribute""href"},
        ],
    }

    extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)
    async with AsyncWebCrawler(verbose=Trueas crawler:
        result = await crawler.arun(
            url="https://www.example.com/news",
            extraction_strategy=extraction_strategy,
            bypass_cache=True,
        )
        news_teasers = json.loads(result.extracted_content)
        print(news_teasers)

if __name__ == "__main__":
    asyncio.run(extract_news_teasers())

🔬 高级功能:使用OpenAI提取结构化数据

import os
import asyncio
from crawl4ai import AsyncWebCrawler
from crawl4ai.extraction_strategy import LLMExtractionStrategy
from pydantic import BaseModel, Field

class OpenAIModelFee(BaseModel):
    model_name: str = Field(..., description="Name of the OpenAI model.")
    input_fee: str = Field(..., description="Fee for input token for the OpenAI model.")
    output_fee: str = Field(..., description="Fee for output token for the OpenAI model.")

async def main():
    async with AsyncWebCrawler(verbose=Trueas crawler:
        result = await crawler.arun(
            url='https://openai.com/api/pricing/',
            word_count_threshold=1,
            extraction_strategy=LLMExtractionStrategy(
                provider="openai/gpt-4o", api_token=os.getenv('OPENAI_API_KEY'), 
                schema=OpenAIModelFee.schema(),
                extraction_type="schema",
                instruction="""From the crawled content, extract all mentioned model names along with their fees for input and output tokens. 
                Do not miss any models in the entire content. One extracted model JSON format should look like this: 
                {"model_name": "GPT-4", "input_fee": "US$10.00 / 1M tokens", "output_fee": "US$30.00 / 1M tokens"}."""

            ),            
            bypass_cache=True,
        )
        print(result.extracted_content)

if __name__ == "__main__":
    asyncio.run(main())

更多功能,大家可以自己去官网查看,欢迎学习交流。

官方项目地址:https://github.com/unclecode/crawl4ai

⚡ 性能对比

Crawl4AI 的性能在同类工具中十分出色。在速度测试中,Crawl4AI 比 Firecrawl 快 4 倍,甚至在执行 JavaScript 后仍然更快。具体数据如下:

  • Firecrawl:7.02 秒,42074 字符
  • Crawl4AI(简单抓取):1.60 秒,18238 字符
  • Crawl4AI(执行 JavaScript):4.64 秒,40869 字符

这意味着 Crawl4AI 不仅速度快,而且支持更高的内容抓取精度,尤其是在复杂网页和多媒体资源提取方面表现出色。


Crawl4AI 提供了丰富的功能和灵活性,特别适合 AI 和数据分析人员在大规模数据抓取、分析和结构化数据提取方面的应用。


《霍比特人3:五军之战》34765条影评数据可视化分析

一个超级好用的免费提示词生成器

用Python写了一个实时获取上证指数的利器

扫码加我微信,回复:分析
一起迎接AI时代

简说Python
号主老表,自学,分享Python,SQL零基础入门、数据分析、数据挖掘、机器学习优质文章以及学习经验。
 最新文章