Documentation Index
Fetch the complete documentation index at: https://firecrawl-mog-search-exclude-include-domains.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
从你的 Node.js 应用中抓取单个页面、爬取整个站点,并映射 URL。SDK 会处理分页、重试和异步任务轮询,让你能够专注于使用返回的数据。
使用 npm 安装 SDK:
// 使用 npm 安装 @mendable/firecrawl-js
import Firecrawl from '@mendable/firecrawl-js';
const firecrawl = new Firecrawl({ apiKey: "fc-YOUR-API-KEY" });
- 在 firecrawl.dev 获取 API 密钥
- 将该密钥设置为名为
FIRECRAWL_API_KEY 的环境变量,或作为参数传递给 FirecrawlApp 类。
以下是一个包含错误处理的 SDK 使用示例:
import Firecrawl from '@mendable/firecrawl-js';
const firecrawl = new Firecrawl({apiKey: "fc-YOUR_API_KEY"});
// 抓取网站内容
const scrapeResponse = await firecrawl.scrape('https://firecrawl.dev', {
formats: ['markdown', 'html'],
});
console.log(scrapeResponse)
// 爬取整站
const crawlResponse = await firecrawl.crawl('https://firecrawl.dev', {
limit: 100,
scrapeOptions: {
formats: ['markdown', 'html'],
}
});
console.log(crawlResponse)
使用 scrape 方法抓取单个 URL,并返回结构化的页面数据。
// 抓取网站:
const scrapeResult = await firecrawl.scrape('firecrawl.dev', { formats: ['markdown', 'html'] });
console.log(scrapeResult)
当你想上传本地文件 (html、pdf、docx、xlsx 等) ,而不是通过 URL 抓取时,请使用 parse。
parse 不支持 changeTracking,也不支持仅适用于浏览器的选项,例如 screenshot、branding、actions、waitFor、location 和 mobile。
const parsed = await firecrawl.parse(
{
data: "<html><body><h1>Node Parse</h1></body></html>",
filename: "upload.html",
contentType: "text/html",
},
{
formats: ["markdown"],
},
);
console.log(parsed.markdown);
使用 crawl 方法从单个 URL 开始爬取整个网站。你可以设置页面上限,将范围限制在特定域名内,并选择输出格式。请参见 Pagination 了解自动和手动分页。
const job = await firecrawl.crawl('https://docs.firecrawl.dev', { limit: 5, pollInterval: 1, timeout: 120 });
console.log(job.status);
使用 sitemap: "only" 仅爬取 sitemap 中的 URL(起始 URL 始终会被包含,并且会跳过 HTML 链接发现过程)。
const job = await firecrawl.crawl('https://docs.firecrawl.dev', {
sitemap: 'only',
limit: 25,
});
console.log(job.status, job.data.length);
使用 startCrawl 可启动一次爬取且无需等待其完成。该方法会返回一个任务 ID,供你稍后轮询。若需要阻塞等待直到完成,请改用 crawl。分页行为和限制详见 Pagination。
const { id } = await firecrawl.startCrawl('https://docs.firecrawl.dev', { limit: 10 });
console.log(id);
使用 checkCrawlStatus 方法检查爬取任务当前是仍在运行、已完成还是已失败。传入 startCrawl 返回的任务 ID。
const status = await firecrawl.getCrawlStatus("<crawl-id>");
console.log(status);
使用 cancelCrawl 方法取消正在运行中的爬取。传入由 startCrawl 返回的任务 ID。
const ok = await firecrawl.cancelCrawl("<crawl-id>");
console.log("已取消:", ok);
使用 map 方法可发现网站上的所有 URL。传入起始 URL,即可返回已发现页面的列表。
const res = await firecrawl.map('https://firecrawl.dev', { limit: 10 });
console.log(res.links);
使用 crawlUrlAndWatch 方法实时流式获取爬取结果。你会在每个页面完成爬取时立即收到结果,无需等待整个任务结束。
import Firecrawl from '@mendable/firecrawl-js';
const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR-API-KEY' });
// 启动一次爬取并开始监控
const { id } = await firecrawl.startCrawl('https://mendable.ai', {
excludePaths: ['blog/*'],
limit: 5,
});
const watcher = firecrawl.watcher(id, { kind: 'crawl', pollInterval: 2, timeout: 120 });
watcher.on('document', (doc) => {
console.log('DOC', doc);
});
watcher.on('error', (err) => {
console.error('ERR', err?.error || err);
});
watcher.on('done', (state) => {
console.log('DONE', state.status);
});
// 开始监控(优先使用 WS,回退到 HTTP)
await watcher.start();
当有更多数据可用时,Firecrawl 的 /crawl 和 batch 端点会返回一个 next URL。Node SDK 默认会自动分页并汇总所有文档;在这种情况下,next 将为 null。你可以禁用自动分页或设置上限。
使用 waiter 方法 crawl 以获得最简便的体验,或启动一个任务并手动逐页处理。
- 先启动作业,然后将
autoPaginate: false 设置为禁用自动分页,逐页获取。
const crawlStart = await firecrawl.startCrawl('https://docs.firecrawl.dev', { limit: 5 });
const crawlJobId = crawlStart.id;
const crawlSingle = await firecrawl.getCrawlStatus(crawlJobId, { autoPaginate: false });
console.log('单页抓取:', crawlSingle.status, '文档数:', crawlSingle.data.length, '下一页:', crawlSingle.next);
- 保持自动分页开启,但可通过
maxPages、maxResults 或 maxWaitTime 提前停止。
const crawlLimited = await firecrawl.getCrawlStatus(crawlJobId, {
autoPaginate: true,
maxPages: 2,
maxResults: 50,
maxWaitTime: 15,
});
console.log('受限爬取:', crawlLimited.status, '文档数:', crawlLimited.data.length, '下一页:', crawlLimited.next);
使用等待器方法 batchScrape,或手动启动作业并逐页处理。
- 启动作业,将
autoPaginate: false 以禁用自动分页,并按页逐一获取。
const batchStart = await firecrawl.startBatchScrape([
'https://docs.firecrawl.dev',
'https://firecrawl.dev',
], { options: { formats: ['markdown'] } });
const batchJobId = batchStart.id;
const batchSingle = await firecrawl.getBatchScrapeStatus(batchJobId, { autoPaginate: false });
console.log('批量单页:', batchSingle.status, '文档数:', batchSingle.data.length, '下一页:', batchSingle.next);
- 保持自动分页开启,但可通过
maxPages、maxResults 或 maxWaitTime 提前停止。
const batchLimited = await firecrawl.getBatchScrapeStatus(batchJobId, {
autoPaginate: true,
maxPages: 2,
maxResults: 100,
maxWaitTime: 20,
});
console.log('批处理受限:', batchLimited.status, '文档数:', batchLimited.data.length, '下一个:', batchLimited.next);
在云端启动浏览器会话并远程执行代码。
import Firecrawl from '@mendable/firecrawl-js';
const firecrawl = new Firecrawl({ apiKey: "fc-YOUR-API-KEY" });
const session = await firecrawl.browser({ ttl: 600 });
console.log(session.id); // 会话 ID
console.log(session.cdpUrl); // wss://cdp-proxy.firecrawl.dev/cdp/...
console.log(session.liveViewUrl); // https://liveview.firecrawl.dev/...
const result = await firecrawl.browserExecute(session.id, {
code: 'await page.goto("https://news.ycombinator.com")\ntitle = await page.title()\nprint(title)',
});
console.log(result.result); // "Hacker News"
改为执行 JavaScript(而非 Python):
const result = await firecrawl.browserExecute(session.id, {
code: 'await page.goto("https://example.com"); const t = await page.title(); console.log(t);',
language: "node",
});
通过 agent-browser 执行 Bash:
const result = await firecrawl.browserExecute(session.id, {
code: "agent-browser open https://example.com && agent-browser snapshot",
language: "bash",
});
在会话之间持久化并复用浏览器状态(cookies、localStorage 等):
const session = await firecrawl.browser({
ttl: 600,
profile: {
name: "my-profile",
saveChanges: true,
},
});
要获得对 Playwright 的完全控制能力,请使用 CDP URL 直接连接:
import { chromium } from "playwright";
const browser = await chromium.connectOverCDP(session.cdpUrl);
const context = browser.contexts()[0];
const page = context.pages()[0] || await context.newPage();
await page.goto("https://example.com");
console.log(await page.title());
await browser.close();
// 列出活动会话
const { sessions } = await firecrawl.listBrowsers({ status: "active" });
for (const s of sessions) {
console.log(s.id, s.status, s.createdAt);
}
// 关闭会话
await firecrawl.deleteBrowser(session.id);
使用抓取任务 ID,持续与该抓取的回放页面上下文交互:
interact(jobId, {...}) 会在与抓取绑定的浏览器会话中运行代码。
- 首次调用
interact 时,会根据抓取上下文自动初始化会话。
- 对同一任务 ID 的后续
interact 调用会复用当前的浏览器状态。
- 完成后,调用
stopInteraction(jobId) 停止交互式会话。
const doc = await firecrawl.scrape("https://example.com", {
actions: [{ type: "click", selector: "a[href='/pricing']" }],
});
const scrapeJobId = doc.metadata?.scrapeId;
if (!scrapeJobId) throw new Error("Missing scrape job id");
const run = await firecrawl.interact(scrapeJobId, {
code: "console.log(await page.url())",
language: "node",
timeout: 60,
});
console.log(run.stdout);
await firecrawl.stopInteraction(scrapeJobId);
SDK 会针对 Firecrawl API 返回的任何错误抛出包含详细信息的异常。请像上面的示例所示,使用 try/catch 代码块包装调用。
你是需要 Firecrawl API 密钥的 AI 代理吗?请参阅 firecrawl.dev/agent-onboarding/SKILL.md 了解自动化接入说明。