Doramagic 项目包 · 项目说明书

firecrawl 项目

生成时间:2026-05-11 04:15:16 UTC

项目概览

Firecrawl 是一个由 Mendable.ai 开发的开源网页抓取和爬虫平台,旨在将网站转换为可供大语言模型(LLM)使用的结构化数据。Firecrawl 提供从网站搜索、内容抓取、页面交互到智能代理的全栈解决方案,帮助开发者轻松获取互联网数据并用于 AI 应用开发。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 Search(搜索)

继续阅读本节完整说明和来源证据。

章节 Scrape(抓取)

继续阅读本节完整说明和来源证据。

章节 Interact(交互)

继续阅读本节完整说明和来源证据。

项目简介

Firecrawl 是一个由 Mendable.ai 开发的开源网页抓取和爬虫平台,旨在将网站转换为可供大语言模型(LLM)使用的结构化数据。Firecrawl 提供从网站搜索、内容抓取、页面交互到智能代理的全栈解决方案,帮助开发者轻松获取互联网数据并用于 AI 应用开发。

项目采用多语言 SDK 架构设计,提供了 Python、Node.js、Java、Ruby、Go、.NET、Rust、PHP 等多种编程语言的官方 SDK,支持开发者使用熟悉的开发环境集成 Firecrawl 功能。资料来源:README.md:1-50

核心功能模块

Firecrawl 平台提供四大核心功能模块,分别对应不同的网页数据采集场景:

Search(搜索)

Search 模块支持对互联网进行自然语言搜索,返回与查询关键词相关的网页列表。每个搜索结果包含 URL、标题和页面摘要的 Markdown 格式内容,非常适合构建知识库或信息检索应用。资料来源:README.md:45-60

Scrape(抓取)

Scrape 是 Firecrawl 最核心的功能模块,用于从单个 URL 提取结构化数据。支持多种输出格式,包括 Markdown、HTML、JSON(通过 Schema 提取)、链接列表、截图等。开发者可以配置只提取主内容、设置等待时间、控制输出格式等参数。资料来源:README.md:70-95

Interact(交互)

Interact 模块支持基于抓取结果的浏览器自动化交互。用户可以先使用 Scrape 抓取页面,然后通过 AI 提示词或 JavaScript 代码与页面进行交互,如点击按钮、填写表单、搜索内容等操作。资料来源:README.md:100-120

Agent(智能代理)

Agent 模块是 Firecrawl 的高级功能,允许开发者使用自然语言描述目标,系统自动完成数据采集和整理。例如,开发者可以描述"查找某公司的创始人信息",Agent 会自动规划搜索路径、抓取相关页面并提取结构化结果。资料来源:apps/python-sdk/README.md:30-35

系统架构

整体架构图

graph TD
    subgraph 客户端层
        Python[Python SDK]
        NodeJS[Node.js SDK]
        Java[Java SDK]
        Ruby[Ruby SDK]
        Go[Go SDK]
        DotNet[.NET SDK]
        Rust[Rust SDK]
        PHP[PHP SDK]
        CLI[Firecrawl CLI]
        DirectAPI[直接 API 调用]
    end

    subgraph API 网关层
        Gateway[API Gateway]
        Auth[身份验证]
        RateLimit[限流控制]
    end

    subgraph 核心服务层
        ScrapeService[Scrape 服务]
        CrawlService[Crawl 服务]
        MapService[Map 服务]
        SearchService[Search 服务]
        AgentService[Agent 服务]
        InteractService[Interact 服务]
    end

    subgraph 数据处理层
        HTMLParser[HTML 解析器]
        MarkdownConverter[Markdown 转换]
        JSONExtractor[JSON Schema 提取]
        ScreenshotEngine[截图引擎]
        GoHTML2MD[Go HTML-to-MD 库]
    end

    subgraph 监控服务
        Monitor[监控服务]
        Notification[通知服务]
    end

    客户端层 --> API 网关层
    API 网关层 --> 核心服务层
    核心服务层 --> 数据处理层
    核心服务层 --> 监控服务

API 端点概览

端点方法功能描述异步支持
/v2/scrapePOST抓取单个 URL 的内容
/v2/crawlPOST启动网站爬虫任务是(轮询)
/v2/mapPOST发现网站所有 URL
/v2/searchPOST互联网全文搜索
/v1/scrapePOST旧版抓取接口

资料来源:README.md:20-80

多语言 SDK 支持

Firecrawl 提供了丰富的官方 SDK,覆盖主流编程语言生态:

SDK 功能对比

SDK包名称安装方式版本特殊功能
Pythonfirecrawl-pypip install firecrawl-py2.xAgent、异步爬虫
Node.js@mendable/firecrawl-jsnpm install @mendable/firecrawl-js最新Zod Schema 支持
Javacom.firecrawl:firecrawl-javaMaven/Gradle1.1.1构建器模式
Rubyfirecrawl-sdkgem install firecrawl-sdk1.0-
Gogithub.com/firecrawl/firecrawl-go-sdkgo get--
.NETfirecrawl-sdkdotnet add package firecrawl-sdk-HttpClient 可定制
RustfirecrawlCargo.toml2.1.0异步运行时
PHPfirecrawl/sdkComposer-Laravel Facade

资料来源:apps/python-sdk/README.md:1-20apps/js-sdk/firecrawl/README.md:1-30apps/java-sdk/README.md:1-20apps/ruby-sdk/README.md:1-25apps/dotnet-sdk/README.md:1-20apps/rust-sdk/README.md:1-30apps/php-sdk/README.md:1-20

Python SDK 示例

from firecrawl import Firecrawl
from firecrawl.types import ScrapeOptions

firecrawl = Firecrawl(api_key="fc-YOUR_API_KEY")

# 抓取单个页面
doc = firecrawl.scrape("https://firecrawl.dev", formats=["markdown"])
print(doc.markdown)

# 批量爬虫
docs = firecrawl.crawl("https://docs.firecrawl.dev", limit=50)
for doc in docs.data:
    print(doc.metadata.source_url)

# 使用 Agent
result = firecrawl.agent(prompt="查找 Stripe 公司的创始人")
print(result.data)

资料来源:apps/python-sdk/README.md:15-45

Node.js SDK 示例

import Firecrawl from '@mendable/firecrawl-js';
import { z } from 'zod';

const app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });

// 使用 Zod Schema 提取结构化数据
const schema = z.object({
  title: z.string(),
  price: z.number(),
});

const result = await app.extract({
  urls: ['https://example.com/product'],
  prompt: '提取产品名称和价格',
  schema,
});

console.log(result.data);

资料来源:apps/js-sdk/firecrawl/README.md:40-60

高级功能

批量抓取(Batch Scrape)

批量抓取功能允许开发者一次性提交多个 URL 进行抓取,适合需要对多个页面进行数据采集的场景。系统会自动管理任务队列和并发控制。资料来源:README.md:80-95

job = app.batch_scrape([
    "https://firecrawl.dev",
    "https://docs.firecrawl.dev",
    "https://firecrawl.dev/pricing"
], formats=["markdown"])

for doc in job.data:
    print(doc.metadata.source_url)

文件解析(Parse)

Parse 功能支持上传本地文件(HTML、PDF、DOCX 等)并进行解析,无需通过 URL 抓取。该功能适用于处理本地文档或通过其他渠道获取的文件内容。资料来源:apps/python-sdk/README.md:60-80

doc = firecrawl.parse(
    b"<!DOCTYPE html><html><body><h1>Content</h1></body></html>",
    filename="upload.html",
    content_type="text/html",
    options=ParseOptions(formats=["markdown"]),
)

JSON Schema 提取

通过 JSON Schema 定义数据结构,Firecrawl 可以自动从页面中提取符合模式的数据,返回结构化的 JSON 输出。资料来源:apps/java-sdk/README.md:50-75

JsonFormat jsonFmt = JsonFormat.builder()
    .prompt("提取产品名称和价格")
    .schema(Map.of(
        "type", "object",
        "properties", Map.of(
            "name", Map.of("type", "string"),
            "price", Map.of("type", "number")
        )
    ))
    .build();

Document doc = client.scrape("https://example.com/product",
    ScrapeOptions.builder()
        .formats(List.of(jsonFmt))
        .build());

网站地图(Map)

Map 功能快速发现网站上的所有页面 URL,支持基于关键词的智能搜索排序。返回结果包含每个 URL 的标题和描述信息。资料来源:README.md:40-50

result = app.map("https://firecrawl.dev", search="pricing")
# 返回与 "pricing" 相关的 URL 列表

配置选项

ScrapeOptions 参数表

参数类型默认值说明
formatsList[str]["markdown"]输出格式列表
only_main_contentboolfalse仅提取主体内容
wait_forint0等待加载时间(毫秒)
timeoutint60000请求超时(毫秒)
remove_base64_imagesbooltrue移除 Base64 图片
include_raw_htmlboolfalse包含原始 HTML
extractor_optionsdictNoneJSON 提取配置
actionsList[dict]None自动化操作列表

CrawlOptions 参数表

参数类型默认值说明
limitintNone最大页面数量
scrape_optionsScrapeOptionsNone抓取配置
poll_intervalint2轮询间隔(秒)
depthintNone爬虫深度限制
allow_dangerousboolfalse允许危险操作

资料来源:apps/python-sdk/README.md:40-65apps/rust-sdk/README.md:30-60

集成生态

Firecrawl 与多个主流平台和工具深度集成:

AI 工具集成

集成产品说明文档链接
Firecrawl SkillCLI 工具集成文档
Firecrawl MCPModel Context Protocol 服务器GitHub
DeepSeek V3 CrawlerDeepSeek 模型驱动的爬虫示例
Gemini 2.5 ExtractorGemini 模型数据提取示例

平台集成

平台说明
Lovable可在 Lovable 应用中直接使用 Firecrawl
Zapier通过 Zapier 自动化工作流集成
n8n支持 n8n 工作流自动化平台

资料来源:README.md:120-140

环境配置

API Key 配置

Firecrawl 支持两种 API Key 配置方式:

  1. 环境变量配置(推荐):设置 FIRECRAWL_API_KEY 环境变量
  2. 代码显式传入:在客户端初始化时直接传入 API Key

常用环境变量

变量名说明示例
FIRECRAWL_API_KEYAPI 密钥(必填)fc-xxxxxxxxxxxx
FIRECRAWL_API_URL自托管实例 URLhttp://localhost:3002
FIRECRAWL_BACKOFF_FACTOR重试退避因子0.5
# Bash/Shell
export FIRECRAWL_API_KEY="fc-your-api-key"
export FIRECRAWL_API_URL="http://localhost:3002"
// .NET
var client = new FirecrawlClient(
    apiKey: "fc-your-api-key",
    apiUrl: "https://your-firecrawl-instance.com",
    httpClient: new HttpClient { Timeout = TimeSpan.FromSeconds(60) }
);

资料来源:apps/dotnet-sdk/README.md:20-45apps/php-sdk/README.md:25-40

工作流程示例

典型数据采集流程

graph LR
    A[确定目标网站] --> B[使用 Map 发现 URL]
    B --> C[评估 URL 相关性]
    C --> D[配置抓取参数]
    D --> E[执行批量抓取]
    E --> F[解析响应数据]
    F --> G[存储结构化数据]

交互式数据提取流程

graph TD
    A[Scrape 抓取页面] --> B[获取 scrapeId]
    B --> C[使用 Interact 交互]
    C --> D[执行 JS 代码或 AI 提示]
    D --> E[等待操作完成]
    E --> F[获取更新后的页面状态]
    F --> G[提取最终数据]

总结

Firecrawl 是一个功能全面的网页数据采集平台,通过统一 API 和多语言 SDK 为开发者提供了便捷的网页抓取、爬虫、搜索和智能代理能力。其设计理念是简化网页数据获取的复杂性,让开发者能够专注于业务逻辑而非底层实现。无论是构建知识库、训练 AI 模型还是自动化数据采集任务,Firecrawl 都能提供可靠的解决方案。

资料来源:[README.md:20-80]()

系统架构

Firecrawl 是一个现代化的网页抓取和数据提取平台,采用微服务化的 SDK 架构设计。系统由中央 API 服务器、多语言 SDK 客户端、异步任务队列服务以及原生性能优化库组成,旨在为 AI 系统提供搜索、抓取和网页交互的完整解决方案。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 API 服务器

继续阅读本节完整说明和来源证据。

章节 队列服务

继续阅读本节完整说明和来源证据。

章节 原生性能库

继续阅读本节完整说明和来源证据。

整体架构概览

Firecrawl 采用典型的客户端-服务器架构,API 服务器托管在 api.firecrawl.dev,通过 RESTful API 与多语言 SDK 进行通信。

graph TD
    A[多语言 SDK 客户端] --> B[Firecrawl API 服务器]
    B --> C[队列服务 Queue Service]
    B --> D[抓取引擎 Scraping Engines]
    B --> E[原生库 Native Libraries]
    C --> F[异步任务处理器]
    D --> G[网站内容]
    E --> H[HTML 转 Markdown]

核心组件

API 服务器

API 服务器是整个系统的核心枢纽,基于 Node.js/TypeScript 构建,负责处理所有客户端请求并进行任务调度。

组件功能源码位置
路由控制器处理 API 端点路由apps/api/src/index.ts
服务初始化加载和管理各类服务模块apps/api/src/services/index.ts
测试工具开发环境验证apps/api/src/harness.ts

队列服务

队列服务负责管理异步任务的调度和执行,确保长时间运行的任务不会阻塞主请求线程。

// apps/api/src/services/queue-service.ts 核心职责
// - 任务入队和出队管理
// - 任务状态追踪
// - 优先级调度
// - 失败重试机制

队列服务支持异步爬取、批量抓取等长时间运行的操作,客户端可以通过轮询任务 ID 来获取执行结果。

原生性能库

为了优化核心性能,Firecrawl 集成了原生语言库:

库名称语言用途
go-html-to-mdGoHTML 到 Markdown 的高性能转换
Rust SDKRust底层高性能操作
# go-html-to-md 构建命令
cd apps/api/sharedLibs/go-html-to-md
go build -o <OUTPUT> -buildmode=c-shared html-to-markdown.go

输出文件根据操作系统不同:

SDK 多语言架构

Firecrawl 提供统一的 SDK 体验,覆盖主流编程语言:

graph LR
    A[统一 API 接口] --> B[Python SDK]
    A --> C[Node.js SDK]
    A --> D[Ruby SDK]
    A --> E[Java SDK]
    A --> F[.NET SDK]
    A --> G[Rust SDK]
    A --> H[PHP SDK]
SDK包名/依赖文档位置
Pythonfirecrawl-pyapps/python-sdk/README.md
Node.js@mendable/firecrawl-jsapps/js-sdk/README.md
Rubyfirecrawl-sdkapps/ruby-sdk/README.md
Javacom.firecrawl:firecrawl-javaapps/java-sdk/README.md
.NETfirecrawl-sdkapps/dotnet-sdk/README.md
Rustfirecrawlapps/rust-sdk/README.md
PHPfirecrawl-sdkapps/php-sdk/README.md

功能模块架构

核心功能

graph TD
    subgraph Firecrawl 核心功能
        S[Search 搜索] --> Scr[Scrape 抓取]
        Scr --> Cr[Crawl 爬取]
        Cr --> M[Map 站点地图]
        M --> Ex[Extract 提取]
        Ex --> I[Interact 交互]
        I --> Ag[Agent 智能代理]
    end

抓取引擎

系统支持多种专业化的抓取引擎,针对不同数据源进行优化:

引擎用途源码示例
Wikipedia 引擎维基百科结构化数据apps/api/src/scraper/scrapeURL/engines/wikipedia/index.ts
通用引擎标准网页抓取默认引擎

数据提取服务

Firecrawl 提供基于 AI 的数据提取能力:

// apps/api/src/lib/extract/fire-0/extraction-service-f0.ts
// - Schema 验证
// - 单实体/多实体提取
// - 结果混合与去重

监控与通知系统

系统包含完整的监控通知机制:

// apps/api/src/services/notification/monitoring_email.ts
// - 变更检测摘要邮件
// - 新增页面通知
// - 移除页面告警
// - 错误统计

监控邮件功能支持定期发送网站变更报告,包括新增、移除、变更的页面数量统计。

认证与配置

API 密钥管理

Firecrawl 支持多种 API 密钥配置方式:

配置方式优先级示例
构造函数参数最高Client("fc-your-api-key")
环境变量次高FIRECRAWL_API_KEY
配置文件最低各 SDK 特定配置

客户端初始化示例

# Python SDK
from firecrawl import Firecrawl
app = Firecrawl(api_key="fc-YOUR_API_KEY")
// Java SDK
FirecrawlClient client = FirecrawlClient.builder()
    .apiKey("fc-your-api-key")
    .build();
// Rust SDK
use firecrawl::{Client, ScrapeOptions, Format, CrawlOptions};
let client = Client::new("fc-YOUR_API_KEY")?;

数据流架构

sequenceDiagram
    participant C as 客户端 SDK
    participant A as API 服务器
    participant Q as 队列服务
    participant E as 抓取引擎
    participant N as 原生库
    
    C->>A: 发起抓取请求
    A->>Q: 入队异步任务
    A-->>C: 返回任务 ID
    Q->>E: 调度抓取任务
    E->>N: HTML 内容处理
    N-->>E: Markdown 输出
    E-->>Q: 任务完成
    C->>A: 轮询任务状态
    A-->>C: 返回抓取结果

安全与数据处理

HTML 转义处理

系统对外部数据实施严格的 HTML 转义,防止 XSS 等安全问题:

// apps/api/src/scraper/scrapeURL/engines/wikipedia/index.ts
function escapeHtml(str: string): string {
  return str
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;");
}

内容过滤

系统内置内容安全过滤机制,包括:

  • 仅提取主体内容选项
  • 可配置的等待时间
  • 格式选择(Markdown、HTML、JSON 等)

扩展与集成

第三方集成

平台集成方式说明
MendableFirecrawl SkillAI 技能集成
Lovalbe内置支持无代码平台集成
ZapierApp Integration自动化工作流
n8nWorkflow Nodes自托管自动化
Gemini示例项目AI 模型集成
DeepSeek示例项目大语言模型爬虫

品牌标识处理

系统包含品牌识别模块,能够从抓取页面中提取品牌名称和 Logo 信息。

技术栈总结

层级技术选型
API 服务器Node.js / TypeScript / Express
原生性能库Go (HTML→Markdown), Rust
队列系统基于 TypeScript 的异步队列
SDK 生态Python, Node.js, Ruby, Java, .NET, Rust, PHP
部署方式云原生,支持自托管

该架构设计遵循松耦合原则,各组件通过明确定义的接口进行通信,便于独立扩展和维护。

来源:https://github.com/firecrawl/firecrawl / 项目说明书

API路由与版本控制

由于指定的路由源文件 (apps/api/src/routes/v0.ts, apps/api/src/routes/v1.ts, apps/api/src/routes/v2.ts, apps/api/src/routes/admin.ts, apps/api/openapi.json) 未出现在当前检索结果中,我无法提供详细的源码级分析。

章节 相关页面

继续阅读本节完整说明和来源证据。

现有文档中的 API 版本信息

根据主 README.md,以下是 v2 API 端点:

API 功能端点方法资料来源
搜索/v2/searchPOSTREADME.md
抓取/v2/scrapePOSTREADME.md
映射网站/v2/mapPOSTREADME.md
批量抓取/v2/batchPOSTREADME.md

SDK 支持情况

SDK 语言仓库路径支持版本
Pythonapps/python-sdkv1, v2
Node.jsapps/js-sdkv1, v2
Rustapps/rust-sdkv1, v2
Goapps/go-sdkv1, v2
Rubyapps/ruby-sdkv1, v2
Javaapps/java-sdkv1, v2
.NETapps/dot-net-sdkv1, v2
PHPapps/php-sdkv1, v2

建议

要生成完整的 API 路由与版本控制 Wiki 页面,需要检索以下文件:

请提供这些文件的实际内容以继续生成 Wiki 页面。

来源:https://github.com/firecrawl/firecrawl / 项目说明书

抓取引擎

抓取引擎(Scrape Engine)是 Firecrawl 系统中负责实际执行网页内容抓取的核心组件模块。它位于 apps/api/src/scraper/scrapeURL/engines/ 目录下,采用多引擎架构设计,根据不同的内容类型和抓取需求,智能选择最适合的底层抓取实现。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 整体架构图

继续阅读本节完整说明和来源证据。

章节 引擎类型与职责

继续阅读本节完整说明和来源证据。

章节 Fetch 引擎

继续阅读本节完整说明和来源证据。

概述

抓取引擎(Scrape Engine)是 Firecrawl 系统中负责实际执行网页内容抓取的核心组件模块。它位于 apps/api/src/scraper/scrapeURL/engines/ 目录下,采用多引擎架构设计,根据不同的内容类型和抓取需求,智能选择最适合的底层抓取实现。

Firecrawl 的抓取引擎设计遵循策略模式(Strategy Pattern),每个引擎实现相同的接口契约,但采用不同的技术栈来处理特定类型的内容。这种设计使得系统能够灵活应对静态网页、动态渲染页面、PDF 文档、Office 文档等多种内容源的抓取需求。

抓取引擎与上层的 scrapeURL/index.ts 主模块协同工作,主模块负责接收抓取请求、解析配置参数、路由到合适的引擎,并最终汇总各引擎的输出结果。资料来源:apps/api/src/scraper/scrapeURL/index.ts

架构设计

整体架构图

graph TD
    A[scrapeURL 主模块] --> B[引擎选择器]
    B --> C[Fetch 引擎]
    B --> D[Fire-Engine 引擎]
    B --> E[Playwright 引擎]
    B --> F[PDF 引擎]
    B --> G[Document 引擎]
    
    C --> H[HTTP 请求处理]
    D --> I[浏览器自动化]
    E --> J[Chromium 实例]
    F --> K[PDF 解析库]
    G --> L[文档解析器]
    
    H --> M[HTML 响应]
    I --> N[渲染后 DOM]
    J --> N
    K --> O[PDF 文本/元数据]
    L --> P[文档内容]

引擎类型与职责

引擎名称技术实现适用场景内容类型
FetchNode.js 原生 HTTP 请求静态页面、API 响应HTML、JSON
Fire-Engine浏览器自动化框架动态渲染页面JavaScript 渲染后的 DOM
PlaywrightChromium 实例控制复杂交互页面完整网页快照
PDFPDF 解析库PDF 文档PDF 文本、元数据
Document文档解析器Office 文档DOCX、XLSX、PPTX

核心引擎详解

Fetch 引擎

Fetch 引擎是抓取引擎家族中最轻量的实现,位于 apps/api/src/scraper/scrapeURL/engines/fetch/index.ts。它直接使用 Node.js 原生的 HTTP/HTTPS 模块发起请求,适用于静态网页和 API 接口的数据抓取。

Fetch 引擎的主要特点包括:

  • 零外部依赖:不依赖 Puppeteer、Playwright 等重型库
  • 高性能:异步 I/O 操作,支持高并发请求
  • 可配置性:支持自定义请求头、超时设置、代理配置
  • Cookie 处理:内置 Cookie 管理和会话保持

该引擎特别适合抓取不依赖 JavaScript 渲染的静态内容,如博客文章、新闻页面、产品列表页等。对于需要登录认证的网站,Fetch 引擎支持通过 Cookie 或 Bearer Token 进行身份验证。

Fire-Engine 引擎

Fire-Engine 引擎是 Firecrawl 自研的浏览器自动化引擎,位于 apps/api/src/scraper/scrapeURL/engines/fire-engine/index.ts。它提供了介于轻量级 Fetch 和完整浏览器自动化之间的抓取能力。

Fire-Engine 的核心优势在于:

  • 轻量级浏览器:相比完整的 Chromium 实例,占用资源更少
  • JavaScript 渲染:支持执行页面内的 JavaScript 代码
  • DOM 操作:提供点击、滚动、输入等交互能力
  • 截图功能:支持页面截图和元素截图

该引擎适用于需要部分 JavaScript 渲染但不需要完整浏览器环境的场景,例如单页应用(SPA)的初始内容抓取、无限滚动列表的加载等。

Playwright 引擎

Playwright 引擎是 Firecrawl 中最强大的抓取引擎,位于 apps/api/src/scraper/scrapeURL/engines/playwright/index.ts。它基于 Microsoft 的 Playwright 框架,提供完整的浏览器自动化能力。

Playwright 引擎的核心特性:

  • 多浏览器支持:Chromium、Firefox、WebKit
  • 完整渲染:执行所有 JavaScript,包括框架级别的代码
  • 网络拦截:支持请求/响应拦截,可修改网络流量
  • 元素定位:支持 CSS 选择器、XPath、文本定位
  • 等待策略:智能等待元素出现、网络空闲等条件

对于需要模拟用户行为(如登录、表单填写、点击按钮)的复杂抓取场景,Playwright 引擎是最佳选择。它还支持无头模式(headless)和有头模式(headed),可根据调试或生产环境灵活切换。

PDF 引擎

PDF 引擎专门用于处理 PDF 文档的抓取和解析,位于 apps/api/src/scraper/scrapeURL/engines/pdf/index.ts

PDF 引擎支持的功能:

  • 直接下载:从 URL 下载 PDF 文件
  • 文本提取:从 PDF 中提取可搜索的文本内容
  • 元数据读取:获取 PDF 的标题、作者、创建日期等元数据
  • 页面拆分:支持按页面维度提取内容
  • 加密处理:处理有密码保护的 PDF 文件

该引擎在处理学术论文、报告、合同等 PDF 格式内容时表现出色。结合 Firecrawl 的 Map 功能,可以自动发现网站上的 PDF 资源并进行批量抓取。

Document 引擎

Document 引擎用于处理 Office 格式的文档,位于 apps/api/src/scraper/scrapeURL/engines/document/index.ts。它与后端原生模块 apps/api/native/src/document/providers/factory.rs 协同工作。

Document 引擎支持的文档格式:

格式MIME 类型提取内容
DOCXapplication/vnd.openxmlformats-officedocument.wordprocessingml.document文本、段落、表格、列表
XLSXapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet表格数据、公式
PPTXapplication/vnd.openxmlformats-officedocument.presentationml.presentation幻灯片文本、备注

Document 引擎的核心优势在于其原生实现方式。通过 Rust 编写的底层解析器(位于 apps/api/native/src/document/providers/factory.rs),能够高效处理大文件和复杂结构的 Office 文档,同时保证内存使用的安全性。

原生文档工厂

apps/api/native/src/document/providers/factory.rs 是 Rust 原生模块中的核心组件,负责创建和管理各种文档格式的解析器实例。

graph LR
    A[Document Request] --> B[Factory]
    B --> C{DocType Detection}
    C -->|DOCX| D[DocxParser]
    C -->|XLSX| E[XlsxParser]
    C -->|PDF| F[PdfParser]
    C -->|Unknown| G[Error Handler]
    
    D --> H[Structured Output]
    E --> H
    F --> H

工厂模式的应用确保了:

  • 类型安全:编译时保证所有支持的文档类型都被处理
  • 可扩展性:新增文档格式只需实现对应的解析 trait
  • 性能优化:根据文档类型预分配内存,减少运行时开销

工作流程

抓取请求处理流程

sequenceDiagram
    participant Client as 客户端
    participant Main as scrapeURL 主模块
    participant Router as 引擎路由器
    participant Engine as 选中的抓取引擎
    participant Output as 结果处理器
    
    Client->>Main: 发送抓取请求 (URL, Options)
    Main->>Main: 验证 URL 和参数
    Main->>Router: 请求引擎选择
    Router->>Router: Content-Type 检测
    Router->>Engine: 路由到合适引擎
    Engine->>Engine: 执行抓取逻辑
    Engine-->>Output: 返回原始内容
    Output->>Output: 格式化与清洗
    Output-->>Main: 结构化结果
    Main-->>Client: 返回 Document 对象

引擎选择策略

抓取引擎根据以下因素自动选择最合适的引擎:

  1. URL 扩展名检测:优先根据 URL 末尾的文件扩展名判断内容类型
  2. Content-Type 响应头:HTTP 响应头中的 Content-Type 字段
  3. 配置优先级:用户通过 ScrapeOptions 明确指定的引擎类型
  4. 降级策略:主引擎失败时自动降级到备选引擎

配置选项

抓取引擎通过 ScrapeOptions 对象接收配置参数:

参数名类型默认值说明
formatsstring[]["markdown"]输出格式列表
onlyMainContentbooleanfalse仅提取主体内容
waitFornumber0等待渲染的毫秒数
timeoutnumber30000请求超时(毫秒)
enginestring"auto"强制指定引擎类型
actionsAction[][]浏览器自动化动作序列

SDK 集成

各语言 SDK 通过统一的接口调用抓取引擎,以 Python SDK 为例:

from firecrawl import Firecrawl
from firecrawl.v2.types import ScrapeOptions

firecrawl = Firecrawl(api_key="fc-YOUR_API_KEY")

# 基础抓取(自动选择引擎)
doc = firecrawl.scrape('https://example.com', formats=['markdown'])

# 指定引擎抓取
doc = firecrawl.scrape(
    'https://example.com',
    formats=['markdown', 'html'],
    options=ScrapeOptions(
        engine='playwright',
        wait_for=3000
    )
)

错误处理机制

抓取引擎实现了多层次的错误处理策略:

错误类型处理策略降级引擎
网络超时重试 3 次,指数退避Playwright
渲染失败降级到 Fetch 引擎Fetch
解析错误返回原始内容,标记警告-
资源不存在返回 404 错误-
认证失败返回 401 错误-

性能优化

并发控制

抓取引擎内置了并发控制机制:

  • 全局并发限制:防止对目标服务器造成过大压力
  • 域名级限速:基于域名的请求速率控制
  • 连接池复用:减少 TCP 连接建立开销

缓存策略

  • 304 响应处理:正确处理 HTTP 条件请求
  • ETag/Last-Modified:支持服务端缓存验证
  • 本地缓存:对重复请求返回缓存结果

安全考量

抓取引擎在设计时充分考虑了安全因素:

  • 请求来源伪装:模拟真实浏览器请求头
  • 反爬虫规避:内置常用反爬虫策略应对
  • 敏感信息过滤:自动过滤密码、API Key 等敏感数据
  • 沙箱执行:浏览器引擎在隔离环境中运行

扩展开发指南

如需添加新的抓取引擎,可按以下步骤扩展:

  1. engines/ 目录下创建新的引擎文件夹
  2. 实现统一的引擎接口 BaseEngine
  3. 在引擎路由器中注册新引擎
  4. 添加对应的配置选项处理逻辑
  5. 编写单元测试和集成测试

相关资源

来源:https://github.com/firecrawl/firecrawl / 项目说明书

搜索与爬取功能

Firecrawl 的搜索与爬取功能是平台的核心能力,为 AI 系统提供网页搜索、抓取和交互能力。搜索功能允许用户在整个网络中查找信息,而爬取功能则支持对特定网站的深度遍历和数据提取。 资料来源:README.md

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 核心模块关系

继续阅读本节完整说明和来源证据。

章节 搜索子系统架构

继续阅读本节完整说明和来源证据。

章节 功能特性

继续阅读本节完整说明和来源证据。

概述

Firecrawl 的搜索与爬取功能是平台的核心能力,为 AI 系统提供网页搜索、抓取和交互能力。搜索功能允许用户在整个网络中查找信息,而爬取功能则支持对特定网站的深度遍历和数据提取。 资料来源:README.md

架构设计

核心模块关系

graph TD
    A[API 入口] --> B[搜索模块 search/]
    A --> C[爬取模块 scraper/]
    B --> D[Fire Engine]
    B --> E[SearXNG 集成]
    C --> F[WebScraper]
    C --> G[Crawler]
    F --> H[Sitemap 解析]
    G --> H
    D --> I[搜索结果]
    H --> J[爬取结果]

搜索子系统架构

搜索功能通过多层抽象实现:

组件文件路径职责
搜索入口apps/api/src/search/index.ts处理 API 请求分发和参数验证
执行引擎apps/api/src/search/execute.ts协调搜索执行流程
Fire Engineapps/api/src/search/fireEngine.ts自定义搜索引擎实现
SearXNG 集成apps/api/src/search/searxng.ts开源搜索引擎后端适配

搜索功能详解

功能特性

搜索功能支持以下核心能力:

  • 网络搜索:在互联网上查找相关信息
  • 结果排序:按相关性对结果进行排序
  • 数量限制:支持限制返回结果数量
  • 来源控制:可指定搜索结果来源 资料来源:README.md:45-50

API 端点

POST https://api.firecrawl.dev/v2/search

请求头

参数说明必填
AuthorizationBearer token 认证
Content-Typeapplication/json

请求体

字段类型说明
querystring搜索查询关键词
limitnumber返回结果数量限制

响应格式

{
  "data": [
    {
      "url": "https://firecrawl.dev",
      "title": "Firecrawl",
      "markdown": "Turn websites into..."
    }
  ]
}

爬取功能详解

爬取类型

Firecrawl 支持两种主要的网站爬取方式:

爬取类型说明适用场景
sitemap 爬取通过解析网站的 sitemap.xml 发现页面静态网站、结构化站点
智能爬取通过模拟浏览器行为遍历页面JavaScript 渲染页面、动态内容

Sitemap 解析模块

Sitemap 解析是爬取功能的基础组件:

文件职责
apps/api/src/scraper/WebScraper/sitemap.tsWebScraper 场景下的 sitemap 解析
apps/api/src/scraper/crawler/sitemap.ts独立爬虫场景下的 sitemap 解析

核心爬取流程

graph TD
    A[开始爬取] --> B{选择爬取模式}
    B -->|Sitemap| C[解析 sitemap.xml]
    B -->|智能爬取| D[启动浏览器实例]
    C --> E[提取 URL 列表]
    D --> F[遍历页面链接]
    E --> G[过滤有效链接]
    F --> G
    G --> H[抓取页面内容]
    H --> I[提取结构化数据]
    I --> J[返回结果]

爬取配置参数

from firecrawl import Firecrawl

app = Firecrawl(api_key="fc-YOUR_API_KEY")

crawl_status = firecrawl.crawl(
    'https://firecrawl.dev', 
    limit=100, 
    scrape_options=ScrapeOptions(formats=['markdown', 'html']),
    poll_interval=30
)
参数类型说明
limitnumber最大抓取页面数量
scrape_optionsScrapeOptions抓取选项配置
poll_intervalnumber异步轮询间隔(秒)
exclude_pathsstring[]需要排除的路径

SDK 实现

Python SDK

from firecrawl import Firecrawl

app = Firecrawl(api_key="fc-YOUR_API_KEY")

# 搜索
results = app.search("best AI data tools 2024", limit=10)

# 爬取网站
docs = app.crawl("https://docs.firecrawl.dev", limit=50)
for doc in docs.data:
    print(doc.metadata.source_url, doc.markdown[:100])

Node.js SDK

import Firecrawl from '@mendable/firecrawl-js';

const app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });

// 搜索
const results = await app.search('best AI data tools 2024', { limit: 10 });

// 爬取
const docs = await app.crawl('https://docs.firecrawl.dev', { 
    limit: 50,
    scrapeOptions: { formats: ['markdown', 'html'] }
});

Java SDK

FirecrawlClient client = FirecrawlClient.builder()
    .apiKey("fc-your-api-key")
    .build();

// 爬取
CrawlResponse response = client.crawl("https://example.com", 
    CrawlOptions.builder()
        .limit(50)
        .build());

for (Page page : response.getData()) {
    System.out.println(page.getMetadata().get("sourceURL"));
}

数据模型

搜索结果模型

字段类型说明
urlstring页面 URL
titlestring页面标题
descriptionstring页面描述
markdownstring页面内容(Markdown 格式)

爬取结果模型

字段类型说明
dataPage[]抓取的页面列表
statusstring爬取状态
credits_usednumber消耗的 credits

Page 模型

字段类型说明
metadataRecord页面元数据
markdownstringMarkdown 格式内容
htmlstring原始 HTML
screenshotstring页面截图(Base64)

配置选项

ScrapeOptions 配置

选项类型说明
formatsstring[]输出格式:markdown、html、json
only_main_contentboolean仅提取主体内容
wait_fornumber等待渲染时间(毫秒)
locationLocationConfig地理位置配置

CrawlOptions 配置

选项类型默认值说明
limitnumber100最大页面数
exclude_pathsstring[][]排除路径
include_pathsstring[][]包含路径
max_depthnumber10最大递归深度

异步操作处理

异步爬取流程

sequenceDiagram
    participant Client
    participant API
    participant Crawler
    participant Storage
    
    Client->>API: 发起爬取请求
    API->>Crawler: 启动爬取任务
    API-->>Client: 返回 Job ID
    loop 轮询状态
        Client->>API: 查询爬取状态
        API->>Crawler: 获取进度
        Crawler-->>API: 返回状态
        API-->>Client: 返回状态
    end
    Crawler->>Storage: 保存结果
    Client->>API: 获取完整结果
    API->>Storage: 读取结果
    Storage-->>API: 返回数据
    API-->>Client: 返回完整数据

异步爬取示例

// Rust SDK 异步爬取
let crawl_id = app.crawl_url_async("https://mendable.ai", None).await?.id;

// 检查爬取状态
let status = app.check_crawl_status(crawl_id).await?;

if status.status == CrawlStatusTypes::Completed {
    println!("爬取完成: {:#?}", status.data);
}

错误处理

错误类型说明处理建议
TIMEOUT请求超时增加超时时间或减少页面数量
RATE_LIMIT请求频率超限使用轮询间隔或降低请求频率
INVALID_URLURL 格式错误检查 URL 格式是否正确
ACCESS_DENIED访问被拒绝网站可能禁止爬取

最佳实践

搜索优化

  1. 精确查询:使用具体关键词提高搜索准确性
  2. 限制数量:设置合理的 limit 值避免资源浪费
  3. 结果缓存:考虑对频繁查询的结果进行缓存

爬取优化

  1. 路径过滤:使用 exclude_paths 排除无关页面
  2. 深度控制:合理设置 max_depth 避免过度爬取
  3. 格式选择:根据需求选择合适的输出格式
  4. 轮询间隔:使用合适的 poll_interval 减少 API 调用

相关资源

来源:https://github.com/firecrawl/firecrawl / 项目说明书

数据提取系统

数据提取系统(Extract System)是Firecrawl平台的核心组件之一,负责从网页内容中提取结构化数据。该系统支持JSON Schema定义的数据提取,通过大语言模型(LLM)将非结构化的网页内容转换为符合预定义模式的高质量结构化数据。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 核心能力

继续阅读本节完整说明和来源证据。

章节 核心组件

继续阅读本节完整说明和来源证据。

章节 整体处理流程

继续阅读本节完整说明和来源证据。

系统概述

数据提取系统(Extract System)是Firecrawl平台的核心组件之一,负责从网页内容中提取结构化数据。该系统支持JSON Schema定义的数据提取,通过大语言模型(LLM)将非结构化的网页内容转换为符合预定义模式的高质量结构化数据。

核心能力

能力描述
单URL提取从单个网页提取结构化数据
批量提取一次处理多个URL,提高效率
Schema验证使用JSON Schema验证输出数据
智能提示词自动分析和优化提取提示词
重排序对提取结果进行相关性排序

资料来源:apps/api/src/lib/extract/extraction-service.ts

系统架构

graph TD
    A[API请求] --> B[提取队列 extract-queue]
    B --> C[提取Worker extract-worker]
    C --> D[提取服务 ExtractionService]
    D --> E[构建文档 build-document]
    D --> F[构建提示 build-prompts]
    E --> G[完成处理 completions]
    F --> G
    G --> H[singleAnswer]
    G --> I[batchExtract]
    G --> J[analyzeSchemaAndPrompt]
    H --> K[重排序 reranker]
    I --> K
    J --> F
    K --> L[返回结构化数据]

核心组件

组件文件路径职责
提取服务extraction-service.ts核心提取逻辑编排
文档构建build-document.ts构建提取结果文档
提示词构建build-prompts.ts生成LLM提示词
单答案处理singleAnswer.ts处理单个URL提取
批量提取batchExtract.ts处理多URL批量提取
Schema分析analyzeSchemaAndPrompt.ts分析schema并优化提示词
重排序器reranker.ts结果相关性排序

资料来源:apps/api/src/lib/extract/extraction-service.ts

工作流程

整体处理流程

graph LR
    A1[接收请求] --> B1[入队到extract-queue]
    B1 --> C1[Worker获取任务]
    C1 --> D1[调用ExtractionService]
    D1 --> E1[构建提示词]
    E1 --> F1[LLM调用]
    F1 --> G1[Schema验证]
    G1 --> H1[结果重排序]
    H1 --> I1[返回结果]

批量提取流程

当处理多个URL时,系统采用以下流程:

  1. URL分批处理:将URL列表分成小批次
  2. 并发LLM调用:对每个批次并行调用LLM
  3. 结果聚合:合并所有批次的提取结果
  4. 重排序:根据相关性对最终结果排序

资料来源:apps/api/src/lib/extract/completions/batchExtract.ts

核心模块详解

提取服务 (ExtractionService)

提取服务是整个数据提取系统的中枢,协调各组件完成数据提取任务。

主要职责:

  • 管理提取任务的生命周期
  • 协调文档构建和提示词构建
  • 处理LLM调用和结果验证
  • 支持单条和批量提取模式

资料来源:apps/api/src/lib/extract/extraction-service.ts

文档构建 (build-document)

文档构建模块负责将提取的原始数据转换为标准化的文档格式。

功能特点:

  • 规范化提取结果结构
  • 添加元数据信息
  • 处理多种输出格式

资料来源:apps/api/src/lib/extract/build-document.ts

提示词构建 (build-prompts)

提示词构建模块生成用于LLM的结构化提示词,包含必要的上下文和提取指令。

构建要素:

  • 系统指令(System Prompt)
  • 用户提示(User Prompt)
  • Schema定义嵌入
  • 示例数据(可选)

自适应优化:该模块与analyzeSchemaAndPrompt协同工作,可根据Schema自动调整提示词以提高提取准确性。

资料来源:apps/api/src/lib/extract/build-prompts.ts

完成处理模块 (completions)

#### 单答案处理 (singleAnswer)

处理单个URL的提取请求,返回完整的结构化数据。

处理流程:

graph TD
    A[输入URL和Schema] --> B[构建提示词]
    B --> C[调用LLM]
    C --> D[解析响应]
    D --> E[Schema验证]
    E --> F[返回结果]

资料来源:apps/api/src/lib/extract/completions/singleAnswer.ts

#### 批量提取 (batchExtract)

支持同时处理多个URL的提取任务,适用于大规模数据采集场景。

批处理策略:

  • 动态批次大小调整
  • 并发请求控制
  • 错误重试机制
  • 部分失败容忍

资料来源:apps/api/src/lib/extract/completions/batchExtract.ts

#### Schema分析 (analyzeSchemaAndPrompt)

分析输入的JSON Schema,评估其复杂度并提供优化建议。

分析维度:

维度描述
字段数量Schema包含的属性数量
嵌套深度对象嵌套的层级
数组复杂度数组类型字段的复杂性
必需字段必填属性的比例

资料来源:apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts

重排序器 (reranker)

对提取结果进行相关性评分和排序,确保最相关的结果排在前面。

排序依据:

  • 内容相关性评分
  • 字段完整性
  • 数据质量指标

资料来源:apps/api/src/lib/extract/reranker.ts

队列与Worker机制

提取队列 (extract-queue)

提取队列负责管理待处理的提取任务,支持任务的入队、优先级调度和状态追踪。

队列特性:

  • 异步任务处理
  • 可配置并发数
  • 任务状态监控
  • 失败重试机制

资料来源:apps/api/src/services/extract-queue.ts

提取Worker (extract-worker)

Worker进程从队列中获取任务并执行实际的提取操作。

工作流程:

graph TD
    A[启动Worker] --> B[连接队列]
    B --> C[等待任务]
    C --> D{有新任务?}
    D -->|是| E[获取任务]
    E --> F[执行提取]
    F --> G[更新状态]
    G --> H[任务完成]
    H --> C
    D -->|否| C

错误处理:

  • 自动重试机制
  • 死信队列处理
  • 详细的错误日志

资料来源:apps/api/src/services/extract-worker.ts

API使用

基本提取示例

from firecrawl import Firecrawl

app = Firecrawl(api_key="fc-YOUR_API_KEY")

result = app.extract(
    urls=["https://example.com/product/1"],
    prompt="提取产品名称、价格和描述",
    schema={
        "type": "object",
        "properties": {
            "name": {"type": "string"},
            "price": {"type": "number"},
            "description": {"type": "string"}
        }
    }
)

批量提取示例

result = app.extract(
    urls=[
        "https://example.com/products/1",
        "https://example.com/products/2",
        "https://example.com/products/3"
    ],
    prompt="提取所有产品的基本信息",
    schema={...}
)

配置参数

提取选项

参数类型默认值描述
timeoutnumber60000单次请求超时时间(毫秒)
maxRetriesnumber3最大重试次数
batchSizenumber10批量处理大小
temperaturenumber0.0LLM温度参数

Schema配置

属性必需描述
typeJSON类型定义
properties属性映射
required必填字段列表
additionalProperties允许额外字段

最佳实践

1. Schema设计

  • 使用清晰的字段命名
  • 合理设置必填字段
  • 避免过深的嵌套结构
  • 提供明确的类型定义

2. 性能优化

  • 批量提取时控制并发数
  • 合理设置超时时间
  • 使用适当的批次大小
  • 启用结果缓存(如适用)

3. 错误处理

  • 实现重试机制处理临时故障
  • 验证Schema格式确保有效性
  • 检查LLM响应格式的正确性
  • 记录详细的错误信息便于调试

相关文档

资料来源:[apps/api/src/lib/extract/extraction-service.ts]()

监控与Webhook

Firecrawl 的监控(Monitoring)与Webhook系统为用户提供了持续追踪网站变化和接收实时事件通知的能力。监控服务通过定期检查网页内容,自动检测新增、移除、修改的页面以及抓取错误,并通过邮件或Webhook渠道向用户推送变更摘要。该系统由多个子模块组成,包括调度器(Scheduler)、执行器(Runner)、存储层(Store)、差异检测(Diff)、W...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 整体流程

继续阅读本节完整说明和来源证据。

章节 调度器(Scheduler)

继续阅读本节完整说明和来源证据。

章节 执行器(Runner)

继续阅读本节完整说明和来源证据。

概述

Firecrawl 的监控(Monitoring)与Webhook系统为用户提供了持续追踪网站变化和接收实时事件通知的能力。监控服务通过定期检查网页内容,自动检测新增、移除、修改的页面以及抓取错误,并通过邮件或Webhook渠道向用户推送变更摘要。该系统由多个子模块组成,包括调度器(Scheduler)、执行器(Runner)、存储层(Store)、差异检测(Diff)、Webhook投递(Delivery)和Webhook队列(Queue),它们协同工作以实现可靠的变化检测与通知投递。资料来源:apps/api/src/services/notification/monitoring_email.ts

监控模块架构

整体流程

graph TD
    A[调度器 Scheduler] --> B[执行器 Runner]
    B --> C[存储层 Store]
    C --> D[差异检测 Diff]
    D --> E[变更汇总]
    E --> F[通知发送]
    F --> G[邮件通知]
    F --> H[Webhook投递]
    
    B --> I[抓取目标网页]
    I --> J[当前快照]
    C --> K[历史快照]
    D --> J
    D --> K

调度器(Scheduler)

调度器负责管理监控任务的定时触发。系统会根据用户配置的检查间隔自动执行监控检查,确保在设定的时间周期内持续追踪目标网站的变化。调度器需要处理并发调度、避免重复执行、以及处理任务超时等场景。资料来源:apps/api/src/services/monitoring/scheduler.ts

执行器(Runner)

执行器是监控任务的核心执行单元,负责实际执行网页抓取和内容采集。当调度器触发检查任务时,执行器会启动浏览器实例或发送抓取请求,获取目标页面的当前内容。执行器还需要处理抓取过程中的异常情况,如网络超时、页面加载失败、反爬虫机制等,并将错误信息记录到监控结果中。资料来源:apps/api/src/services/monitoring/runner.ts

存储层(Store)

存储层负责持久化管理监控相关的所有数据,包括监控配置、快照历史、检查记录和变更汇总。Store模块提供了数据的读写接口,确保即使在服务重启后也能恢复监控状态。存储的数据模型通常包含以下核心实体:

实体名称描述主要字段
Monitor监控配置ID、URL、轮询间隔、通知设置、API密钥
MonitorCheck单次检查记录ID、监控ID、执行时间、状态、变更统计
PageSnapshot页面快照ID、检查ID、页面URL、内容哈希、原始内容
MonitoringEmailPage变更页面详情URL、标题、变更类型

资料来源:apps/api/src/services/monitoring/store.ts

差异检测(Diff)

差异检测模块负责对比当前快照与历史快照,识别页面内容的实际变化。该模块采用内容哈希比对和结构化解析相结合的方式,能够区分真正的内容变更与动态元素(如时间戳、广告)的随机变化。Diff模块的输出包括变更类型(新增/移除/修改)、变更位置、以及变更的详细摘要,便于用户快速理解网站发生的变化。资料来源:apps/api/src/services/monitoring/diff.ts

变更统计模型

监控系统的变更统计采用四维计数模型,全面覆盖网站变化的各个方面:

统计类型字段名描述
新增页面new_count在本次检查中新发现的页面
移除页面removed_count在本次检查中消失的页面
内容变更changed_count内容发生变化的现有页面
抓取错误error_count抓取失败的页面数量

当所有统计值均为零时,系统会跳过邮件通知发送,以减少不必要的通知骚扰。资料来源:apps/api/src/services/notification/monitoring_email.ts

Webhook系统架构

Webhook事件类型

Firecrawl的Webhook系统支持多种事件类型,覆盖异步任务的完整生命周期:

事件类型触发时机用途
started任务开始执行时通知任务已启动
action中间操作发生时报告任务进度或关键步骤
completed任务成功完成时传递成功结果数据
failed任务执行失败时返回错误信息和原因
cancelled任务被取消时通知任务终止状态

资料来源:apps/api/src/controllers/v2/types.ts

Webhook投递流程

graph LR
    A[事件触发] --> B[Webhook队列]
    B --> C{重试次数检查}
    C -->|未超过限制| D[投递请求]
    D --> E{HTTP响应}
    E -->|2xx成功| F[完成]
    E -->|失败| G[指数退避]
    G --> B
    C -->|超过限制| H[标记失败]

投递服务(Delivery)

Webhook投递服务负责将事件负载发送到用户配置的端点。投递服务需要处理HTTPS连接、TLS证书验证、请求签名(用于安全验证)等技术细节。投递服务支持自定义请求头、请求体格式配置,以及不同类型事件的差异化负载结构。资料来源:apps/api/src/services/webhook/delivery.ts

队列管理(Queue)

Webhook队列提供了可靠投递的保障机制。当投递失败时(如网络错误或目标服务器返回非2xx状态码),队列系统会执行指数退避重试策略,在预设的最大重试次数内持续尝试投递。队列还负责管理不同优先级的事件,确保高优先级事件优先处理。资料来源:apps/api/src/services/webhook/queue.ts

邮件通知系统

通知内容结构

邮件通知采用HTML模板格式,包含以下核心信息:

  • 变更汇总:新增页面数、移除页面数、错误页面数、总检查页面数
  • 变更详情列表:列出发生变化的页面URL和标题
  • 检查标识:用于追踪本次检查的检查ID
  • 资源消耗:本次检查使用的积分数量

邮件内容会对特殊字符进行HTML转义处理,防止XSS攻击。资料来源:apps/api/src/services/notification/monitoring_email.ts

发送条件

邮件通知仅在以下条件同时满足时发送:

  1. 监控配置中已启用邮件通知(notification.email.enabled === true
  2. 本次检查检测到至少一个变更(任意统计值大于0)
if (
  params.check.changed_count +
    params.check.new_count +
    params.check.removed_count +
    params.check.error_count <= 0
) {
  // 跳过无变更的邮件通知
  return { attempted: false, success: true, recipients: [] };
}

资料来源:apps/api/src/services/notification/monitoring_email.ts

A/B测试对比功能

除了基础的变更检测,Firecrawl还提供了A/B测试对比功能,允许用户对比两个不同版本或不同来源的抓取结果。该功能支持并行执行两个抓取任务,并对结果进行差异分析,适用于SEO对比、竞品分析、版本验证等场景。资料来源:apps/api/src/services/ab-test-comparison.ts

配置选项

监控配置参数

参数名类型必填描述
urlstring要监控的目标URL
pollIntervalnumber轮询间隔(秒),默认根据订阅计划确定
notification.email.enabledboolean是否启用邮件通知
notification.webhook.urlstringWebhook回调URL
notification.webhook.eventsstring[]订阅的事件类型列表
scrapeOptionsobject抓取选项(formats、onlyMainContent等)

Webhook配置参数

参数名类型描述
maxRetriesnumber最大重试次数,默认3次
backoffFactornumber指数退避因子(秒),默认0.5
timeoutnumber单次投递超时(毫秒)

错误处理机制

监控错误分类

错误类型处理方式影响范围
网络超时记录错误、重试单次检查标记为失败
页面加载失败记录错误、跳过内容对比计入error_count统计
解析异常记录错误、保留原始内容可能导致Diff不准确

Webhook投递错误

Webhook投递失败时,系统会根据HTTP响应状态码采取不同策略:

状态码范围处理策略
2xx投递成功,任务完成
4xx(除429)永久失败,不重试
429/5xx指数退避重试,直到达到最大次数

安全考虑

Webhook安全

  • 请求签名:Webhook请求包含签名头,用于验证消息来源
  • HTTPS强制:仅支持HTTPS端点,确保传输安全
  • 幂等性设计:Webhook投递设计为幂等操作,允许安全重放

数据保护

  • 敏感信息过滤:邮件通知中的敏感数据经过适当处理
  • HTML转义:所有用户提供的URL和标题在邮件中经过HTML转义

最佳实践

  1. 合理设置轮询间隔:根据网站更新频率调整,避免过度抓取
  2. 配置多个通知渠道:同时启用邮件和Webhook,确保重要变更不被遗漏
  3. 设置Webhook重试机制:利用指数退避策略提高投递可靠性
  4. 利用A/B对比功能:在重要更新前后进行结果对比验证
  5. 监控积分消耗:定期检查creditsUsed字段,合理规划监控规模

相关文档

资料来源:[apps/api/src/services/monitoring/store.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/store.ts)

多语言SDK

Firecrawl 多语言SDK是一组官方支持的客户端库,旨在为开发者提供跨编程语言的统一接口,以便轻松访问Firecrawl的网页搜索、抓取和交互功能。这些SDK自动处理HTTP请求、身份验证、响应解析以及异步操作的轮询机制,使开发者能够在Python、JavaScript、Java、Go、Rust、.NET、Ruby等多种主流编程语言中使用Firecrawl服务。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 认证方式

继续阅读本节完整说明和来源证据。

章节 自定义API端点

继续阅读本节完整说明和来源证据。

章节 Search 搜索

继续阅读本节完整说明和来源证据。

概述

Firecrawl 多语言SDK是一组官方支持的客户端库,旨在为开发者提供跨编程语言的统一接口,以便轻松访问Firecrawl的网页搜索、抓取和交互功能。这些SDK自动处理HTTP请求、身份验证、响应解析以及异步操作的轮询机制,使开发者能够在Python、JavaScript、Java、Go、Rust、.NET、Ruby等多种主流编程语言中使用Firecrawl服务。

支持的编程语言

Firecrawl目前官方支持以下编程语言的SDK:

编程语言包名称安装命令主要类/客户端
Pythonfirecrawl-pypip install firecrawl-pyFirecrawl
JavaScript/TypeScript@mendable/firecrawl-jsnpm install @mendable/firecrawl-jsFirecrawl
Javafirecrawl-javaMaven/Gradle依赖FirecrawlClient
Gofirecrawl-sdkgo getFirecrawl
RustfirecrawlCargo.tomlClient
.NETfirecrawl-sdkdotnet add package firecrawl-sdkFirecrawlClient
Rubyfirecrawl-sdkgem install firecrawl-sdkClient

核心功能

所有SDK都提供一致的核心功能集,确保开发者无论使用何种编程语言都能获得相同的能力:

graph TD
    A[Firecrawl SDK] --> B[Search 搜索]
    A --> C[Scrape 网页抓取]
    A --> D[Crawl 网站爬取]
    A --> E[Parse 文件解析]
    A --> F[Map 站点地图]
    A --> G[Interact 页面交互]
    A --> H[Extract 结构化提取]
    
    B --> I[返回搜索结果]
    C --> J[返回文档内容]
    D --> K[批量页面抓取]
    E --> L[支持HTML/PDF/DOCX]
    F --> M[URL列表生成]
    G --> N[浏览器自动化]
    H --> O[JSON Schema提取]

客户端初始化

认证方式

所有SDK支持两种API密钥配置方式:

方式一:通过构造函数直接传入

# Python
from firecrawl import Firecrawl
app = Firecrawl(api_key="fc-YOUR_API_KEY")
// JavaScript/TypeScript
import Firecrawl from '@mendable/firecrawl-js';
const app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });
// Java
FirecrawlClient client = FirecrawlClient.builder()
    .apiKey("fc-your-api-key")
    .build();
// .NET
var client = new FirecrawlClient("fc-your-api-key");

方式二:通过环境变量自动加载

各SDK会优先读取环境变量FIRECRAWL_API_KEY

# Python - 无需传入API key,自动从环境变量读取
app = Firecrawl.from_env()
// Java - 默认从FIRECRAWL_API_KEY环境变量读取
FirecrawlClient client = FirecrawlClient.fromEnv();
# Ruby
client = Firecrawl::Client.from_env
// Go
client := firecrawl.NewClient(os.Getenv("FIRECRAWL_API_KEY"), "")

自定义API端点

对于自托管的Firecrawl实例,部分SDK支持自定义API URL:

// .NET - 自定义API URL
var client = new FirecrawlClient(
    apiKey: "fc-your-api-key",
    apiUrl: "https://your-firecrawl-instance.com");
// JavaScript/TypeScript - 可在初始化时配置
const app = new Firecrawl({ 
    apiKey: "fc-your-api-key",
    apiUrl: "https://your-firecrawl-instance.com"
});

核心API

Search 搜索

在网络上搜索相关内容,返回与查询匹配的URL和摘要:

# Python
results = app.search("best AI data tools 2024", limit=10)
// JavaScript
const results = await app.search('firecrawl', { limit: 5 });
// Rust
let response = client.search("best web scraping tools 2024", None).await?;

Scrape 网页抓取

从单个URL提取内容,支持多种输出格式:

参数类型说明
urlstring目标网页URL
formatsarray输出格式:markdown, html, json, screenshot
onlyMainContentboolean仅提取主要内容
waitFornumber等待渲染的毫秒数
# Python
doc = app.scrape('https://firecrawl.dev', formats=['markdown', 'html'])
print(doc.markdown)
// Java
Document doc = client.scrape("https://example.com",
    ScrapeOptions.builder()
        .formats(List.of("markdown"))
        .build());
// .NET
var doc = await client.ScrapeAsync("https://example.com",
    new ScrapeOptions { Formats = new List<object> { "markdown" } });

Crawl 网站爬取

批量爬取网站页面,支持自动轮询等待完成:

# Python - 自动等待爬取完成
docs = app.crawl('https://docs.firecrawl.dev', limit=50)
for doc in docs.data:
    print(doc.metadata.source_url)
# Ruby - 自动轮询模式
job = client.crawl("https://example.com",
  Firecrawl::Models::CrawlOptions.new(limit: 50))
job.data.each { |doc| puts doc.markdown }
// Rust
let options = CrawlOptions {
    limit: Some(50),
    ..Default::default()
};
let result = client.crawl("https://docs.firecrawl.dev", options).await?;

Map 站点地图

生成网站的URL列表,用于了解站点结构:

// JavaScript
const mapResult = await app.map('https://example.com');
console.log(mapResult);

Interact 页面交互

在抓取页面后执行浏览器自动化操作:

# Python
result = app.scrape("https://amazon.com")
scrape_id = result.metadata.scrape_id
app.interact(scrape_id, prompt="Search for 'mechanical keyboard'")
// Java
Document doc = client.scrape("https://example.com");
String scrapeId = String.valueOf(doc.getMetadata().get("scrapeId"));
BrowserExecuteResponse exec = client.interact(scrapeId, "console.log(await page.title());");

Extract 结构化提取

根据prompt和schema从页面提取结构化数据:

// JavaScript - 支持Zod schema
const schema = z.object({
  title: z.string(),
});
const result = await app.extract({
  urls: ['https://firecrawl.dev'],
  prompt: 'Extract the page title',
  schema,
});

Batch Scrape 批量抓取

一次性抓取多个URL:

# Python
job = app.batch_scrape([
    "https://firecrawl.dev",
    "https://docs.firecrawl.dev",
], formats=["markdown"])
for doc in job.data:
    print(doc.metadata.source_url)

Parse 文件解析

解析上传的本地文件(HTML、PDF、DOCX等):

# Python
doc = firecrawl.parse(
  b"<!DOCTYPE html><html><body><h1>Content</h1></body></html>",
  filename="upload.html",
  content_type="text/html",
  options=ParseOptions(formats=["markdown"]),
)
// Java
ParseFile file = ParseFile.builder()
    .filename("upload.html")
    .content("<!DOCTYPE html>...".getBytes())
    .contentType("text/html")
    .build();
Document parsed = client.parse(file,
    ParseOptions.builder()
        .formats(List.of("markdown"))
        .build());

异步操作

异步爬取工作流

sequenceDiagram
    participant 客户端
    participant Firecrawl API
    participant 用户
    
    客户端->>Firecrawl API: start_crawl/startCrawl
    Firecrawl API-->>客户端: 返回job_id
    客户端->>Firecrawl API: get_crawl_status(job_id)
    Firecrawl API-->>客户端: status: in_progress
    客户端->>Firecrawl API: get_crawl_status(job_id)
    Firecrawl API-->>客户端: status: completed, data: [...]

异步爬取示例

// JavaScript/TypeScript - 开始异步爬取
const start = await app.startCrawl('https://mendable.ai', {
  excludePaths: ['blog/*'],
  limit: 5,
});

// 检查爬取状态
const status = await app.getCrawlStatus(start.id);
console.log(status.status);
# Ruby - 异步爬取
response = client.start_crawl("https://example.com",
  Firecrawl::Models::CrawlOptions.new(limit: 10))
puts response.id

# 检查状态
status = client.get_crawl_status(response.id)
puts status.status

# 取消爬取
client.cancel_crawl(response.id)

数据模型

Document 文档对象

SDK返回的文档对象通常包含以下属性:

属性类型说明
markdownstring页面内容的Markdown格式
htmlstring原始HTML内容
metadataobject元数据(标题、描述、来源URL等)
rawobject原始响应数据
jsonobject提取的JSON数据(当使用json格式时)
# Python - 访问文档属性
doc = app.scrape('https://example.com')
print(doc.markdown)       # Markdown内容
print(doc.metadata.title) # 页面标题
print(doc.metadata.source_url) # 来源URL

ScrapeOptions 抓取选项

选项类型说明
formatsarray输出格式列表
onlyMainContentboolean仅提取主要内容,移除噪音
waitFornumber等待JavaScript渲染的毫秒数
headersobject自定义HTTP头
proxystring代理设置

错误处理

各SDK使用各自语言的原生错误处理机制:

# Python - 使用异常处理
try:
    doc = app.scrape('https://example.com')
except Exception as e:
    print(f"抓取失败: {e}")
// Rust - 使用Result类型
match scrape_result {
    Ok(data) => println!("{}", data.markdown),
    Err(e) => eprintln!("抓取失败: {}", e),
}
// Java - 异常处理
try {
    Document doc = client.scrape("https://example.com", options);
} catch (FirecrawlException e) {
    System.err.println("API错误: " + e.getMessage());
}

SDK架构对比

graph LR
    subgraph Python
        P1[Firecrawl类]
        P2[v2.Client]
    end
    
    subgraph JavaScript
        J1[Firecrawl类]
        J2[v2.Client]
    end
    
    subgraph Java
        K1[FirecrawlClient]
        K2[Builder模式]
    end
    
    subgraph Rust
        R1[Client结构体]
        R2[异步方法]
    end
    
    P1 --> P2
    J1 --> J2
    K1 --> K2
    R1 --> R2

依赖要求

SDK最低版本要求额外依赖
PythonPython 3.8+requests
JavaScriptNode.js兼容-
JavaJDK 11+-
GoGo 1.16+-
RustRust最新稳定版tokio (异步运行时)
.NET.NET Core 6.0+-
RubyRuby 3.0+-

最佳实践

1. 环境变量管理

建议在生产环境中使用环境变量存储API密钥:

# 设置环境变量
export FIRECRAWL_API_KEY="fc-your-api-key"

2. 异步操作处理

对于大量页面的爬取任务,使用异步方法并实现适当的重试机制:

# Python - 配置重试和超时
from firecrawl import Firecrawl
app = Firecrawl(api_key="fc-YOUR_API_KEY")
docs = app.crawl('https://example.com', limit=100, poll_interval=30)

3. 错误重试

# Python - 实现重试逻辑
import time
def scrape_with_retry(url, max_retries=3):
    for i in range(max_retries):
        try:
            return app.scrape(url)
        except Exception as e:
            if i == max_retries - 1:
                raise
            time.sleep(2 ** i)

相关资源

来源:https://github.com/firecrawl/firecrawl / 项目说明书

部署与基础设施

Firecrawl 的部署与基础设施体系支持多种部署模式,包括本地开发、Docker 容器化部署、Kubernetes 集群部署以及云原生架构。该项目采用微服务架构,主要包含 API 服务、Playwright 渲染服务、Redis 缓存层和数据库存储层等核心组件。通过 Helm Chart 和 Docker Compose 两种主流编排工具,开发者可以灵活选择适合自身环境...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 整体架构图

继续阅读本节完整说明和来源证据。

章节 核心组件

继续阅读本节完整说明和来源证据。

章节 多架构镜像构建

继续阅读本节完整说明和来源证据。

概述

Firecrawl 的部署与基础设施体系支持多种部署模式,包括本地开发、Docker 容器化部署、Kubernetes 集群部署以及云原生架构。该项目采用微服务架构,主要包含 API 服务、Playwright 渲染服务、Redis 缓存层和数据库存储层等核心组件。通过 Helm Chart 和 Docker Compose 两种主流编排工具,开发者可以灵活选择适合自身环境的部署方案。

Firecrawl 的基础设施设计遵循以下核心原则:可扩展性支持水平扩展以应对高并发场景;多架构支持涵盖 x86 和 ARM64 平台;环境隔离通过容器化实现开发与生产环境的统一;可观测性内置日志、监控和追踪能力。

系统架构

整体架构图

graph TD
    A[客户端请求] --> B[API 网关 / 负载均衡]
    B --> C[Firecrawl API 服务]
    C --> D[Redis 缓存层]
    C --> E[PostgreSQL 数据库]
    C --> F[Playwright 服务]
    F --> G[浏览器实例池]
    G --> H[渲染后的页面内容]
    H --> C
    C --> I[返回 LLM 可用的数据格式]

核心组件

组件名称技术栈功能描述
Firecrawl APINode.js/TypeScript核心 REST API 服务,处理爬取、搜索、交互请求
Playwright 服务TypeScript + Playwright浏览器自动化渲染,支持截图和 JavaScript 执行
RedisRedis任务队列、缓存、会话存储
PostgreSQLPostgreSQL持久化存储爬取任务、文档数据、用户信息
多语言 SDKPython/JS/Ruby/PHP/Go/Rust/.NET/Java官方客户端库,简化 API 集成

资料来源:README.md:1-50

Docker 容器化部署

多架构镜像构建

Firecrawl 支持同时构建适用于 x86_64 (amd64) 和 ARM64 (arm64) 架构的 Docker 镜像。这对于在 Apple Silicon Mac 或基于 ARM 的云服务器上运行的场景尤为重要。

# 创建并使用 docker buildx 构建器
docker buildx create --name multiarch --use --bootstrap

# 构建并推送多架构镜像
docker buildx build --platform linux/amd64,linux/arm64 --push \
  -t docker.io/winkkgmbh/firecrawl:latest \
  ../../../apps/api

资料来源:examples/kubernetes/firecrawl-helm/README.md:45-55

官方镜像仓库

Firecrawl 维护以下官方容器镜像:

镜像名称用途仓库地址
firecrawl主 API 服务ghcr.io/firecrawl/firecrawl
playwright-service浏览器渲染服务ghcr.io/firecrawl/playwright-service
nuq-postgres数据库服务ghcr.io/firecrawl/nuq-postgres

开发者可以使用这些官方镜像快速部署,或通过 docker-compose.yaml 进行本地开发环境搭建。

Kubernetes 部署

Helm Chart 架构

Firecrawl 提供完整的 Helm Chart 用于 Kubernetes 集群部署,支持通过 values.yaml 进行灵活配置。Chart 遵循 Kubernetes 最佳实践,包括健康检查探针、资源限制、环境变量配置和持久化存储。

# 基础部署命令
HELM_NO_PLUGINS=1 helm upgrade firecrawl . \
  -f values.yaml \
  -f overlays/prod/values.yaml \
  -n firecrawl \
  --install \
  --create-namespace

资料来源:examples/kubernetes/firecrawl-helm/README.md:25-35

生产环境配置

生产环境部署通常需要合并多层配置文件:

# 生产环境覆盖配置示例
replicaCount: 3
image:
  repository: ghcr.io/firecrawl/firecrawl
resources:
  requests:
    memory: "512Mi"
    cpu: "250m"
  limits:
    memory: "2Gi"
    cpu: "1000m"

使用官方镜像

对于纯 x86 架构的集群,可以直接使用官方预构建镜像:

HELM_NO_PLUGINS=1 helm upgrade firecrawl . \
  -f values.yaml \
  --set image.repository=ghcr.io/firecrawl/firecrawl \
  --set playwright.repository=ghcr.io/firecrawl/playwright-service \
  --set nuqPostgres.image.repository=ghcr.io/firecrawl/nuq-postgres \
  -n firecrawl \
  --install \
  --create-namespace

资料来源:examples/kubernetes/firecrawl-helm/README.md:36-48

环境变量配置

必需配置项

环境变量说明示例值
FIRECRAWL_API_KEYAPI 认证密钥fc-your-api-key-here
DATABASE_URLPostgreSQL 连接字符串postgresql://user:pass@host:5432/db
REDIS_URLRedis 连接字符串redis://localhost:6379

SDK 环境配置

各语言 SDK 均支持从环境变量自动读取配置:

# Python SDK
from firecrawl import Firecrawl
app = Firecrawl()  # 自动读取 FIRECRAWL_API_KEY

# JavaScript SDK
const app = new Firecrawl({ apiKey: process.env.FIRECRAWL_API_KEY });

# Ruby SDK
client = Firecrawl::Client.from_env  # 读取 FIRECRAWL_API_KEY

# PHP SDK
$client = FirecrawlClient::fromEnv();
# Shell 环境配置
export FIRECRAWL_API_KEY="fc-your-api-key-here"
# 可选:自定义 API URL(用于自托管实例)
export FIRECRAWL_API_URL="http://localhost:3002"

资料来源:apps/python-sdk/README.md:1-30, apps/js-sdk/firecrawl/README.md:1-25, apps/ruby-sdk/README.md:1-20, apps/php-sdk/README.md:1-20

服务发现与网络

服务间通信

graph LR
    A[SDK 客户端] -->|HTTPS| B[API 服务 :3000]
    B -->|内部通信| C[Playwright 服务 :3001]
    B -->|TCP| D[Redis :6379]
    B -->|TCP| E[PostgreSQL :5432]

API 服务默认监听 3000 端口,Playwright 渲染服务默认监听 3001 端口。服务间通过内部网络通信,无需对外暴露。

自托管实例配置

对于自托管部署,可以通过环境变量指定自定义 API 地址:

// .NET SDK
var client = new FirecrawlClient(
    apiKey: "fc-your-api-key",
    apiUrl: "https://your-firecrawl-instance.com"
);
// Java SDK
FirecrawlClient client = FirecrawlClient.builder()
    .apiUrl("https://your-firecrawl-instance.com")
    .apiKey("fc-your-api-key")
    .build();

资源规划

推荐资源配置

环境规模API副本Playwright副本RedisPostgreSQL
开发/测试111GB10GB
小规模生产224GB50GB
中等规模558GB200GB
大规模10+10+16GB+500GB+

健康检查配置

Kubernetes 部署中包含以下健康检查:

  • 存活探针 (Liveness Probe):检测服务是否存活,失败时重启容器
  • 就绪探针 (Readiness Probe):检测服务是否就绪,失败时停止接收流量
  • 启动探针 (Startup Probe):给予服务足够时间完成初始化

安全考虑

网络策略

生产环境建议配置 Kubernetes NetworkPolicy,限制以下流量:

  • API 服务仅接收来自负载均衡器的流量
  • Playwright 服务仅接收来自 API 服务的内部流量
  • 数据库仅接收来自 API 服务的流量
  • Redis 仅接收来自 API 服务的流量

密钥管理

API 密钥应通过 Kubernetes Secret 或外部密钥管理服务(如 AWS Secrets Manager、HashiCorp Vault)存储,避免在 values.yaml 中明文配置。

监控与日志

日志聚合

Firecrawl API 服务输出结构化日志,建议通过以下方式收集:

  • 标准输出/标准错误:Kubernetes 默认收集方式
  • 日志聚合器:如 Fluentd、Filebeat 收集到 Elasticsearch/Loki
  • 云原生方案:CloudWatch Logs、Azure Monitor、Google Cloud Logging

关键指标

指标名称说明告警阈值建议
请求延迟 P99API 响应时间> 10s
错误率5xx 错误占比> 5%
队列深度Redis 待处理任务数> 1000
浏览器实例数Playwright 活跃实例< 2(表示可能泄漏)

备份与恢复

数据库备份

PostgreSQL 数据库应配置以下备份策略:

  • 自动全量备份:每日执行,保留 30 天
  • 增量备份:每 6 小时执行
  • 点时间恢复 (PITR):启用 Write-Ahead Log (WAL) 归档

灾难恢复

灾难恢复计划应包含:

  1. RTO(恢复时间目标):< 4 小时
  2. RPO(恢复点目标):< 1 小时
  3. 恢复流程文档化:包含步骤验证清单
  4. 定期演练:每季度执行恢复演练

部署最佳实践

CI/CD 集成

# 示例 GitHub Actions 部署流程
deploy:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - name: Build and push images
      run: |
        docker buildx build \
          --platform linux/amd64,linux/arm64 \
          --push \
          -t ${{ env.REGISTRY }}/firecrawl:${{ github.sha }} .
    - name: Deploy to Kubernetes
      run: |
        helm upgrade firecrawl ./charts/firecrawl \
          --set image.tag=${{ github.sha }}

滚动更新策略

建议使用 RollingUpdate 策略配置蓝绿部署或滚动更新:

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0

相关文档

资料来源:[README.md:1-50]()

开发指南

本文档为 Firecrawl 项目提供全面的开发指南,涵盖开发环境配置、代码规范、测试策略、多语言 SDK 开发等内容。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 环境要求

继续阅读本节完整说明和来源证据。

章节 项目结构

继续阅读本节完整说明和来源证据。

章节 代码质量工具

继续阅读本节完整说明和来源证据。

项目概述

Firecrawl 是一个用于搜索、抓取网页内容并将其转换为 LLM 可用格式的 web scraping 工具。项目采用多语言 SDK 架构,核心 API 服务使用 TypeScript/Node.js 开发,同时提供 Python、JavaScript/TypeScript、Rust、Go、Java、Ruby、.NET 等多语言 SDK。

graph TB
    subgraph 核心服务
        A[API Server<br/>TypeScript/Node.js]
        B[Playwright Service]
        C[数据库服务]
    end
    
    subgraph SDK层
        D[Python SDK]
        E[JS/TS SDK]
        F[Rust SDK]
        G[Go SDK]
        H[Java SDK]
        I[Ruby SDK]
        J[.NET SDK]
    end
    
    K[外部用户]
    
    A --> B
    A --> C
    K --> D
    K --> E
    K --> F
    K --> G
    K --> H
    K --> I
    K --> J
    D --> A
    E --> A
    F --> A
    G --> A

开发环境配置

环境要求

根据不同开发任务,需要安装以下环境:

组件版本要求用途
Node.js18+API 服务开发
Python3.9+Python SDK 开发
Rust1.70+Rust SDK 开发
Java11+Java SDK 开发
Go1.20+Go SDK 开发
Ruby3.0+Ruby SDK 开发
.NET6.0+.NET SDK 开发
Gradle8+Java SDK 构建

项目结构

firecrawl/
├── apps/
│   ├── api/                    # 核心 API 服务 (TypeScript)
│   ├── playwright-service-ts/   # Playwright 浏览器服务
│   ├── python-sdk/              # Python SDK
│   ├── js-sdk/                  # JavaScript/TypeScript SDK
│   ├── rust-sdk/                # Rust SDK
│   ├── go-sdk/                  # Go SDK
│   ├── java-sdk/                # Java SDK
│   ├── ruby-sdk/                # Ruby SDK
│   ├── dot-net-sdk/             # .NET SDK
│   └── test-suite/              # 测试套件
├── examples/                    # 使用示例
│   └── kubernetes/              # Kubernetes 部署配置
└── sharedLibs/                  # 共享库
    └── go-html-to-md/           # Go HTML 转 Markdown 库

代码规范与工具链

代码质量工具

Firecrawl 项目使用 Knip 进行代码质量检查和未使用依赖分析。配置文件位于 apps/api/knip.config.ts

// apps/api/knip.config.ts
import type { KnipConfig } from "knip";
const config: KnipConfig = {
  // 入口文件和项目结构配置
  project: ["**/*.{ts,tsx,js,jsx}"],
  // 忽略的文件
  ignore: ["**/*.test.ts", "**/node_modules/**"],
};
export default config;

代码检查命令

# 运行 Knip 检查
npx knip

# 或添加自定义配置
npx knip --config knip.config.ts

Linting 配置

项目采用标准的 ESLint 配置,建议在提交前运行 lint 检查确保代码风格一致。

测试策略

测试框架

Firecrawl 使用 Jest 作为主要的测试框架。API 服务和测试套件分别有不同的配置文件。

#### API 服务测试配置

// apps/api/jest.config.ts
import type { Config } from "jest";

const config: Config = {
  preset: "ts-jest",
  testEnvironment: "node",
  roots: ["<rootDir>/src"],
  testMatch: ["**/*.test.ts"],
  transform: {
    "^.+\\.tsx?$": ["ts-jest", {
      tsconfig: "tsconfig.json",
    }],
  },
  moduleNameMapper: {
    "^@/(.*)$": "<rootDir>/src/$1",
  },
};

export default config;

#### 测试套件配置

// apps/test-suite/jest.config.js
module.exports = {
  testEnvironment: "node",
  testMatch: ["**/*.test.{js,ts}"],
  // 测试超时设置
  testTimeout: 30000,
};

编写测试用例

#### URL 验证测试示例

// apps/api/src/lib/validateUrl.test.ts
import { validateUrl } from "./validateUrl";

describe("URL Validation", () => {
  it("should validate correct URLs", () => {
    expect(validateUrl("https://example.com")).toBe(true);
    expect(validateUrl("http://test.org/path")).toBe(true);
  });

  it("should reject invalid URLs", () => {
    expect(validateUrl("not-a-url")).toBe(false);
    expect(validateUrl("ftp://invalid-protocol.com")).toBe(false);
  });
});

#### 抓取功能测试示例

// apps/api/src/scraper/scrapeURL/scrapeURL.test.ts
import { scrapeURL } from "./scrapeURL";
import { FirecrawlDocument } from "../../../models/firecrawl-document";

describe("scrapeURL", () => {
  const mockUrl = "https://example.com";
  const mockOptions = {
    formats: ["markdown", "html"] as const,
    onlyMainContent: true,
  };

  it("should scrape a URL and return markdown", async () => {
    const result: FirecrawlDocument = await scrapeURL(mockUrl, mockOptions);
    
    expect(result.markdown).toBeDefined();
    expect(result.markdown).not.toBeEmpty();
  });

  it("should respect onlyMainContent option", async () => {
    const result = await scrapeURL(mockUrl, mockOptions);
    
    expect(result.markdown).not.toContain("<nav>");
    expect(result.markdown).not.toContain("<header>");
  });
});

运行测试

# 运行所有测试
npm test

# 运行特定测试文件
npm test -- validateUrl.test.ts

# 运行测试并生成覆盖率报告
npm test -- --coverage

# 运行测试套件
cd apps/test-suite && npm test

测试最佳实践

实践说明资料来源
测试文件命名使用 .test.ts 后缀apps/api/jest.config.ts:6
测试环境隔离每个测试独立运行apps/api/jest.config.ts:5
模拟外部依赖使用 Jest mocksapps/api/src/scraper/scrapeURL/scrapeURL.test.ts
异步测试使用 async/awaitapps/api/src/scraper/scrapeURL/scrapeURL.test.ts:12
超时配置复杂测试设置超时apps/test-suite/jest.config.js:6

多语言 SDK 开发

Python SDK

#### 环境配置

# 使用虚拟环境
python -m venv venv
source venv/bin/activate  # Linux/Mac
# 或
.\venv\Scripts\activate   # Windows

# 安装依赖
pip install firecrawl

#### 快速开始

# apps/python-sdk/README.md
from firecrawl import Firecrawl

# 创建客户端
firecrawl = Firecrawl(api_key="fc-YOUR_API_KEY")

# 抓取网页
scrape_result = firecrawl.scrape(
    'https://firecrawl.dev', 
    formats=['markdown', 'html']
)
print(scrape_result)

# 爬取网站
crawl_status = firecrawl.crawl(
    'https://firecrawl.dev', 
    limit=100, 
    scrape_options=ScrapeOptions(formats=['markdown', 'html']),
    poll_interval=30
)

#### SDK 包结构

模块功能
firecrawl主客户端类
firecrawl.v2.types类型定义 (ParseOptions, ScrapeOptions)

JavaScript/TypeScript SDK

#### 环境配置

npm install @mendable/firecrawl-js

#### 快速开始

// apps/js-sdk/firecrawl/README.md
import Firecrawl from '@mendable/firecrawl-js';

const app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });

// 搜索
const searchResult = await app.search("firecrawl", { limit: 5 });

// 抓取
const scrapeResult = await app.scrape('https://example.com', {
  formats: ['markdown', 'html'],
  onlyMainContent: true,
});

// 爬取
const crawlResult = await app.crawl('https://firecrawl.dev', {
  limit: 100,
  scrapeOptions: { formats: ['markdown', 'html'] },
});

#### 异步爬取

// 启动异步爬取任务
const start = await app.startCrawl('https://mendable.ai', {
  excludePaths: ['blog/*'],
  limit: 5,
});

// 检查爬取状态
const status = await app.getCrawlStatus(start.jobId);

Rust SDK

#### 环境配置

# apps/rust-sdk/README.md
[dependencies]
firecrawl = "2.1.0"
tokio = { version = "^1", features = ["full"] }

#### 快速开始

use firecrawl::{Client, ScrapeOptions, Format, CrawlOptions};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new("fc-YOUR_API_KEY")?;

    // 抓取 URL
    let document = client.scrape("https://firecrawl.dev", None).await?;
    println!("{:?}", document.markdown);

    // 爬取网站
    let options = CrawlOptions {
        limit: Some(50),
        ..Default::default()
    };
    let result = client.crawl("https://docs.firecrawl.dev", options).await?;

    // 搜索
    let response = client.search("best web scraping tools 2024", None).await?;

    Ok(())
}

Java SDK

#### 环境配置

// apps/java-sdk/README.md
repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.firecrawl:firecrawl-java:1.1.1'
}

#### 快速开始

import com.firecrawl.client.FirecrawlClient;
import com.firecrawl.models.*;
import java.util.List;

// 创建客户端
FirecrawlClient client = FirecrawlClient.builder()
    .apiKey("fc-your-api-key")
    .build();

// 抓取网页
Document doc = client.scrape("https://example.com",
    ScrapeOptions.builder()
        .formats(List.of("markdown"))
        .build());

System.out.println(doc.getMarkdown());

.NET SDK

#### 环境配置

dotnet add package firecrawl-sdk

#### 快速开始

// apps/dotnet-sdk/README.md
using Firecrawl;
using Firecrawl.Models;

var client = new FirecrawlClient("fc-your-api-key");

// 抓取单个页面
var doc = await client.ScrapeAsync("https://example.com",
    new ScrapeOptions { Formats = new List<object> { "markdown" } });

Console.WriteLine(doc.Markdown);

Go SDK

Go SDK 位于 apps/go-sdk,提供与 Firecrawl API 交互的 Go 语言接口。

Ruby SDK

#### 环境配置

# apps/ruby-sdk/README.md
gem "firecrawl-sdk", "~> 1.0"

#### 快速开始

require "firecrawl"

# 创建客户端
client = Firecrawl::Client.new(api_key: "fc-your-api-key")

# 抓取单个页面
doc = client.scrape("https://example.com")
puts doc.markdown

贡献指南

提交流程

``bash git checkout -b feature/your-feature-name ``

  1. Fork 仓库 - 从主仓库创建个人分支
  2. 创建分支 - 使用描述性的分支名称
  3. 编写代码 - 遵循项目的代码规范
  4. 添加测试 - 确保新功能有对应的测试用例
  5. 运行测试 - 提交前确保所有测试通过
  6. 提交更改 - 编写清晰的提交信息
  7. 创建 Pull Request - 描述更改内容和动机

代码审查要点

审查项要求资料来源
代码风格通过 lint 检查apps/api/knip.config.ts
测试覆盖新功能必须包含测试apps/api/jest.config.ts
文档更新更新相关 READMECONTRIBUTING.md
向后兼容不破坏现有 API多语言 SDK 文档

开发工作流

graph LR
    A[创建分支] --> B[编写代码]
    B --> C[添加测试]
    C --> D[运行测试]
    D --> E{测试通过?}
    E -->|否| F[修复问题]
    F --> D
    E -->|是| G[提交代码]
    G --> H[创建 PR]
    H --> I[代码审查]
    I --> J{审查通过?}
    J -->|否| K[修改代码]
    K --> I
    J -->|是| L[合并到主分支]

调试与问题排查

常见问题

#### 1. 测试失败

# 查看详细错误信息
npm test -- --verbose

# 运行单个测试
npm test -- validateUrl.test.ts --verbose

# 调试模式
npm test -- --inspect-brk

#### 2. API 连接问题

检查以下配置:

  • FIRECRAWL_API_KEY 环境变量是否设置
  • API 端点是否可访问
  • 网络代理配置是否正确

#### 3. SDK 导入错误

确保安装了正确版本的 SDK:

SDK最低版本
Pythonfirecrawl 2.x
JavaScript@mendable/firecrawl-js 0.x
Rustfirecrawl 2.1.0
Javafirecrawl-java 1.1.1

高级配置

自定义 API 端点

对于自托管实例,可以指定自定义 API URL:

// JavaScript SDK
const app = new Firecrawl({ 
  apiKey: "fc-your-key",
  apiUrl: "https://your-firecrawl-instance.com"
});
# Python SDK
firecrawl = Firecrawl(
    api_key="fc-your-key",
    api_url="https://your-firecrawl-instance.com"
)
// .NET SDK
var client = new FirecrawlClient(
    apiKey: "fc-your-key",
    apiUrl: "https://your-firecrawl-instance.com"
);

自定义 HTTP 客户端

// .NET SDK - 自定义 HttpClient
var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(60) };
var client = new FirecrawlClient(
    apiKey: "fc-your-api-key",
    httpClient: httpClient);

环境变量配置

变量名说明用途
FIRECRAWL_API_KEYAPI 密钥认证
FIRECRAWL_API_URLAPI 端点 (可选)自托管实例
FIRECRAWL_RATE_LIMIT请求限速避免 API 限流

相关资源

来源:https://github.com/firecrawl/firecrawl / 项目说明书

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

high 来源证据:RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows

可能影响升级、迁移或版本选择。

medium 来源证据:v2.4.0

可能增加新用户试用和生产接入成本。

medium 来源证据:[Bug] /interact with language="python" flakily fails with TargetClosedError on scrape-bound sessions

可能增加新用户试用和生产接入成本。

medium 能力判断依赖假设

假设不成立时,用户拿不到承诺的能力。

Pitfall Log / 踩坑日志

项目:firecrawl/firecrawl

摘要:发现 21 个潜在踩坑项,其中 1 个为 high/blocking;最高优先级:安全/权限坑 - 来源证据:RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows。

1. 安全/权限坑 · 来源证据:RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows

  • 严重度:high
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows
  • 对用户的影响:可能影响升级、迁移或版本选择。
  • 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_0bf31b0e8c3b45fb8da04cebb259c8a4 | https://github.com/firecrawl/firecrawl/issues/3500 | 来源类型 github_issue 暴露的待验证使用条件。

2. 安装坑 · 来源证据:v2.4.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:v2.4.0
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_e1e417d6cea44fb79118e4daeac083a0 | https://github.com/firecrawl/firecrawl/releases/tag/v2.4.0 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

3. 配置坑 · 来源证据:[Bug] /interact with language="python" flakily fails with TargetClosedError on scrape-bound sessions

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:[Bug] /interact with language="python" flakily fails with TargetClosedError on scrape-bound sessions
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_aa487261676d400197da5f3646baff2f | https://github.com/firecrawl/firecrawl/issues/3498 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

4. 能力坑 · 能力判断依赖假设

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:README/documentation is current enough for a first validation pass.
  • 对用户的影响:假设不成立时,用户拿不到承诺的能力。
  • 建议检查:将假设转成下游验证清单。
  • 防护动作:假设必须转成验证项;没有验证结果前不能写成事实。
  • 证据:capability.assumptions | github_repo:787076358 | https://github.com/firecrawl/firecrawl | README/documentation is current enough for a first validation pass.

5. 运行坑 · 来源证据:[Feat] Emit batch scrape failures of each page to webhook

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:[Feat] Emit batch scrape failures of each page to webhook
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_80c638d597cc432b9a74e7e336b043ee | https://github.com/firecrawl/firecrawl/issues/2576 | 来源类型 github_issue 暴露的待验证使用条件。

6. 维护坑 · 维护活跃度未知

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:未记录 last_activity_observed。
  • 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
  • 建议检查:补 GitHub 最近 commit、release、issue/PR 响应信号。
  • 防护动作:维护活跃度未知时,推荐强度不能标为高信任。
  • 证据:evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | last_activity_observed missing

7. 安全/权限坑 · 下游验证发现风险项

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:下游已经要求复核,不能在页面中弱化。
  • 建议检查:进入安全/权限治理复核队列。
  • 防护动作:下游风险存在时必须保持 review/recommendation 降级。
  • 证据:downstream_validation.risk_items | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium

8. 安全/权限坑 · 存在安全注意事项

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:No sandbox install has been executed yet; downstream must verify before user use.
  • 对用户的影响:用户安装前需要知道权限边界和敏感操作。
  • 建议检查:转成明确权限清单和安全审查提示。
  • 防护动作:安全注意事项必须面向用户前置展示。
  • 证据:risks.safety_notes | github_repo:787076358 | https://github.com/firecrawl/firecrawl | No sandbox install has been executed yet; downstream must verify before user use.

9. 安全/权限坑 · 存在评分风险

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:风险会影响是否适合普通用户安装。
  • 建议检查:把风险写入边界卡,并确认是否需要人工复核。
  • 防护动作:评分风险必须进入边界卡,不能只作为内部分数。
  • 证据:risks.scoring_risks | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium

10. 安全/权限坑 · 来源证据:[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_ef6deffa53c147b29e617225612e55b0 | https://github.com/firecrawl/firecrawl/issues/2814 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

11. 安全/权限坑 · 来源证据:v2.0.1

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v2.0.1
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_0334c6a4c3284763a02c66ac96ce9c0c | https://github.com/firecrawl/firecrawl/releases/tag/v2.0.1 | 来源类型 github_release 暴露的待验证使用条件。

12. 安全/权限坑 · 来源证据:v2.1.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v2.1.0
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_360eac170b12452583bb9b7072acc4e3 | https://github.com/firecrawl/firecrawl/releases/tag/v2.1.0 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

13. 安全/权限坑 · 来源证据:v2.2.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v2.2.0
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_749e0e1b86ba455585d343764588f00e | https://github.com/firecrawl/firecrawl/releases/tag/v2.2.0 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

14. 安全/权限坑 · 来源证据:v2.3.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v2.3.0
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_e6f1735e34a34eacb7b77e7bb21644a6 | https://github.com/firecrawl/firecrawl/releases/tag/v2.3.0 | 来源讨论提到 npm 相关条件,需在安装/试用前复核。

15. 安全/权限坑 · 来源证据:v2.5.0 - The World's Best Web Data API

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v2.5.0 - The World's Best Web Data API
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_4f928a2f370b4186ba4031bc4830020c | https://github.com/firecrawl/firecrawl/releases/tag/v2.5.0 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

16. 安全/权限坑 · 来源证据:v2.6.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v2.6.0
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_38343ea51e374e86a5081e46c837468c | https://github.com/firecrawl/firecrawl/releases/tag/v2.6.0 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

17. 安全/权限坑 · 来源证据:v2.7.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v2.7.0
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_4e1fdfc9cb714147a228b5ae01d273f2 | https://github.com/firecrawl/firecrawl/releases/tag/v2.7.0 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

18. 安全/权限坑 · 来源证据:v2.8.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v2.8.0
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_dd78eff5694c40cba109ef1230e1dc77 | https://github.com/firecrawl/firecrawl/releases/tag/v2.8.0 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

19. 安全/权限坑 · 来源证据:v2.9.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v2.9.0
  • 对用户的影响:可能阻塞安装或首次运行。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_a6219f53b7de4f31bb8ca1c7109fd49d | https://github.com/firecrawl/firecrawl/releases/tag/v2.9.0 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

20. 维护坑 · issue/PR 响应质量未知

  • 严重度:low
  • 证据强度:source_linked
  • 发现:issue_or_pr_quality=unknown。
  • 对用户的影响:用户无法判断遇到问题后是否有人维护。
  • 建议检查:抽样最近 issue/PR,判断是否长期无人处理。
  • 防护动作:issue/PR 响应未知时,必须提示维护风险。
  • 证据:evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | issue_or_pr_quality=unknown

21. 维护坑 · 发布节奏不明确

  • 严重度:low
  • 证据强度:source_linked
  • 发现:release_recency=unknown。
  • 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
  • 建议检查:确认最近 release/tag 和 README 安装命令是否一致。
  • 防护动作:发布节奏未知或过期时,安装说明必须标注可能漂移。
  • 证据:evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | release_recency=unknown

来源:Doramagic 发现、验证与编译记录