Firecrawl 高效爬取网站,在绕过风控的同时提取全面数据。流程如下:
  1. URL 分析: 扫描站点地图并爬取网站以识别链接
  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、缓存、actions、location、tags 等。完整列表见 Scrape API 参考
import Firecrawl from '@mendable/firecrawl-js';

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

// 使用 scrape 选项进行 crawl
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 参数用于设置每个结果分片的最大返回数量。
skip 和 next 参数仅在直接调用 API 时适用。若使用 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)

# Check the status of the crawl
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.sourceURL 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 文档(包括事件类型、载荷结构和实现示例),请参阅Webhooks 文档

快速参考

事件类型:
  • crawl.started - 爬取开始时
  • crawl.page - 每个成功抓取的页面
  • crawl.completed - 爬取结束时
  • crawl.failed - 爬取出错时
基础载荷:
{
  "success": true,
  "type": "crawl.page",
  "id": "crawl-job-id",
  "data": [...], // “page” 事件对应的页面数据
  "metadata": {}, // 你自定义的元数据
  "error": null
}
有关 webhook 的详细配置、安全最佳实践及故障排查,请参阅 Webhooks 文档