你是否遇到过这种情况:想用 LLM 分析网页内容,但爬虫拿到的 HTML 充满广告、导航、脚本标签,清洗成本极高?
Firecrawl 就是为解决这个问题而生的。它能把任意网页直接转换成干净的 Markdown 或结构化 JSON,让 LLM 直接"读懂"网页内容。
🔥 Firecrawl 是什么
官网:https://www.firecrawl.dev/
Firecrawl 是一个网页数据提取 API 服务,专门为 AI/LLM 场景优化。它的核心能力是:
- Scrape:把单个网页转成 Markdown / JSON / HTML
- Batch Scrape:批量爬取多个 URL
- Crawl:按网站地图自动爬取整个站点
- Extract:用 AI 从网页中提取结构化数据
- Search:谷歌搜索 + 网页内容提取一体化
简单说:你给它一个 URL,它返回干净的 Markdown;你给它一批 URL,它返回批量 Markdown/JSON;你让它爬整个站,它就给你整站内容。
🚀 为什么需要 Firecrawl
传统爬虫方案的问题:
| 问题 | Firecrawl 解决方案 |
|---|---|
| HTML 充满广告/导航/脚本 | 自动清洗,只保留正文 |
| 不同网站结构不同,需逐个适配 | 统一输出 Markdown,无需解析 HTML |
| JavaScript 渲染的页面拿不到内容 | 内置无头浏览器,支持 JS 渲染 |
| 批量爬取需自己写调度 | 提供 Batch API,并发控制、重试、去重全搞定 |
| 反爬封 IP | 提供代理池、浏览器指纹、速率限制 |
| 提取结构化数据困难 | 用 AI 自动提取指定字段 |
📦 注册与安装
1. 注册账号
- 打开 https://www.firecrawl.dev/
- 点击 Sign Up,支持 GitHub/Google 邮箱注册
- 注册后进入 Dashboard,复制你的 API Key
2. 安装 Python SDK
pip install firecrawl-py
3. 环境变量配置
export FIRECRAWL_API_KEY="fc-your-api-key-here"
或写入 .env 文件:
FIRECRAWL_API_KEY=fc-your-api-key-here
🎯 核心功能详解
1. 单页爬取(Scrape)
把单个网页转为 Markdown:
from firecrawl import Firecrawl
app = Firecrawl(api_key="fc-your-api-key")
result = app.scrape(
url="https://example.com",
formats=["markdown"]
)
print(result.markdown)
支持的输出格式:
markdown:干净的 Markdown 文本html:原始 HTMLjson:结构化 JSONscreenshot:页面截图links:页面中的所有链接
2. 批量爬取(Batch Scrape)
一次爬取多个 URL:
result = app.batch_scrape(
urls=[
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3"
],
formats=["markdown"],
only_main_content=True # 只保留正文
)
# 获取结果
status = result.get_status()
while status != "completed":
status = result.get_status()
time.sleep(2)
data = result.get_results()
for doc in data:
print(doc.markdown)
3. 网站地图爬取(Crawl)
自动爬取整个网站:
crawl = app.crawl(
url="https://docs.example.com",
max_depth=3, # 爬取深度
max_pages=100, # 最大页数
formats=["markdown"]
)
# 等待完成
while crawl.get_status() != "completed":
time.sleep(2)
pages = crawl.get_pages()
for page in pages:
print(page.url, page.markdown[:100])
4. 结构化数据提取(Extract)
用 AI 从网页中提取指定字段:
result = app.extract(
urls=["https://example.com/product/123"],
prompt="提取产品名称、价格、描述、评分",
schema={
"name": "产品名称",
"price": "价格(数字)",
"description": "产品描述",
"rating": "评分(1-5)"
}
)
data = result.get_data()
print(data)
5. 搜索 + 爬取(Search)
先谷歌搜索,再提取内容:
results = app.search(
query="Firecrawl tutorial",
num_results=5
)
for result in results:
print(result.title, result.url)
🛠 实际应用场景
场景 1:构建知识库
from firecrawl import Firecrawl
import time
app = Firecrawl(api_key="fc-your-api-key")
# 爬取文档站
crawl = app.crawl(
url="https://docs.python.org/3/",
max_depth=2,
max_pages=50,
formats=["markdown"]
)
# 保存到本地
while crawl.get_status() != "completed":
time.sleep(2)
for page in crawl.get_pages():
filename = page.url.replace("https://", "").replace("/", "_") + ".md"
with open(f"./knowledge_base/{filename}", "w") as f:
f.write(page.markdown)
场景 2:制作 LLM 训练数据集
import json
app = Firecrawl(api_key="fc-your-api-key")
urls = [
"https://blog.example.com/ai-article-1",
"https://blog.example.com/ai-article-2",
# ... 更多 URL
]
result = app.batch_scrape(
urls=urls,
formats=["markdown"],
only_main_content=True
)
# 导出为 JSONL 格式(LLM 训练常用)
with open("training_data.jsonl", "w") as f:
for doc in result.get_results():
record = {
"url": doc.url,
"content": doc.markdown,
"metadata": doc.metadata
}
f.write(json.dumps(record) + "\n")
场景 3:竞品监控
from firecrawl import Firecrawl
app = Firecrawl(api_key="fc-your-api-key")
# 监控竞争对手博客更新
competitors = [
"https://competitor-a.com/blog",
"https://competitor-b.com/blog"
]
for url in competitors:
result = app.scrape(url, formats=["markdown"])
# 提取最新文章标题
latest_title = result.markdown.split("\n")[0]
print(f"{url}: {latest_title}")
💰 定价
Firecrawl 提供免费额度,适合个人开发者和小团队:
| 套餐 | 价格 | 额度 | 适用场景 |
|---|---|---|---|
| Free | $0/月 | 500 次请求/月 | 个人测试、小项目 |
| Hobby | $19/月 | 10,000 次请求/月 | 个人项目、轻度使用 |
| Pro | $99/月 | 100,000 次请求/月 | 团队项目、生产环境 |
| Enterprise | 定制 | 无限 | 企业级需求 |
计费规则:
- 1 个 URL = 1 次请求
- Batch Scrape 和 Crawl 按实际爬取的页面数计费
- 免费版包含基础功能,付费版解锁更高并发和高级功能
⚡ 优缺点对比
优点
| 优势 | 说明 |
|---|---|
| 开箱即用 | 无需配置 Scrapy/Selenium,几行代码搞定 |
| LLM 友好 | 直接输出 Markdown,省去 HTML 清洗 |
| JS 渲染 | 内置无头浏览器,支持 React/Vue 等 SPA 站点 |
| 结构化提取 | 用 AI 自动提取指定字段,无需写 XPath/CSS 选择器 |
| 批量处理 | 支持批量爬取和全站爬取,自带并发控制 |
| 代理支持 | 内置代理池,降低被封风险 |
缺点
| 劣势 | 说明 |
|---|---|
| 成本 | 大规模爬取时,API 费用高于自建爬虫 |
| 灵活性 | 自定义爬取逻辑不如 Scrapy 灵活 |
| 依赖网络 | 需要访问 Firecrawl 服务器,内网环境受限 |
| 数据隐私 | 网页内容会经过第三方服务器 |
🆚 竞品对比
| 工具 | 类型 | LLM 友好 | 成本 | 适用场景 |
|---|---|---|---|---|
| Firecrawl | API 服务 | ✅ 原生 Markdown | 按量付费 | AI 数据集、知识库 |
| Scrapy | 开源框架 | ❌ 需自己清洗 | 免费 | 大规模定制爬虫 |
| Beautiful Soup | 库 | ❌ 需自己解析 | 免费 | 小规模简单爬取 |
| Apify | API 服务 | ⚠️ 部分支持 | 按量付费 | 通用爬虫、自动化 |
| Diffbot | API 服务 | ✅ 结构化数据 | 昂贵 | 企业级数据提取 |
📝 最佳实践
1. 合理设置延迟
import time
# 批量爬取时添加延迟,避免被封
for url in urls:
result = app.scrape(url, formats=["markdown"])
time.sleep(1) # 每秒请求一次
2. 使用 only_main_content
# 只保留正文,去掉导航、页脚、侧边栏
result = app.scrape(
url="https://blog.example.com/post",
formats=["markdown"],
only_main_content=True
)
3. 错误处理
from firecrawl import Firecrawl
import time
app = Firecrawl(api_key="fc-your-api-key")
max_retries = 3
for attempt in range(max_retries):
try:
result = app.scrape(url, formats=["markdown"])
break
except Exception as e:
if attempt < max_retries - 1:
time.sleep(2 ** attempt) # 指数退避
else:
print(f"Failed after {max_retries} attempts")
4. 缓存结果
import hashlib
import json
def get_cached_content(url):
cache_key = hashlib.md5(url.encode()).hexdigest()
cache_file = f"./cache/{cache_key}.json"
try:
with open(cache_file) as f:
return json.load(f)
except FileNotFoundError:
result = app.scrape(url, formats=["markdown"])
with open(cache_file, "w") as f:
json.dump({"markdown": result.markdown}, f)
return result
❓ 常见问题
Q:Firecrawl 免费吗?
A:有免费额度(500 次/月),超出后需付费。个人开发者轻度使用通常够用。
Q:支持 JavaScript 渲染的页面吗?
A:支持。Firecrawl 内置无头浏览器,能处理 React、Vue、Angular 等 SPA 站点。
Q:爬取速度有多快?
A:单页约 2-5 秒,Batch Scrape 支持并发,100 个页面约 1-2 分钟。
Q:会不会被封 IP?
A:Firecrawl 会处理反爬,但高频爬取仍可能触发目标网站防护,建议合理设置延迟。
Q:数据存储在哪里?
A:免费版数据保留 24 小时,付费版保留 30 天。建议及时导出保存。
Q:支持代理吗?
A:支持。可以在 SDK 中配置代理参数,或使用 Firecrawl 的代理池服务。
🏆 总结
Firecrawl 是构建 AI 知识库和训练数据集的利器。它把"爬网页"这个传统脏活,变成了几行代码的优雅操作。
特别适合以下场景:
- 🤖 AI 知识库:爬取文档站、博客,构建 RAG 知识库
- 📊 训练数据集:批量提取网页内容,制作 LLM 微调数据
- 🔍 竞品监控:自动追踪竞争对手网站更新
- 📰 内容聚合:从多个来源聚合内容,生成新闻简报
- 🧹 数据清洗:将杂乱的 HTML 转为干净的 Markdown
如果你经常需要用 LLM 处理网页内容,Firecrawl 能帮你省掉 80% 的清洗工作量。
官网:https://www.firecrawl.dev/
GitHub:https://github.com/mendableai/firecrawl
文档:https://docs.firecrawl.dev/
定价:https://www.firecrawl.dev/pricing