Skip to main content
爬取会将一个 URL 提交给 Firecrawl,并递归发现和抓取所有可到达的子页面。它会自动处理 sitemap、JavaScript 渲染和速率限制,并为每个页面返回干净的 Markdown 或结构化数据。
  • 通过 sitemap 和递归链接遍历发现页面
  • 支持路径过滤、深度限制以及对子域名/外部链接的控制
  • 通过轮询、WebSocket 或 webhook 返回结果
爬取所抓取的每个页面都会经过同样的抓取流水线,因此抓取单个页面能做的事情,爬取都能对它到达的每个页面做到。功能列出了具体有哪些功能、每项功能在何处运行,以及是否需要 API 密钥。

在 Playground 中试用

在交互式 Playground 中测试爬取功能——无需代码。

安装

基本用法

调用 POST /v2/crawl 并提供起始 URL,即可提交爬取任务。该端点会返回一个任务 ID,你可以用它轮询结果。
每爬取 1 个页面会消耗 1 个额度。爬取的默认 limit 为 10,000 个页面。在开始之前,爬取端点会检查你的剩余额度是否足以覆盖 limit;如果不足,则会返回 402 (需要付款) 错误。你可以设置更低的 limit 来匹配计划的爬取规模 (例如将 limit 设为 100) ,以避免这种情况。某些选项会额外消耗额度:JSON 模式每个页面额外消耗 4 个额度,PDF 解析每个 PDF 页面额外消耗 1 个额度。

Scrape 选项

Scrape 端点的所有选项都可通过 scrapeOptions (JS) / scrape_options (Python) 在 crawl 中使用。它们将应用于爬虫抓取的每个页面,包括 formats、代理、缓存、actions、location 和 tags。

检查爬取状态

使用任务 ID 轮询爬取状态并获取结果。
任务结果在完成后 24 小时内可通过 API 获取。此后,你仍可以在活动日志中查看你的爬取历史和结果。
爬取结果中的 data 数组里包含的是 Firecrawl 成功抓取的页面,即使目标站点返回了 404 等 HTTP 错误。metadata.statusCode 字段显示的是目标站点返回的 HTTP 状态码。若要获取 Firecrawl 本身未能成功抓取的页面 (例如网络错误、超时或被 robots.txt 拦截) ,请使用专门的 Get Crawl Errors 端点 (GET /crawl/{id}/errors) 。

响应处理

响应会根据爬取任务的状态而有所不同。对于未完成的任务或超过 10MB 的大型响应,会返回一个 next URL 参数。你需要请求该 URL 以获取后续的每 10MB 数据。如果没有 next 参数,则表示爬取数据已结束。
仅在直接调用 API 时,skipnext 参数才生效。 如果你使用 SDK,我们会代为处理,并一次性返回全部结果。

SDK 方法

通过 SDK 使用 crawl 有两种方式。

抓取并等待

crawl 方法会等待爬取完成并返回完整响应。自动处理分页。适用于大多数场景,推荐使用。
响应包括爬取状态及所有抓取到的数据:

启动后稍后检查

startCrawl / start_crawl 方法会立即返回一个爬取 ID。随后你需要手动轮询状态。这适合长时间运行的爬取任务或自定义轮询逻辑。
初始响应会返回任务 ID:

使用 WebSocket 获取实时结果

watcher 方法会在页面爬取过程中提供实时更新。启动爬取后,订阅事件即可进行即时数据处理。

Webhooks

你可以配置 webhook,在爬取过程中实时接收通知,从而在页面被抓取后立即进行处理,而无需等待整个爬取任务完成。
cURL

事件类型

负载

验证 webhook 签名

来自 Firecrawl 的每个 webhook 请求都会包含一个 X-Firecrawl-Signature 请求头,其中含有一个 HMAC-SHA256 签名。务必验证此签名,以确保 webhook 为真实请求且未被篡改。
  1. 在账户设置中的 Advanced (高级) 选项卡 获取你的 webhook 密钥 (secret)
  2. X-Firecrawl-Signature 请求头中提取签名
  3. 使用该密钥对原始请求体计算 HMAC-SHA256
  4. 使用时间安全函数 (timing-safe function) 将计算结果与签名请求头中的值进行比较
在验证签名之前,切勿处理任何 webhook。X-Firecrawl-Signature 请求头中的签名格式为:sha256=abc123def456...
有关 JavaScript 和 Python 的完整实现示例,请参阅 Webhook 安全文档。如需查看更全面的 webhook 文档,包括详细的事件负载、负载结构、高级配置和故障排查,请参阅 Webhooks 文档

执行与结果统计

爬取运行结束,并不等于它抓取到了每一个页面。本节说明爬取相关 endpoints 目前会针对一次运行报告哪些内容——计数器、分页约定、失败记录以及范围限制——以便你自行判断某次运行是否足够完整、可以据此采取行动。这些记录都不能保证抓取的完整性。

读取状态计数器

Get 爬取 Status (GET /v2/crawl/{id}) 返回的每个响应都包含用于描述本次运行的计数器:
对于已完成的爬取,completed == total 并不意味着每个 discovered page 都成功了。由于 total 是已完成、活跃、排队和积压页面之和,且不含失败的页面,处于终态的爬取其 activequeuedbacklog 始终为零 —— 因此无论是否有页面失败,这两个计数器都会相等。状态计数器无法告诉你是否发生了失败。失败的页面只能通过 Get 爬取 Errors 逐一列出。
data 数组仅包含 Firecrawl 成功抓取的页面。已尝试但未产生结果的页面不会出现在 data 中 —— 请从下文的 Get 爬取 Errors 中获取。

分页读取结果

响应大小上限为 10MB。响应被截断时,next 会携带下一页结果的 URL。 next 并不单纯是“还有更多数据”的信号:只要 status 不是 completed,它就会出现,因此已进入终态 failedcancelled 的爬取即便没有更多结果,也可能返回 next URL。不要把 next 是否缺失当作循环的退出条件——对失败或已取消的爬取来说,它永远不会消失。 真正的终止条件是 status 字段。要完整读取一次运行:
  1. 轮询 GET /v2/crawl/{id},直到 status 变为 completedfailedcancelled 之一。
  2. 只要 next 存在上一页返回的 data 数组非空,就沿着 next 继续收集剩余结果。
  3. next 不存在,或某一页未返回新文档时,停止。
官方 SDKs 会自动处理分页,并一次性返回全部结果。

失败和被封禁的页面

Get Crawl Errors (GET /v2/crawl/{id}/errors) 会记录未进入 data 的页面,返回两个数组:
  • errors — 出错的抓取任务,每一项包含 idurlerror (错误消息) 以及失败发生时的 timestamp。这些是 Firecrawl 自身抓取失败的页面,例如网络错误、超时等。被有意跳过的外部站点首页链接也会在此上报,错误代码为 EXTERNAL_LINK
  • robotsBlocked — 已尝试访问但被站点 robots.txt 封禁的 URL。
该列表并不保证完整列举每一次失败:目前部分内部失败类别会在构建响应之前从 errors 中被过滤掉。请将其视为 Firecrawl 上报的失败记录,而不能据此断定没有其他问题。上文提到的错误代码 (EXTERNAL_LINK) 目前会在错误对象中返回,但尚未纳入已发布的 GET /crawl/{id}/errors schema,相关 API Reference 文档待更新。
如果目标站点返回了诸如 404 之类的 HTTP 错误,该页面不算爬取错误:Firecrawl 已成功抓取它,因此它会出现在 data 中,并在 metadata.statusCode 中带有站点返回的状态码。

爬虫的可达范围

覆盖范围受你设置的范围参数限制,这些参数均记录在配置参考爬取 endpoint 参考中:
  • 默认仅抓取子路径。 爬取会忽略不属于所提供 URL 子级的链接。使用 crawlEntireDomain 抓取同级和上级路径,使用 allowSubdomains 抓取子域名,使用 allowExternalLinks 跟随跨域名的链接。
  • includePaths / excludePaths 以正则表达式匹配 URL 的 pathname —— 而非完整 URL,也不包含查询参数。设置 regexOnFullURL: true 可改为匹配包含查询字符串的完整 URL。起始 URL 同样会与 includePaths 进行匹配:若不匹配,爬取可能返回 0 个页面。
  • sitemap 模式。 使用默认的 sitemap: "include" 时,URL 来自 sitemap 以及递归的链接发现。"skip" 仅使用 HTML 链接,因此会遗漏仅存在于 sitemap 中的页面,例如 PDF 或层级很深的页面。"only" 则只抓取 sitemap 加起始 URL,不从 HTML 中发现链接。
  • maxDiscoveryDepth 限制从根节点起可跟随的链接发现跳数。处于最大深度的页面仍会被抓取,但不会再跟随其中发现的链接。
  • limit 限制页面数量,默认值为 10000
  • ignoreQueryParameters 可避免对查询参数不同的同一路径重复抓取。
  • 遵守 robots.txt,除非启用 ignoreRobotsTxt (仅限企业版) 。
maxConcurrency 默认为你团队的 concurrency 上限,该上限由你的 plan 决定 —— 请参见限流

当多次运行结果不一致时

同一配置在多次运行之间的爬取结果可能会有所不同。页面会并发抓取,因此链接被发现的顺序取决于网络时序以及哪些页面先完成加载。这意味着在接近深度边界时,站点的不同分支可能会被探索到不同程度,尤其是在 maxDiscoveryDepth 值较高时。 要让运行结果更可复现:
  • maxConcurrency 设置为 1。如配置参考所述,maxConcurrency 表示“最大并发抓取数”——它限制同时进行的请求数量。这会减少依赖时序的交错执行,但并不能消除运行间的差异:sitemap 发现的入队不受该上限约束,嵌套 sitemap 会作为独立任务获取,且返回的 data 数组按完成时间而非发现顺序排列。设置 delay 也会将并发数强制为 1。
  • 如果站点拥有完整的 sitemap,请使用 sitemap: "only",这样 URL 集合来自 sitemap 而非链接发现。

判断爬取何时完成

如果不使用轮询,webhook 事件也能告诉你同样的信息:每成功抓取一个页面都会触发 crawl.page,运行结束时会触发 crawl.completed (或 crawl.failed) 。任务结果在完成后的 24 小时内可通过 API 获取;超过该时限后,可在活动日志中查看。

配置参考

提交爬取任务时可用的完整参数集:

重要说明

默认情况下,爬取 会忽略不属于你提供的 URL 子路径的链接。例如,如果你爬取 website.com/blogs/,则不会返回 website.com/other-parent/blog-1。使用 crawlEntireDomain 参数可包含同级路径和父级路径。要在爬取 website.com 时一并爬取 blog.website.com 这类子域名,请使用 allowSubdomains 参数。
  • sitemap 发现:默认情况下,爬虫会包含网站的 sitemap 来发现 URL (sitemap: "include") 。如果设置 sitemap: "skip",则只会发现可通过根 URL 的 HTML 链接访问到的页面。像 PDF 这类资源,或列在 sitemap 中但未在 HTML 中直接链接的深层页面,都会被遗漏。为了获得最大覆盖率,建议保留默认设置。
  • 额度消耗:每爬取一个页面消耗 1 个额度。JSON 模式每页额外消耗 4 个额度,PDF 解析则每个 PDF 页面消耗 1 个额度。
  • 结果过期时间:任务结果在完成后的 24 小时内可通过 API 获取。此后,请在活动日志中查看结果。
  • 爬取错误data 数组包含 Firecrawl 成功抓取的页面。使用 Get Crawl Errors 端点可获取因网络错误、超时或被 robots.txt 封禁而失败的页面。
  • 外部链接:设置 allowExternalLinks: true 后,爬虫会跟随指向域名外部的链接,并对每个链接页面抓取一次——不会继续爬取这些外部页面中的链接。指向外部站点主页的链接 (不含路径的根 URL,例如 https://example.com/) 会被特意跳过,以避免抓取整个无关站点;这些链接会以代码 EXTERNAL_LINK 显示在 Get Crawl Errors 中。重定向会被跟随至其目标地址——包括解析为其规范 URL 的链接 (例如 http → httpswww 变体) ——因此,只有最终跳转至外部主页的重定向会被跳过。
  • 非确定性结果:同一配置在多次运行之间的爬取结果可能会有所不同,因为页面是并发抓取的,链接发现顺序取决于网络时序。关于哪些方面会发生变化以及如何让运行更可复现,请参见执行与结果统计
你是需要 Firecrawl API 密钥的 AI 代理吗?请参阅 firecrawl.dev/agent-onboarding/SKILL.md 了解自动化接入说明。