跳转到主要内容
Firecrawl 高效爬取网站,绕过拦截提取全面数据。流程如下:
  1. URL 分析: 扫描 sitemap 并爬取网站以识别链接
  2. 遍历: 递归跟随链接以发现所有子页面
  3. 抓取: 从各页面提取内容,处理 JS 与速率限制
  4. 输出: 将数据转换为干净的 Markdown 或结构化格式
确保可从任意起始 URL 全面采集数据。

爬虫

/crawl 端点

用于抓取某个 URL 及其所有可访问的子页面。该操作会提交一个抓取任务,并返回任务 ID 以便查询抓取状态。
默认情况下,如果页面中的子链接并非你提供的 URL 的下级路径,Crawl 会忽略它们。因此,若你抓取 website.com/blogs/,则不会返回 website.com/other-parent/blog-1。若需要包含 website.com/other-parent/blog-1,请使用 crawlEntireDomain 参数。若在抓取 website.com 时需要抓取其子域名(如 blog.website.com),请使用 allowSubdomains 参数。

安装

# 使用 pip 安装 firecrawl-py

from firecrawl import Firecrawl

firecrawl = Firecrawl(api_key="fc-YOUR-API-KEY")

使用方法

from firecrawl import Firecrawl

firecrawl = Firecrawl(api_key="fc-你的API密钥")

docs = firecrawl.crawl(url="https://docs.firecrawl.dev", limit=10)
print(docs)

在 Crawl 中使用 Scrape 选项

Scrape 端点的所有选项都可通过 scrapeOptions(JS)/ scrape_options(Python)在 Crawl 中使用。它们将应用于爬虫抓取的每个页面:formats、proxy、caching、actions、location、tags 等。完整列表参见 Scrape API Reference
import Firecrawl from '@mendable/firecrawl-js';

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

// 使用 scrape 选项进行爬取
const crawlResponse = await firecrawl.crawl('https://example.com', {
  limit: 100,
  scrapeOptions: {
    formats: [
      'markdown',
      {
        type: 'json',
        schema: { type: 'object', properties: { title: { type: 'string' } } },
      },
    ],
    proxy: 'auto',
    maxAge: 600000,
    onlyMainContent: true,
  },
});

API 响应

如果你使用 cURL 或 starter 方法,将返回一个用于检查爬取状态的 ID
如果你使用 SDK,请参见下方方法,了解 waiter 与 starter 的行为差异。
{
  "success": true,
  "id": "123-456-789",
  "url": "https://api.firecrawl.dev/v2/crawl/123-456-789"
}

检查爬取任务

用于检查爬取任务的状态并获取结果。
此端点仅适用于正在进行或刚刚完成的爬取任务。
status = firecrawl.get_crawl_status("<crawl-id>")
print(status)

响应处理

响应会根据爬取任务的状态而有所不同。 对于未完成的任务或超过 10MB 的大型响应,会返回一个 next URL 参数。你需要请求该 URL 以获取后续的每 10MB 数据。如果没有 next 参数,则表示爬取数据已结束。 skip 参数用于设置每个结果分块所返回的最大条目数。
仅在直接调用 API 时,skip 和 next 参数才生效。 如果你使用 SDK,我们会代为处理,并一次性返回全部结果。
{
  "status": "抓取中",
  "total": 36,
  "completed": 10,
  "creditsUsed": 10,
  "expiresAt": "2024-00-00T00:00:00.000Z",
  "next": "https://api.firecrawl.dev/v2/crawl/123-456-789?skip=10",
  "data": [
    {
      "markdown": "[Firecrawl 文档首页![浅色标志](https://mintlify.s3-us-west-1.amazonaws.com/firecrawl/logo/light.svg)!...",
      "html": "<!DOCTYPE html><html lang=\"en\" class=\"js-focus-visible lg:[--scroll-mt:9.5rem]\" data-js-focus-visible=\"\">...",
      "metadata": {
        "title": "使用 Groq Llama 3 构建“网站聊天” | Firecrawl",
        "language": "en",
        "sourceURL": "https://docs.firecrawl.dev/learn/rag-llama3",
        "description": "了解如何使用 Firecrawl、Groq Llama 3 和 Langchain 构建一个“网站聊天”机器人。",
        "ogLocaleAlternate": [],
        "statusCode": 200
      }
    },
    ...
  ]
}

SDK 方法

使用 SDK 有两种方式:
  1. 抓取并等待crawl):
    • 等待爬取完成并返回完整响应
    • 自动处理分页
    • 适用于大多数场景,推荐使用
from firecrawl import Firecrawl, ScrapeOptions

firecrawl = 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
)
print(crawl_status)
响应包括爬取状态及所有抓取到的数据:
success=True
status='completed'
completed=100
total=100
creditsUsed=100
expiresAt=datetime.datetime(2025, 4, 23, 19, 21, 17, tzinfo=TzInfo(UTC))
next=None
data=[
  Document(
    markdown='[第 7 天 - 发布周 III · 集成日(4 月 14 日至 20 日)](...',
    metadata={
      'title': '15 个 Python 网页爬取项目:从入门到进阶',
      ...
      'scrapeId': '97dcf796-c09b-43c9-b4f7-868a7a5af722',
      'sourceURL': 'https://www.firecrawl.dev/blog/python-web-scraping-projects',
      'url': 'https://www.firecrawl.dev/blog/python-web-scraping-projects',
      'statusCode': 200
    }
  ),
  ...
]
  1. 启动后轮询状态startCrawl/start_crawl):
    • 立即返回一个爬取 ID
    • 支持手动检查进度/状态
    • 适合长时间运行的爬取或自定义轮询逻辑
from firecrawl import Firecrawl

firecrawl = Firecrawl(api_key="fc-YOUR-API-KEY")

job = firecrawl.start_crawl(url="https://docs.firecrawl.dev", limit=10)
print(job)

# 检查爬取任务的状态
status = firecrawl.get_crawl_status(job.id)
print(status)

爬取 WebSocket

Firecrawl 基于 WebSocket 的方法 Crawl URL and Watch 支持实时数据提取与监控。以 URL 启动爬取,并可通过页面数量上限、允许的域名、输出 formats 等选项进行自定义,适用于即时数据处理需求。
import asyncio
from firecrawl import AsyncFirecrawl

async def main():
    firecrawl = AsyncFirecrawl(api_key="fc-YOUR-API-KEY")

    # 首先启动爬取
    started = await firecrawl.start_crawl("https://firecrawl.dev", limit=5)

    # 监听更新(快照)直到终止状态
    async for snapshot in firecrawl.watcher(started.id, kind="crawl", poll_interval=2, timeout=120):
        if snapshot.status == "completed":
            print("完成", snapshot.status)
            for doc in snapshot.data:
                print("文档", doc.metadata.source_url if doc.metadata else None)
        elif snapshot.status == "failed":
            print("错误", snapshot.status)
        else:
            print("状态", snapshot.status, snapshot.completed, "/", snapshot.total)

asyncio.run(main())

爬取 Webhook

你可以配置 webhook,在爬取过程中实时接收通知。这样就能在页面被抓取后即时处理,而无需等待整个爬取任务完成。
cURL
curl -X POST https://api.firecrawl.dev/v2/crawl \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer <YOUR_API_KEY>' \
    -d '{
      "url": "https://docs.firecrawl.dev",
      "limit": 100,
      "webhook": {
        "url": "https://your-domain.com/webhook",
        "metadata": {
          "any_key": "any_value"
        },
        "events": ["started", "page", "completed"]
      }
    }'
有关完整的 webhook 文档(包括事件类型、负载结构和实现示例),请参阅Webhook 文档

快速参考

事件类型:
  • crawl.started - 爬取开始时触发
  • crawl.page - 每成功抓取一个页面时触发
  • crawl.completed - 爬取完成时触发
  • crawl.failed - 爬取出错时触发
基本负载:
{
  "success": true,
  "type": "crawl.page",
  "id": "crawl-job-id",
  "data": [...], // 'page' 事件的页面数据
  "metadata": {}, // 您的自定义元数据
  "error": null
}
有关 webhook 的详细配置、安全最佳实践和 疑难排解,请参阅 Webhooks 文档