你是否遇到过这种情况:想用 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. 注册账号

  1. 打开 https://www.firecrawl.dev/
  2. 点击 Sign Up,支持 GitHub/Google 邮箱注册
  3. 注册后进入 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:原始 HTML
  • json:结构化 JSON
  • screenshot:页面截图
  • 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 友好成本适用场景
FirecrawlAPI 服务✅ 原生 Markdown按量付费AI 数据集、知识库
Scrapy开源框架❌ 需自己清洗免费大规模定制爬虫
Beautiful Soup❌ 需自己解析免费小规模简单爬取
ApifyAPI 服务⚠️ 部分支持按量付费通用爬虫、自动化
DiffbotAPI 服务✅ 结构化数据昂贵企业级数据提取

📝 最佳实践

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