Firecrawl 高效爬取网站,绕过拦截提取全面数据。流程如下:
- URL 分析: 扫描 sitemap 并爬取网站以识别链接
- 遍历: 递归跟随链接以发现所有子页面
- 抓取: 从各页面提取内容,处理 JS 与速率限制
- 输出: 将数据转换为干净的 Markdown 或结构化格式
确保可从任意起始 URL 全面采集数据。
用于抓取某个 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)
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,
},
});
如果你使用 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 文档首页!...",
"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 有两种方式:
- 抓取并等待(
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
}
),
...
]
- 启动后轮询状态(
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)
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,在爬取过程中实时接收通知。这样就能在页面被抓取后即时处理,而无需等待整个爬取任务完成。
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
}