> ## Documentation Index
> Fetch the complete documentation index at: https://firecrawl.web3doc.top/llms.txt
> Use this file to discover all available pages before exploring further.

# Rust

> Firecrawl Rust SDK 是一个库，可以帮助您轻松抓取和爬取网站，并将数据以适用于语言模型（LLMs）的格式输出。

## 安装

要安装 Firecrawl Rust SDK，请在您的 `Cargo.toml` 中添加以下内容：

```yaml Rust theme={null}
# 将以下内容添加到您的Cargo.toml中
[dependencies]
firecrawl = "^1.0"
tokio = { version = "^1", features = ["full"] }
```

## 使用

首先，您需要从 [firecrawl.dev](https://firecrawl.dev) 获取一个 API 密钥。然后，您需要初始化 `FirecrawlApp`。从这里，您可以访问像 `FirecrawlApp::scrape_url` 这样的函数，让您使用我们的 API。

以下是如何在 Rust 中使用 SDK 的示例：

```rust Rust theme={null}
use firecrawl::{crawl::{CrawlOptions, CrawlScrapeOptions, CrawlScrapeFormats}, FirecrawlApp, scrape::{ScrapeOptions, ScrapeFormats}};

#[tokio::main]
async fn main() {
    // 使用API密钥初始化FirecrawlApp
    let app = FirecrawlApp::new("fc-YOUR_API_KEY").expect("无法初始化FirecrawlApp");

    // 抓取一个URL
    let options = ScrapeOptions {
        formats: vec![ScrapeFormats::Markdown, ScrapeFormats::HTML].into(),
        ..Default::default()
    };

    let scrape_result = app.scrape_url("https://firecrawl.dev", options).await;

    match scrape_result {
        Ok(data) => println!("抓取结果:
{}", data.markdown.unwrap()),
        Err(e) => eprintln!("抓取失败: {}", e),
    }

    // 爬取一个网站
    let crawl_options = CrawlOptions {
        scrape_options: CrawlScrapeOptions {
            formats: vec![CrawlScrapeFormats::Markdown, CrawlScrapeFormats::HTML].into(),
            ..Default::default()
        }.into(),
        limit: 100.into(),
        ..Default::default()
    };

    let crawl_result = app
        .crawl_url("https://mendable.ai", crawl_options)
        .await;

    match crawl_result {
        Ok(data) => println!("爬取结果（使用了{}积分）:
{:#?}", data.credits_used, data.data),
        Err(e) => eprintln!("爬取失败: {}", e),
    }
}
```

### 抓取 URL

要抓取单个 URL，请使用 `scrape_url` 方法。它接受 URL 作为参数并返回抓取的数据作为 `Document`。

```rust Rust theme={null}
let options = ScrapeOptions {
    formats: vec![ScrapeFormats::Markdown, ScrapeFormats::HTML].into(),
    ..Default::default()
};

let scrape_result = app.scrape_url("https://firecrawl.dev", options).await;

match scrape_result {
    Ok(data) => println!("Scrape Result:
{}", data.markdown.unwrap()),
    Err(e) => eprintln!("Map failed: {}", e),
}
```

### 带提取的抓取

使用 Extract，您可以轻松地从任何 URL 中提取结构化数据。您需要使用 JSON Schema 格式指定您的模式，使用 `serde_json::json!` 宏。

```rust Rust theme={null}
let json_schema = json!({
    "type": "object",
    "properties": {
        "top": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "title": {"type": "string"},
                    "points": {"type": "number"},
                    "by": {"type": "string"},
                    "commentsURL": {"type": "string"}
                },
                "required": ["title", "points", "by", "commentsURL"]
            },
            "minItems": 5,
            "maxItems": 5,
            "description": "Top 5 stories on Hacker News"
        }
    },
    "required": ["top"]
});

let llm_extraction_options = ScrapeOptions {
    formats: vec![ ScrapeFormats::Extract ].into(),
    extract: ExtractOptions {
        schema: json_schema.into(),
        ..Default::default()
    }.into(),
    ..Default::default()
};

let llm_extraction_result = app
    .scrape_url("https://news.ycombinator.com", llm_extraction_options)
    .await;

match llm_extraction_result {
    Ok(data) => println!("LLM Extraction Result: \n{:#?}", data.extract.unwrap()),
    Err(e) => eprintln!("LLM Extraction failed: {}", e),
}
```

### 抓取网站

要抓取网站，请使用 `crawl_url` 方法。这将等待抓取完成，这可能需要很长时间，具体取决于您的起始 URL 和您的选项。

```rust Rust theme={null}
let crawl_options = CrawlOptions {
    scrape_options: CrawlScrapeOptions {
        formats: vec![CrawlScrapeFormats::Markdown, CrawlScrapeFormats::HTML].into(),
        ..Default::default()
    }.into(),
    limit: 100.into(),
    ..Default::default()
};

let crawl_result = app
    .crawl_url("https://mendable.ai", crawl_options)
    .await;

match crawl_result {
    Ok(data) => println!("Crawl Result (used {} credits):
{:#?}", data.credits_used, data.data),
    Err(e) => eprintln!("Crawl failed: {}", e),
}
```

#### 异步抓取

要抓取而不等待结果，请使用 `crawl_url_async` 方法。它接受相同的参数，但它返回一个 `CrawlAsyncRespone` 结构体，包含抓取的 ID。您可以使用该 ID 与 `check_crawl_status` 方法随时检查状态。请注意，完成的抓取将在 24 小时后删除。

```rust Rust theme={null}
let crawl_id = app.crawl_url_async("https://mendable.ai", None).await?.id;

// ... later ...

let status = app.check_crawl_status(crawl_id).await?;

if status.status == CrawlStatusTypes::Completed {
    println!("Crawl is done: {:#?}", status.data);
} else {
    // ... wait some more ...
}
```

### 映射 URL

映射从一个起始 URL 关联的所有链接。

```rust Rust theme={null}
let map_result = app.map_url("https://firecrawl.dev", None).await;

match map_result {
    Ok(data) => println!("映射的URL: {:#?}", data),
    Err(e) => eprintln!("映射失败: {}", e),
}
```

## 错误处理

SDK 处理由 Firecrawl API 和我们的依赖项返回的错误，并将它们组合到 `FirecrawlError` 枚举中，实现 `Error`、`Debug` 和 `Display`。我们的所有方法都返回一个 `Result<T, FirecrawlError>`。

<ErrorHandlingRust />
