Crawl4AI: 适合大语言模型的开源网页爬取与信息提取利器

Crawl4AI

Crawl4AI是一款专为简化网页爬取和信息提取而设计的工具,特别适合大语言模型(LLMs)和AI应用。

图片

无论你是通过REST API、Python 库,还是Google Colab笔记本来使用,Crawl4AI都能提供强大的功能,让网页数据提取变得更加简单和高效。你无需安装任何额外的库,就能轻松地从多个网页获取所需的信息。

Crawl4AI提供了多种使用方式:你可以直接使用官方服务器上的 REST API,也可以在本地运行服务器。

此外,Crawl4AI的Python库允许你根据具体需求自定义爬取和提取策略,提供更高级的控制。

通过Crawl4AI,你可以高效地提取网页上的文本、图片、音频、视频和链接,为你的LLMs和AI应用提供强大的数据支持。

主要功能

功能 描述
完全免费和开源 Crawl4AI 是免费使用且开源的,任何人都可以访问。
适用于 LLM 的输出格式 支持 JSON、清理后的 HTML 和 markdown 格式。
并发爬取 可以同时爬取多个 URL,节省时间。
媒体提取 提取所有媒体标签,包括图片、音频和视频。
链接提取 从网页中提取所有外部和内部链接。
元数据提取 提取网页的元数据以获取更多上下文信息。
自定义钩子 定义自定义钩子,用于身份验证、头部信息和爬取前的页面修改。
用户代理支持 自定义 HTTP 请求的用户代理。
截图功能 在爬取过程中对网页进行截图。
JavaScript 执行 在爬取前执行自定义 JavaScript。
高级分块和提取策略 使用基于主题、正则表达式、句子分块、余弦聚类和 LLM 的提取策略。
支持 CSS 选择器 使用 CSS 选择器提取特定内容。
指令/关键词优化 传递指令或关键词以优化提取过程。

安装

使用 Crawl4AI 有三种方式:

1、作为库使用(推荐)

pip install "crawl4ai[all] @ git+https://github.com/unclecode/crawl4ai.git"

2、作为本地服务器(Docker)或使用 REST API

这个选项安装与transformer相关的依赖项并下载模型。

# 对于 Mac 用户 (M1/M2)
docker build --platform linux/amd64 --build-arg INSTALL_OPTION=transformer -t crawl4ai:transformer .

# 对于其他用户
docker build --build-arg INSTALL_OPTION=transformer -t crawl4ai:transformer .

# 运行容器
docker run -d -p 8000:80 crawl4ai:transformer

3、作为本地服务器(Docker),使用 Docker Hub 上的预构建镜像

你可以使用Docker Hub上的预构建Crawl4AI镜像,这些镜像适用于所有平台(Mac,Linux,Windows)

# 拉取镜像
docker pull unclecode/crawl4ai:latest

# 运行容器
docker run -d -p 8000:80 unclecode/crawl4ai:latest

运行容器后,你可以测试是否正常工作:

在Windows (PowerShell)上:

Invoke-WebRequest -Uri http://localhost:8000

或者打开浏览器,导航到http://localhost:8000

快速入门指南

首先,我们创建一个WebCrawler实例并调用warmup()函数。

第一次运行Crawl4AI时可能需要几秒钟,因为它需要加载所需的模型文件。

from crawl4ai import WebCrawler

def create_crawler():
    crawler = WebCrawler(verbose=True)
    crawler.warmup()
    return crawler

crawler = create_crawler()

基本用法

只需提供一个URL!

result = crawler.run(url="https://www.nbcnews.com/business")
print(f"Basic crawl result: {result}")

截图

让我们对页面进行截图!

result = crawler.run(url="https://www.nbcnews.com/business", screenshot=True)
with open("screenshot.png", "wb") as f:
    f.write(base64.b64decode(result.screenshot))
print("Screenshot saved to 'screenshot.png'!")

理解参数

默认情况下,Crawl4AI会缓存爬取结果,这意味着对相同URL的后续爬取会更快!让我们看看这个功能。

第一次爬取(缓存结果):

result = crawler.run(url="https://www.nbcnews.com/business")
print(f"First crawl result: {result}")

强制重新爬取

result = crawler.run(url="https://www.nbcnews.com/business", bypass_cache=True)
print(f"Second crawl result: {result}")

添加分块策略

让我们添加一个分块策略:RegexChunking!这个策略根据给定的正则表达式模式拆分文本。

from crawl4ai.chunking_strategy import RegexChunking

result = crawler.run(
    url="https://www.nbcnews.com/business",
    chunking_strategy=RegexChunking(patterns=["\n\n"])
)
print(f"RegexChunking result: {result}")

你还可以使用NlpSentenceChunking,它利用NLP技术将文本拆分为句子。

from crawl4ai.chunking_strategy import NlpSentenceChunking

result = crawler.run(
    url="https://www.nbcnews.com/business",
    chunking_strategy=NlpSentenceChunking()
)
print(f"NlpSentenceChunking result: {result}")

添加提取策略

让我们变得更聪明,使用提取策略:CosineStrategy!这个策略利用余弦相似度提取语义上相似的文本块。

from crawl4ai.extraction_strategy importCosineStrategy

result = crawler.run(
    url="https://www.nbcnews.com/business",
    extraction_strategy=CosineStrategy(
        word_count_threshold=10,
        max_dist=0.2,
        linkage_method="ward",
        top_k=3
)
)
print(f"CosineStrategy result: {result}")

你还可以传递其他参数,如semantic_filter,以提取特定内容。

result = crawler.run(
    url="https://www.nbcnews.com/business",
    extraction_strategy=CosineStrategy(
        semantic_filter="inflation rent prices"
    )
)
print(f"CosineStrategy result with semantic filter: {result}")

使用 LLMExtractionStrategy

这个策略利用大型语言模型从网页中提取相关信息。

from crawl4ai.extraction_strategy import LLMExtractionStrategy
import os

result = crawler.run(
    url="https://www.nbcnews.com/business",
    extraction_strategy=LLMExtractionStrategy(
        provider="openai/gpt-4o", 
        api_token=os.getenv('OPENAI_API_KEY')
    )
)
print(f"LLMExtractionStrategy (no instructions) result: {result}")

你还可以提供特定的指令来指导提取。

result = crawler.run(
    url="https://www.nbcnews.com/business",
    extraction_strategy=LLMExtractionStrategy(
        provider="openai/gpt-4o",
        api_token=os.getenv('OPENAI_API_KEY'),
        instruction="I am interested in only financial news"
    )
)
print(f"LLMExtractionStrategy (with instructions) result: {result}")

目标提取

使用CSS选择器只提取H2标签!

result = crawler.run(
    url="https://www.nbcnews.com/business",
    css_selector="h2"
)
print(f"CSS Selector (H2 tags) result: {result}")

交互提取

传递JavaScript代码点击“加载更多”按钮!

const loadMoreButton = Array.from(document.querySelectorAll('button')).find(button => button.textContent.includes('Load More'));
loadMoreButton && loadMoreButton.click();
result = crawler.run(
    url="https://www.nbcnews.com/business",
    js=js_code
)
print(f"JavaScript Code (Load More button) result: {result}")

使用爬虫钩子

import time

from crawl4ai.web_crawler importWebCrawler
from crawl4ai.crawler_strategy import*

defdelay(driver):
print("Delaying for 5 seconds...")
    time.sleep(5)
print("Resuming...")

defcreate_crawler():
    crawler_strategy =LocalSeleniumCrawlerStrategy(verbose=True)
    crawler_strategy.set_hook('after_get_url', delay)
    crawler =WebCrawler(verbose=True, crawler_strategy=crawler_strategy)
    crawler.warmup()
return crawler

crawler = create_crawler()
result = crawler.run(url="https://www.nbcnews.com/business", bypass_cache=True)

入门体验

拿之前文章做个验证。Redka = SQLite 重新实现 Redis

from crawl4ai.web_crawler import WebCrawler

crawler = WebCrawler()
crawler.warmup()

result = crawler.run(
    url='https://mp.weixin.qq.com/s?__biz=Mzg2MDg5NzE5NA==&mid=2247489168&idx=1&sn=9d7cee1d5641b0ad89568d48ccdef75c&chksm=ce1e3c55f969b5439f0efbbee58ebd3654238a90b049c603f13cc98450f5893e64d222d23f89&token=1468678215&lang=zh_CN#rd',
    screenshot=true
)
print(result)                

适用于 LLM 的输出格式

导出markdown

图片

JSON格式

图片

截屏

图片

THE END