一、Crawl4AI简介

Crawl4AI 是一个开源的、对大语言模型(LLM)高度友好的网络爬虫和抓取工具。它的核心能力是将网页内容快速转换为清洁、结构化的 Markdown 格式,从而方便应用在 RAG(检索增强生成)、智能代理以及数据处理管道中。由于具备高效的数据处理能力,该项目在社区中已经获得超过 50,000 星的支持。

与传统爬虫相比,Crawl4AI 提供了高速、可控且资源感知的爬取功能。它不仅能在保持高效的同时降低系统资源消耗,还能通过强大的结构化数据提取技术,将复杂网页转化为高价值信息。对开发者而言,只需引入一个 Python 包即可轻松使用,降低了上手门槛。

文章首发公 众 号 【风间技术私享】 ,期待您的关注,欢迎加我好友。

二、实战案例

2.1 简单案例

Crawl4主要需要一个python包

pip install crawl4ai

首先来看一个最基础的示例。通过安装 Crawl4AI 并执行以下代码,就能将目标网页转化为干净的 Markdown 内容。

import asyncio
from crawl4ai import AsyncWebCrawler
from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig

async def main():
    browser_config = BrowserConfig()  # Default browser configuration
    run_config = CrawlerRunConfig()   # Default crawl run configuration

    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url="https://blog.csdn.net/weixin_45399602/article/details/148739200",
            config=run_config
        )
        print(result.markdown)  # Print clean markdown content

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

效果如下

运行后,如果在 Windows 环境中遇到 Executable doesn't exist 的报错,则需要额外执行 playwright install 来完成浏览器依赖的安装。

windows下需要执行

playwright install    

2.2 多种返回值

除了 Markdown,Crawl4AI 的 arun() 方法还会返回一个 CrawlResult 对象,其中包含丰富的属性,例如原始 HTML、清洗后的 HTML、提取的媒体资源与链接、HTTP 状态码等。借助这些信息,用户可以更灵活地处理爬取结果。

import asyncio
from crawl4ai import AsyncWebCrawler, DefaultMarkdownGenerator, PruningContentFilter
from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig

async def main():
    browser_config = BrowserConfig()  # Default browser configuration

    run_config = CrawlerRunConfig(
        markdown_generator=DefaultMarkdownGenerator(
            content_filter=PruningContentFilter(threshold=0.6),
            options={"ignore_links": True}
        )
    )

    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url="https://blog.csdn.net/weixin_45399602/article/details/148739200",
            config=run_config
        )
        print(result.markdown)  # Print clean markdown content
        print(result.html)  # Raw HTML
        print(result.cleaned_html)  # Cleaned HTML
        print(result.markdown.raw_markdown)  # Raw markdown from cleaned html
        print(result.markdown.fit_markdown)  # Most relevant content in markdown

        # Check success status
        print(result.success)  # True if crawl succeeded
        print(result.status_code)  # HTTP status code (e.g., 200, 404)

        # Access extracted media and links
        print(result.media)  # Dictionary of found media (images, videos, audio)
        print(result.links)

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


2.3 添加基本选项

在实际应用中,开发者往往需要根据场景自定义爬取行为。通过 CrawlerRunConfig,我们可以指定字数阈值、是否过滤外部链接、是否去除弹窗元素,以及是否处理 iframe 等。这些配置项使得爬取过程更加灵活可控。

import asyncio
from crawl4ai import AsyncWebCrawler, DefaultMarkdownGenerator, PruningContentFilter
from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig

async def main():
    browser_config = BrowserConfig()  # Default browser configuration

    run_config = CrawlerRunConfig(
        word_count_threshold=10,  # Minimum words per content block
        exclude_external_links=True,  # Remove external links
        remove_overlay_elements=True,  # Remove popups/modals
        process_iframes=True  # Process iframe content
    )

    async with AsyncWebCrawler(config=browser_config) as crawler:
        result = await crawler.arun(
            url="https://blog.csdn.net/weixin_45399602/article/details/148739200",
            config=run_config
        )
        print(result.markdown)  # Print clean markdown content

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

三、Crawl4AI主要功能概览

  1. AI 优化 Markdown 生成
  • 启发式过滤:自动去除噪声,保留准备用于 LLMs 摄入的内容。
  • 结构化输出:生成带有正确引用和有序章节的 Markdown。
  1. 结构化数据提取
  • 基于 CSS/XPath 的方法:快速解析网页中的重复元素。
  • LLM 驱动提取:与流行的语言模型(例如 GPT-4、Llama)集成,用于复杂模式提取。
  1. 强大的浏览器集成
  • 管理会话:通过持久浏览器配置文件保留认证状态和 cookies。
  • 动态内容处理:执行 JavaScript 并支持懒加载内容,以实现全页抓取。
  1. 深度抓取策略
  • 多种搜索策略:可选择广度优先搜索(BFS)、深度优先搜索(DFS)或最佳优先搜索方法。
  • 内存自适应调度器:根据系统资源动态调整并发量,以防止过载。
  1. 易用性和部署
  • 简单安装:通过 pip 或 Docker 安装,只需少量配置。
  • 直观的 CLI:使用容易记住的命令从终端运行爬取。

四、数据分析案例

除了抓取数据,Crawl4AI 还可以直接服务于数据分析场景。例如,我们可以将目标 URL 的内容转化为 Markdown,再进一步统计其中的关键指标,如字数、标题数量和链接数量。

import asyncio
from crawl4ai import AsyncWebCrawler

async def crawl_site(url):
    async with AsyncWebCrawler() as crawler:
        result = await crawler.arun(url=url)
        return result.markdown
# Example usage:
if __name__ == "__main__":
    markdown_data = asyncio.run(crawl_site("https://blog.csdn.net/weixin_45399602/article/details/148739200"))
    print(markdown_data)

上述代码片段获取并打印了示例 URL 的 Markdown 内容。

4.1 数据预处理和指标提取

我们随后处理 Markdown 数据,以提取诸如字数、标题数量和链接数量等关键指标。

增加下面的代码

import re
import pandas as pd


def analyze_markdown(markdown_text):
    # 字符统计
    word_count = len(markdown_text.split())
    
    
    headings = [line for line in markdown_text.splitlines() if re.match(r"^#+\s", line)]
    num_headings = len(headings)
    
    
    links = re.findall(r"\[.*?\]\((.*?)\)", markdown_text)
    num_links = len(links)
    
    # 数据转换成成字典
    metrics = {
        "Word Count": word_count,
        "Number of Headings": num_headings,
        "Number of Links": num_links
    }
    
    return metrics

#分析数据
sample_metrics = analyze_markdown(markdown_data)
df_metrics = pd.DataFrame(list(sample_metrics.items()), columns=["Metric", "Value"])
print(df_metrics)

代码执行后获得如下效果

五、原理

以上述的案例来说,Crawl4整体的流程为:

供应商(输入) ─> 异步网页抓取器 ─> 基于 LLM 的提取器 ─> 结构化 JSON 输出 ─> (可选)Markdown ─> CSV

在Crawl4中,主要以下面四个组件组成:

  • AsyncWebCrawler : 协调并发网页爬取。
  • LLMExtractionStrategy : 使用 GPT 模型提取结构化字段。
  • BM25ContentFilter : 确保仅将相关内容传递给 LLMs。
  • MarkdownGenerator : 可选的人性化预览渲染。

六、总结

Crawl4AI 的效率在与其传统爬虫性能对比时显而易见:

  • 速度提升:得益于异步处理与内存自适应调度器,爬取效率最高可提升 6 倍;

    动态扩展:能够根据可用资源动态调整并发任务数,确保在不同硬件条件下都能稳定运行;

    应用价值:尤其适合实时应用和大规模数据提取任务。

这些优势对实时应用和大规模数据提取任务尤为有益。

更多的内容可以在官网查看。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐