Firecrawl 高效爬取网站,在绕过风控的同时提取全面数据。流程如下:
- URL 分析: 扫描站点地图并爬取网站以识别链接
- 遍历: 递归跟随链接,发现所有子页面
- 抓取: 从各页面提取内容,处理 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、缓存、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
}
});
如果你使用 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 文档首页!...",
"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)
# Check the status of the crawl
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.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,在爬取过程中实时接收通知。这样即可在页面被抓取后立刻处理,无需等待整个爬取任务完成。
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
}