你有没有过这种经历——
想搭一个 RAG 知识库,让 AI 回答公司官网上的问题。结果一抓网页,全是 <div class="nav-item"> 这种 HTML 标签,夹杂着广告代码、导航栏、Cookie 弹窗、页脚链接……AI 读起来就像你读一封每句话都夹着乱码的信。
要么就是页面是 JavaScript 动态渲染的,传统爬虫抓下来一片空白。
更惨的是,几百个页面要处理,总不能手动一个个复制粘贴吧?
今天介绍的 Firecrawl,就是来终结这一切的。
一、Firecrawl 是什么?
一句话说清楚:Firecrawl 是一个把网页内容变成 AI 可读数据的爬取工具。
它解决的问题很聚焦——传统爬虫抓回来的是 HTML,而大模型需要的是干净的文本。中间这个"清洗"步骤,Firecrawl 帮你一步到位。
核心能力拆成三个关键词:
| Scrape(抓取) | ||
| Crawl(爬取) | ||
| Extract(提取) |
此外还有几个进阶能力:
- Map:
输入一个网站,极速获取该网站的所有 URL 列表 - Search:
搜索网络 + 抓取搜索结果,一步到位 - Interact:
在页面上模拟点击、填表、滚动等操作后再抓取
它和传统爬虫最大的区别:输出直接就是 LLM-Ready 的。 你不需要写正则去清洗数据,不需要处理编码问题,不需要自己搭浏览器集群处理 JS 渲染——Firecrawl 全帮你搞定了。
二、安装与配置:5 分钟搞定
2.1 注册获取 API Key
打开 https://www.firecrawl.dev,点击「Get Started Free」注册账号(支持 GitHub / Google 登录) 登录后进入 Dashboard,在左侧菜单找到「API Keys」 复制你的 API Key,格式类似: fc-xxxxxxxxxxxxxxxx
💡 免费额度:注册即送 1,000 积分/月,1 个页面消耗 1 积分,够你免费处理 1,000 个页面。不需要信用卡。
⚠️ 常见坑 #1:API Key 只在创建时显示一次,务必复制保存!丢了就得重新生成。
2.2 安装 Python SDK
# 推荐:在虚拟环境中安装
python -m venv firecrawl-env
source firecrawl-env/bin/activate # Windows 用 firecrawl-env\Scripts\activate
# 安装 Firecrawl Python SDK
pip install firecrawl-py
⚠️ 常见坑 #2:包名是 firecrawl-py,不是 firecrawl!装错包会报 ModuleNotFoundError。
2.3 验证安装
from firecrawl import Firecrawl
# 初始化客户端,填入你的 API Key
firecrawl = Firecrawl(api_key="fc-YOUR-API-KEY")
# 快速测试:抓取一个网页
result = firecrawl.scrape("https://firecrawl.dev", formats=["markdown"])
print(result.markdown[:200]) # 打印前200个字符看看
如果输出了一段干净的 Markdown 文本,恭喜你,环境搞定了!🎉
三、实战案例 1:爬取单个网页并转为 Markdown
这是最常用的场景——你有一篇文章或文档页面,想把它转成干净的 Markdown 喂给 AI。
from firecrawl import Firecrawl
firecrawl = Firecrawl(api_key="fc-YOUR-API-KEY")
# 抓取单个网页,指定输出格式
doc = firecrawl.scrape(
url="https://docs.firecrawl.dev",
formats=["markdown", "html"] # 可以同时获取多种格式
)
# 获取 Markdown 内容
print(doc.markdown)
# 获取元数据(标题、描述、语言等)
print(doc.metadata.title) # 页面标题
print(doc.metadata.description) # 页面描述
print(doc.metadata.language) # 页面语言
就这么简单。一行 scrape() 调用,杂乱 HTML 变成了干净的 Markdown。
常用参数速查
formats | ["markdown"]["markdown", "html"]、["screenshot"] | |
only_main_content | True | |
timeout | 3000060000 | |
proxy | "auto" |
# 推荐配置:只提取正文内容,跳过导航栏和页脚
doc = firecrawl.scrape(
url="https://example.com/blog/post-1",
formats=["markdown"],
only_main_content=True# 关键参数!过滤掉导航栏、页脚、侧边栏等噪音
)
⚠️ 常见坑 #3:有些网页的内容全部由 JavaScript 渲染,如果你发现 doc.markdown 返回的内容很少或为空,试试去掉 only_main_content=True,或者增加 timeout 时间让页面完全加载。
四、实战案例 2:批量爬取网站并构建知识库
单个页面不够用?Firecrawl 的 Crawl 功能可以递归爬取整个网站——你只需要给它一个入口 URL,它自动发现所有子页面。
from firecrawl import Firecrawl
from firecrawl.types import ScrapeOptions
firecrawl = Firecrawl(api_key="fc-YOUR-API-KEY")
# 爬取整个网站的文档页面
crawl_result = firecrawl.crawl(
url="https://docs.firecrawl.dev",
limit=50, # 最多爬取50个页面(防止跑飞了消耗太多积分)
scrape_options=ScrapeOptions(
formats=["markdown"],
only_main_content=True# 每个页面只提取正文
),
poll_interval=30# 每30秒检查一次进度
)
# 遍历所有爬取到的页面
for doc in crawl_result.data:
print(f"页面: {doc.metadata.source_url}")
print(f"内容预览: {doc.markdown[:100]}...")
print("---")
print(f"共爬取 {len(crawl_result.data)} 个页面")
精确控制爬取范围
很多时候你不需要整站,只要特定板块。用 include_paths 和 exclude_paths 精准控制:
# 只爬取文档目录,排除 API 参考页面
crawl_result = firecrawl.crawl(
url="https://example.com/docs/",
limit=100,
scrape_options=ScrapeOptions(formats=["markdown"]),
include_paths=["/docs/.*"], # 只包含 /docs/ 开头的路径
exclude_paths=["/docs/api/.*"] # 排除 /docs/api/ 下的页面
)
异步爬取:大规模任务的正确姿势
如果你的目标网站有几百上千个页面,同步爬取会让脚本卡住很久。用异步模式更靠谱:
# 第一步:启动异步爬取任务
job = firecrawl.start_crawl(url="https://example.com", limit=200)
print(f"任务已启动,Job ID: {job.id}")
# 第二步:轮询检查状态(可以放到定时任务里)
import time
whileTrue:
status = firecrawl.get_crawl_status(job.id)
print(f"当前状态: {status.status}, 已完成: {status.completed}/{status.total}")
if status.status == "completed":
for doc in status.data:
print(doc.metadata.source_url)
break
elif status.status == "failed":
print("爬取失败!")
break
time.sleep(30) # 每30秒检查一次
⚠️ 常见坑 #4:limit 参数一定要设!不然爬一个大站可能会消耗掉你所有积分。建议先用 Map 功能看看网站有多少页面,再决定 limit。
# 先用 Map 查看网站规模
url_list = firecrawl.map("https://example.com")
print(f"网站共有 {len(url_list)} 个可访问页面")
五、与 RAG 系统集成:让 AI 真正读懂网站
Firecrawl 的输出天然适合喂给 RAG 系统。下面展示两个主流集成方案。
5.1 方案一:结合 LangChain 构建问答系统
LangChain 内置了 FireCrawlLoader,集成非常丝滑:
# 安装依赖
pip install langchain-community firecrawl-py langchain-openai chromadb
from langchain_community.document_loaders import FireCrawlLoader
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
# ====== 第一步:用 FireCrawlLoader 加载网站内容 ======
loader = FireCrawlLoader(
api_key="fc-YOUR-API-KEY",
url="https://docs.firecrawl.dev",
mode="crawl"# 支持 scrape / crawl / map 三种模式
)
docs = loader.load()
print(f"共加载 {len(docs)} 个页面")
# ====== 第二步:切分文档(RAG 的标准步骤) ======
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 每个文本块1000字符
chunk_overlap=200# 块之间重叠200字符,防止语义断裂
)
chunks = text_splitter.split_documents(docs)
print(f"切分为 {len(chunks)} 个文本块")
# ====== 第三步:构建向量数据库 ======
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./firecrawl_db"# 持久化存储
)
# ====== 第四步:构建 RAG 问答链 ======
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o-mini", temperature=0),
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k":3})
)
# ====== 第五步:提问! ======
answer = qa_chain.run("Firecrawl 的 Extract 功能是什么?怎么用?")
print(answer)
整个流程就是:Firecrawl 抓网页 → LangChain 切分+向量化 → LLM 问答,一条龙搞定。
5.2 方案二:结合 Dify 搭建知识库助手
如果你用 Dify 搭建 AI 应用(不需要写代码),思路如下:
- 用 Firecrawl 批量爬取目标网站:
运行上面的 Crawl 脚本,把结果保存为 Markdown 文件 - 上传到 Dify 知识库:
在 Dify 的「知识库」模块中,批量上传这些 Markdown 文件 - 创建聊天助手:
在 Dify 中新建一个聊天助手应用,关联刚才创建的知识库 - 测试对话:
直接在 Dify 界面中测试问答效果
如果你想更自动化,还可以在 Dify 的「工作流」中添加 HTTP 请求节点,直接调用 Firecrawl API,实现"定时更新知识库"的自动化流程。
六、API 使用与高级功能
6.1 结构化数据提取(Extract)
这是 Firecrawl 最强大的功能——不用写正则,用自然语言 + Schema 告诉 AI 你要什么数据,它自动提取。
from firecrawl import Firecrawl
from pydantic import BaseModel
firecrawl = Firecrawl(api_key="fc-YOUR-API-KEY")
# 用 Pydantic 定义你要提取的数据结构
classProductInfo(BaseModel):
name: str# 产品名称
price: str# 价格
features: list[str] # 特性列表
rating: str# 评分
# 在 scrape 中使用 JSON 格式提取
result = firecrawl.scrape(
url="https://www.example.com/product/123",
formats=[{
"type":"json",
"schema": ProductInfo.model_json_schema()
}],
only_main_content=False,
timeout=120000
)
print(result)
# 输出示例:
# {'name': 'iPhone 16 Pro Max', 'price': '$1,199',
# 'features': ['A18 Pro芯片', '4800万像素', '钛金属设计'], 'rating': '4.8/5'}
甚至可以不提供 Schema,直接用 prompt 描述你要什么:
result = firecrawl.scrape(
url="https://firecrawl.dev",
formats=[{
"type":"json",
"prompt":"提取公司的使命宣言和核心产品功能列表"
}],
only_main_content=False,
timeout=120000
)
6.2 处理 JavaScript 动态页面
Firecrawl 内置了 Chromium 浏览器引擎,JS 渲染页面默认就能处理。如果页面需要交互(比如点击"加载更多"),可以用 actions 参数:
# 在抓取前模拟用户操作:点击按钮、等待加载
doc = firecrawl.scrape(
url="https://example.com/interactive-page",
formats=["markdown"],
actions=[
{"type":"click", "selector":'button.load-more'},
{"type":"wait", "milliseconds":2000}, # 等待2秒让内容加载
{"type":"scroll", "direction":"down", "amount":500},
],
)
6.3 搜索功能
# 搜索网络并直接获取结果
results = firecrawl.search(
query="Firecrawl RAG tutorial",
limit=5# 返回5条结果
)
for result in results:
print(f"标题: {result.title}")
print(f"链接: {result.url}")
print(f"摘要: {result.snippet}")
七、与同类工具对比:Firecrawl vs Scrapy vs Jina Reader
| 定位 | |||
| 输出格式 | |||
| 动态页面 | |||
| 结构化提取 | |||
| 全站爬取 | |||
| 反爬处理 | |||
| 免费额度 | |||
| 学习成本 | |||
| 开源协议 |
一句话选型:
🏆 想快速搭 RAG 知识库 + 需要结构化提取 → 选 Firecrawl,开箱即用,全站爬取+提取一站式搞定 ⚡ 只提取几个页面的关键信息,追求最快上手 → Jina Reader,URL 前加 https://r.jina.ai/前缀就行🔧 需要完全定制化的大规模爬虫 → Scrapy 是老牌王者,但学习成本高,更适合专业爬虫工程师
八、适用场景与局限
适合你用的场景
✅ 搭建 RAG 知识库,需要批量处理网页内容 ✅ 从多个页面提取结构化数据(产品价格、公司信息、文章摘要等) ✅ 需要处理 JS 动态渲染的页面 ✅ 快速原型开发,不想花时间在数据清洗上
需要注意的局限
❌ 单次 API 只能处理1个URL,批量处理需要用 Crawl 或循环调用 ❌ 免费版并发限制为2,大规模爬取需要升级付费版(Standard 版 $83/月,100 并发) ❌ 积分按月清零,不累积到下月 ❌ 超大规模爬取(10万+页面) 成本较高,可能自建方案更经济 ❌ 极端反爬网站(需要登录+验证码的)可能仍然搞不定
九、总结
Firecrawl 的核心价值就一句话:让你从"处理网页格式"的苦力活中解放出来,专注于 AI 应用本身。
它最适合这三类人:
- AI 应用开发者:
需要把网页内容喂给 RAG 系统,不想花时间清洗数据 - 数据分析师:
需要从多个网页提取结构化信息(价格、参数、评论等) - 自动化爱好者:
想用最低成本搭建"AI 读网页"的工作流
免费 1,000 积分/月完全够你跑通全流程、验证效果。如果你正在搭建 RAG 知识库,Firecrawl + LangChain 这个组合,真的可以做到半小时从零到可用。
别再手动复制网页了,让 Firecrawl 帮你搞定吧 🔥
夜雨聆风