详解AI采集框架Crawl4AI,打造智能网络爬虫

本文章已经生成可运行项目,
查看更多项目 查看更多项目 查看更多项目

大家好,Crawl4AI作为开源Python库,专门用来简化网页爬取和数据提取的工作。它不仅功能强大、灵活,而且全异步的设计让处理速度更快,稳定性更好。无论是构建AI项目还是提升语言模型的性能,Crawl4AI都能帮您简化工作流程。它可以直接在Python项目中使用,或者将其集成到REST API中,实现快速、稳定的数据爬取和处理。这样,无论是数据的实时获取还是后续的分析处理,都能更加得心应手。

1.快速使用

以下是个简单的例子,展示了Crawl4AI强大的异步能力:

import asyncio
from crawl4ai import AsyncWebCrawler

asyncdef main():
    # 初始化异步网页爬虫
    asyncwith AsyncWebCrawler(verbose=True) as crawler:
        # 爬取指定的 URL
        result = await crawler.arun(url="https://www.nbcnews.com/business")
        # 以 Markdown 格式显示提取的内容
        print(result.markdown)

# 执行异步主函数
if __name__ == "__main__":
    asyncio.run(main())

解释:

  • 导入库:从crawl4ai库中导入AsyncWebCrawlerasyncio模块。

  • 创建异步上下文:使用异步上下文管理器实例化AsyncWebCrawler

  • 运行爬虫:使用arun() 法异步爬取指定的 URL 并提取有意义的内容。

  • 打印结果:输出提取的内容,格式化为 Markdown。

  • 执行异步函数:使用asyncio.run()执行异步的main函数。

2.特性亮点

Crawl4AI具备以下核心特性,让网页爬取和数据提取工作更加高效:

  • 开源免费:无额外费用,开源可信赖。

  • 快速性能:速度超越许多付费工具。

  • 多样输出:支持JSON、清洁HTML、Markdown格式。

  • 多URL并发:一次性处理多个网页,提升效率。

  • 媒体提取:全面抓取图片、音频、视频等。

  • 链接全收集:不遗漏任何内外链接。

  • 元数据抽取:深入提取网页信息。

  • 自定义操作:自定义请求头、认证,修改页面后再爬取。

  • 用户代理模拟:模拟不同设备访问。

  • 页面截图:快速获取网页视觉快照。

  • JavaScript支持:执行JS获取动态内容。

  • 数据结构化:精确提取结构化数据。

  • 智能提取技术:使用余弦聚类和LLM技术。

  • CSS选择器:精准定位数据。

  • 指令优化:通过指令提升提取效果。

  • 代理配置:增强访问权限和隐私保护。

  • 会话管理:轻松处理多页爬取。

  • 异步架构:提升性能和可扩展性。

3.安装指南

Crawl4AI提供了多种安装方式,以适应不同的使用场景。以下是几种常用的安装方法:

3.1 基本安装(推荐)

对于大多数网页爬取和数据抓取任务,可以直接使用pip进行安装:

pip install crawl4ai

这样,默认安装的是Crawl4AI的异步版本,使用Playwright进行网页爬取。

如果安装时遇到Playwright相关错误,可以通过以下命令手动安装Playwright:

playwright install

或者,安装特定版本的Chromium:

python -m playwright install chromium

3.2 同步版本安装

如果需要使用Selenium的同步版本,可以使用以下命令:

pip install crawl4ai[sync]

3.3 开发者安装

对于想要参与项目开发,修改源代码的贡献者,可以通过以下步骤进行安装:

git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e .

4.高级应用

要想充分发挥Crawl4AI的能力,可以看看这些高级功能和应用案例:

4.1 执行JavaScript和使用CSS选择器

可以利用Crawl4AI执行自定义JavaScript代码,以及通过CSS选择器精准定位页面元素,从而提升爬取任务的效率和精确度。这让你能够更灵活地处理复杂的网页数据抓取需求。

import asyncio
from crawl4ai import AsyncWebCrawler

asyncdef main():
    asyncwith AsyncWebCrawler(verbose=True) as 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="article.tease-card",
            bypass_cache=True
        )
        print(result.extracted_content)

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

4.2 使用代理

通过将爬取任务路由到代理,增强隐私和访问权限。

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())

4.3 不使用 LLM 提取结构化数据

使用JsonCssExtractionStrategy精确提取使用 CSS 选择器的结构化数据。

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

asyncdef extract_news_teasers():
    schema = {
        "name": "News Teaser Extractor",
        "baseSelector": ".wide-tease-item__wrapper",
        "fields": [
            {"name": "category", "selector": ".unibrow span[data-testid='unibrow-text']", "type": "text"},
            {"name": "headline", "selector": ".wide-tease-item__headline", "type": "text"},
            {"name": "summary", "selector": ".wide-tease-item__description", "type": "text"},
            {"name": "time", "selector": "[data-testid='wide-tease-date']", "type": "text"},
            {
                "name": "image",
                "type": "nested",
                "selector": "picture.teasePicture img",
                "fields": [
                    {"name": "src", "type": "attribute", "attribute": "src"},
                    {"name": "alt", "type": "attribute", "attribute": "alt"},
                ],
            },
            {"name": "link", "selector": "a[href]", "type": "attribute", "attribute": "href"},
        ],
    }
    extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)
    asyncwith 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, "Failed to crawl the page"
        news_teasers = json.loads(result.extracted_content)
        print(f"Successfully extracted {len(news_teasers)} news teasers")
        print(json.dumps(news_teasers[0], indent=2))

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

4.4 使用 OpenAI 提取结构化数据

利用 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.")

asyncdef main():
    asyncwith AsyncWebCrawler(verbose=True) as crawler:
        result = await crawler.arun(
            url='https://openai.com/api/pricing/',
            word_count_threshold=1,
            extraction_strategy=LLMExtractionStrategy(
                provider="openai/gpt-4
o",
                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())

4.5 会话管理 & 动态内容爬取

处理复杂的场景,如爬取通过 JavaScript 加载动态内容的多个页面:

import asyncio
import re
from bs4 import BeautifulSoup
from crawl4ai import AsyncWebCrawler

asyncdef crawl_typescript_commits():
    first_commit = ""
    asyncdef on_execution_started(page):
        nonlocal first_commit 
        try:
            whileTrue:
                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"Warning: New content didn't appear after JavaScript execution: {e}")
    asyncwith AsyncWebCrawler(verbose=True) as crawler:
        crawler.crawler_strategy.set_hook('on_execution_started', on_execution_started)
        url = "https://github.com/microsoft/TypeScript/commits/main"
        session_id = "typescript_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):  # Crawl 3 pages
            result = await crawler.arun(
                url=url,
                session_id=session_id,
                css_selector="li.Box-sc-g0xbh4-0",
                js=js_next_page if page > 0elseNone,
                bypass_cache=True,
                js_only=page > 0
            )
            assert result.success, f"Failed to crawl page {page + 1}"
            soup = BeautifulSoup(result.cleaned_html, 'html.parser')
            commits = soup.select("li.Box-sc-g0xbh4-0")
            all_commits.extend(commits)
            print(f"Page {page + 1}: Found {len(commits)} commits")
        await crawler.crawler_strategy.kill_session(session_id)
        print(f"Successfully crawled {len(all_commits)} commits across 3 pages")

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

5.性能对比

Crawl4AI在设计上注重速度和效率,性能持续超越许多付费服务。以下是性能测试结果:

要点总结:

  • 简单爬取:Crawl4AI的速度是Firecrawl的4倍以上。

  • 带JavaScript执行:即使在执行JavaScript加载更多内容的情况下(图片数量增加一倍),Crawl4AI的速度依然远超Firecrawl的简单爬取。

本文已生成可运行项目
<think>我们正在讨论一个命令:!crawl4ai-setup。根据名称,它可能与设置爬虫crawler)相关,用于AI人工智能)目的。 由于这是一个特定的命令,可能来自某个特定的框架或工具,我们需要根据常见的上下文进行推测。 通常,以“crawl”开头的命令通常与网络爬虫有关,而“setup”表示设置或初始化。因此,这个命令可能是用来初始化或配置一个用于AI数据采集爬虫环境。 可能的用途: 1. 安装必要的依赖(如爬虫库、AI库等)。 2. 创建配置文件或目录结构。 3. 设置环境变量或默认参数。 4. 下载预训练模型或示例数据。 然而,由于没有具体的上下文(如出现在哪个框架或工具中),我们只能给出一般性解释。 因此,我们可以这样解释: **!crawl4ai-setup** 命令是一个用于配置和初始化爬虫环境的命令,旨在为AI相关的数据采集任务做准备。它可能执行以下操作: - 安装必要的Python包(如requests, beautifulsoup4, scrapy等)。 - 创建项目目录结构。 - 设置默认的配置文件(例如,用户代理、爬取延迟等)。 - 可能还会包括一些AI模型所需的环境设置(如TensorFlow或PyTorch的安装,但通常AI模型训练环境与爬虫环境是分开的,除非这个工具是专门为AI数据采集设计的)。 由于命令前有感叹号(!),它可能是一个shell命令(如在Linux终端中)或者是在某个特定环境(如Jupyter Notebook)中使用的魔术命令(magic command)。在Jupyter Notebook中,以感叹号开头的命令表示在系统shell中执行。 因此,在Jupyter Notebook中,你可能会这样使用: ``` !crawl4ai-setup ``` 或者在终端中直接运行: ``` crawl4ai-setup ``` 但是,请注意,这个命令可能是一个自定义脚本,所以需要确保它已经在你的系统路径中,或者你需要在特定的环境中运行。 由于没有具体的文档,我们只能推测。如果这个命令来自某个特定的包,建议查看该包的文档。 为了帮助用户更好地理解,我们可以生成一些相关问题。 §§相关问题§§ 1. 如何安装crawl4ai-setup工具? 2. crawl4ai-setup支持哪些配置选项? 3. 运行crawl4ai-setup后,如何验证安装成功? 4. 这个命令通常用于哪些AI项目? 5. 使用crawl4ai-setup需要预先安装什么依赖吗?</think>### !crawl4ai-setup 命令详解 #### 1. **基本含义** `!crawl4ai-setup` 是一个命令行工具或脚本,用于为 AI 数据采集任务(如网络爬虫)初始化环境。其核心功能包括: - **环境配置**:安装爬虫框架(如 Scrapy、BeautifulSoup)和 AI 依赖库(如 PyTorch/TensorFlow)[^1] - **预设模板生成**:创建标准化的爬虫项目结构、配置文件(如 `scrapy.cfg`)和数据处理管道 - **认证设置**:配置 API 密钥(如 OpenAI)、代理设置或用户代理池[^2] - **资源预加载**:下载预训练模型、数据集或常用 NLP 工具(如 NLTK 数据包) #### 2. **典型使用场景** ```bash # 基础初始化(创建项目目录并安装依赖) !crawl4ai-setup init --project=news_crawler # 指定技术栈(使用Scrapy+PyTorch) !crawl4ai-setup config --scrapy --pytorch # 设置云服务密钥 !crawl4ai-setup auth --openai_key=sk-xxx --proxy=192.168.1.1:8080 ``` #### 3. **关键参数说明** | 参数 | 作用 | 示例 | |------|------|------| | `--project` | 指定项目名称 | `--project=product_reviews` | | `--scrapy` | 启用 Scrapy 框架支持 | `--scrapy` | | `--selenium` | 启用动态页面渲染支持 | `--selenium` | | `--transformers` | 加载 Hugging Face 模型 | `--transformers=bert-base-uncased` | | `--data_path` | 自定义数据存储路径 | `--data_path=/mnt/ai_datasets` | #### 4. **技术实现原理** 该命令实质是自动化脚本,典型工作流程: 1. 验证系统环境(Python ≥ 3.8) 2. 生成项目目录树: ``` /crawler/ ├── spiders/ ├── pipelines.py # 数据清洗和AI预处理 └── items.py # 数据结构定义 ``` 3. 通过包管理器安装依赖: ```bash pip install scrapy selenium transformers torch ``` 4. 注入环境变量到 `.env` 文件: ```ini OPENAI_API_KEY=sk-xxx PROXY_ENABLED=True ``` #### 5. **典型输出** ```plaintext [SUCCESS] Project "news_crawler" created at /home/user/news_crawler • Installed packages: scrapy==2.11, torch==2.0, transformers==4.30 • Configured OpenAI API key (length: 56) • Proxy settings enabled (10 rotating IPs) Run your first crawler: !crawl4ai-run --spider=news_spider ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值