在大模型训练与数据分析领域,“高质量数据获取” 始终是核心痛点 —— 传统爬虫要么难以处理动态渲染页面,要么提取的数据格式混乱,无法直接用于 AI 训练。而 GitHub 上星数突破 11.9K 的 FireCrawl,凭借 “智能页面解析、结构化输出、抗反爬能力强” 三大优势,成为程序员获取 AI 训练数据的首选工具。本文从实战角度出发,通过完整代码示例,拆解 FireCrawl 的环境搭建、AI 数据提取优化及工程化落地全流程,助你快速掌握从 “数据爬取” 到 “AI 可用” 的全链路技术。

环境搭建与基础爬取:快速上手核心功能

FireCrawl 的核心优势在于 “低门槛、高适配”—— 无需深入研究爬虫原理,通过其 Python SDK 即可快速实现对静态页面、动态 SPA(单页应用)及需要登录的页面爬取。作为程序员,第一步需完成环境配置与基础 API 调用,建立对工具的初步认知。

1. 环境配置与 API 密钥获取

FireCrawl 提供开源自部署与云服务两种模式,新手推荐先使用云服务快速验证功能,后续再根据需求部署私有实例。


# 1. 安装FireCrawl Python SDK

pip install firecrawl-py

# 2. 从FireCrawl官网获取API密钥(https://firecrawl.dev/)

# 注册账号后,在控制台创建API Key,用于鉴权

2. 基础页面爬取与数据提取

通过 FireCrawl SDK,仅需 3 行核心代码即可完成单页面爬取,并自动提取结构化数据(标题、正文、图片、链接等),无需手动编写 XPath 或 CSS 选择器。


from firecrawl import FirecrawlApp

def basic_page_crawl(url: str, api_key: str) -> dict:

"""

基础页面爬取:获取页面结构化数据

:param url: 目标页面URL

:param api_key: FireCrawl API密钥

:return: 结构化爬取结果

"""

# 1. 初始化FireCrawl客户端

app = FirecrawlApp(api_key=api_key)

# 2. 爬取目标页面(crawl方法自动处理动态渲染、JS加载)

# mode="single"表示爬取单个页面,"scrape"仅提取内容不跟进链接

result = app.crawl(

url=url,

mode="single", # 可选:single(单页)、site(整站)、scrape(仅提取)

params={

"extractors": {

"title": True, # 提取页面标题

"body": True, # 提取正文内容(自动过滤广告、导航)

"images": True, # 提取图片URL

"links": True # 提取页面内链接

},

"skipLinks": False # 是否跳过页面内链接爬取

}

)

# 3. 输出爬取结果(结构化字典格式,可直接转为JSON)

print("页面标题:", result["metadata"]["title"])

print("正文前500字符:", result["content"]["body"][:500])

print("提取图片数量:", len(result["content"]["images"]))

return result

# 测试基础爬取(以AI技术博客为例,适合作为大模型训练语料)

if __name__ == "__main__":

API_KEY = "你的FireCrawl API Key"

TARGET_URL = "https://example.com/ai-llm-research" # 目标AI技术文章URL

crawl_result = basic_page_crawl(TARGET_URL, API_KEY)

# 保存结果到JSON文件(后续可用于AI数据预处理)

import json

with open("crawl_result.json", "w", encoding="utf-8") as f:

json.dump(crawl_result, f, ensure_ascii=False, indent=2)

3. 动态页面与登录态爬取

针对需要 JavaScript 渲染的动态页面(如 React/Vue 构建的博客)或需要登录的后台页面,FireCrawl 可通过配置headless浏览器与 Cookie 实现爬取,无需手动处理 JS 执行与会话保持。


def dynamic_page_crawl(url: str, api_key: str, cookies: list = None) -> dict:

"""

动态页面与登录态爬取:处理JS渲染与登录验证

:param cookies: 登录后的Cookie列表(格式:[{"name": "xxx", "value": "xxx", "domain": "xxx"}])

"""

app = FirecrawlApp(api_key=api_key)

# 配置参数:启用headless浏览器,传递登录Cookie

crawl_params = {

"extractors": {"title": True, "body": True},

"browserConfig": {

"headless": True, # 启用无头浏览器(模拟真实浏览器环境)

"waitForLoad": 3000, # 等待页面加载时间(毫秒)

"cookies": cookies # 传递登录Cookie,获取登录后内容

}

}

# 爬取需要登录的AI训练数据后台(如内部技术文档库)

result = app.crawl(url=url, mode="single", params=crawl_params)

return result

# 示例:爬取登录后的技术文档页面

if __name__ == "__main__":

# 从浏览器开发者工具(Application->Cookies)复制登录Cookie

LOGIN_COOKIES = [

{"name": "session_id", "value": "your_session_value", "domain": "docs.example.com"}

]

TARGET_LOGIN_URL = "https://docs.example.com/internal-ai-docs"

dynamic_result = dynamic_page_crawl(TARGET_LOGIN_URL, API_KEY, LOGIN_COOKIES)

AI 训练数据提取优化:从 “爬取” 到 “可用”

FireCrawl 区别于传统爬虫的核心优势,在于其针对 AI 训练场景的 “数据优化能力”—— 自动清洗冗余信息、按内容类型分类、支持自定义结构化输出,让爬取的数据无需复杂预处理即可直接用于大模型微调或 RAG 知识库构建。

1. 内容清洗与噪音过滤

AI 训练数据需避免包含广告、导航、无关评论等噪音,FireCrawl 通过内置的contentFilter参数可一键过滤无效内容,保留核心文本。


def ai_data_cleaning(url: str, api_key: str) -> dict:

"""

AI训练数据清洗:过滤噪音内容,保留核心文本

"""

app = FirecrawlApp(api_key=api_key)

crawl_params = {

"extractors": {"body": True, "title": True},

"contentFilter": {

"excludeSelectors": [ # 按CSS选择器排除噪音区域

".ad-container", # 广告容器

".comment-section", # 评论区

".footer-nav", # 底部导航

".sidebar" # 侧边栏

],

"minWordCount": 200 # 过滤字数少于200的短文本(避免无效内容)

},

"formatOutput": "markdown" # 输出格式:markdown(适合LLM训练)

}

# 爬取AI论文页面,清洗后作为训练语料

result = app.crawl(url=url, mode="single", params=crawl_params)

# 清洗后的内容可直接用于大模型训练(如写入文本文件)

cleaned_content = f"# {result['metadata']['title']}\n\n{result['content']['body']}"

with open("ai_paper_cleaned.md", "w", encoding="utf-8") as f:

f.write(cleaned_content)

print("清洗后文本长度:", len(cleaned_content))

print("清洗后内容预览:", cleaned_content[:300])

return result

# 测试:爬取arXiv上的LLM论文并清洗

if __name__ == "__main__":

PAPER_URL = "https://arxiv.org/abs/2310.11454" # LLaMA 2论文URL

ai_data_cleaning(PAPER_URL, API_KEY)

2. 自定义结构化提取(适配 AI 数据格式)

针对特定 AI 场景(如多轮对话训练、表格数据挖掘),可通过 FireCrawl 的customExtractors定义结构化输出格式,让数据直接符合训练要求(如 JSON Lines 格式)。


def custom_ai_extraction(url: str, api_key: str) -> list:

"""

自定义结构化提取:按AI训练需求提取特定字段(如对话数据、表格数据)

"""

app = FirecrawlApp(api_key=api_key)

# 定义自定义提取规则:提取技术问答页面中的"问题-答案"对(用于对话模型训练)

crawl_params = {

"customExtractors": {

"qa_pairs": { # 自定义字段:问答对列表

"selector": ".qa-item", # 每个问答对的CSS选择器

"fields": {

"question": { # 问题字段

"selector": ".qa-question",

"type": "text" # 提取文本内容

},

"answer": { # 答案字段

"selector": ".qa-answer",

"type": "text"

},

"tags": { # 标签字段(用于分类训练)

"selector": ".qa-tag",

"type": "text",

"multiple": True # 支持多标签提取

}

}

}

},

"formatOutput": "json"

}

# 爬取AI技术问答页面,提取"问题-答案"对(用于训练对话模型)

result = app.crawl(url=url, mode="single", params=crawl_params)

qa_pairs = result["content"]["custom"]["qa_pairs"]

# 转换为JSON Lines格式(大模型对话训练常用格式)

jsonl_content = ""

for pair in qa_pairs:

jsonl_line = json.dumps({

"instruction": pair["question"],

"output": pair["answer"],

"categories": pair["tags"]

}, ensure_ascii=False)

jsonl_content += jsonl_line + "\n"

# 保存为JSON Lines文件(可直接用于LLaMA、ChatGLM等模型微调)

with open("ai_qa_train.jsonl", "w", encoding="utf-8") as f:

f.write(jsonl_content)

print(f"提取问答对数量: {len(qa_pairs)}")

print("示例问答对:", qa_pairs[0])

return qa_pairs

# 测试:爬取AI技术问答论坛,提取对话训练数据

if __name__ == "__main__":

QA_FORUM_URL = "https://example.com/ai-qa-forum"

custom_ai_extraction(QA_FORUM_URL, API_KEY)

3. 批量爬取与去重(构建大规模数据集)

大模型训练需要海量数据,FireCrawl 支持整站批量爬取,并通过deduplication参数自动去重(基于内容哈希),避免重复数据影响训练效果。


def batch_crawl_ai_corpus(start_url: str, api_key: str, max_pages: int = 50) -> None:

"""

批量爬取AI语料:整站爬取技术文章,去重后构建大规模训练数据集

:param max_pages: 最大爬取页面数(控制数据规模)

"""

app = FirecrawlApp(api_key=api_key)

# 配置整站爬取参数

crawl_params = {

"extractors": {"title": True, "body": True, "publishDate": True},

"contentFilter": {

"excludeSelectors": [".ad", ".comment"],

"includePatterns": ["/ai/", "/llm/", "/machine-learning/"] # 仅爬取AI相关路径

},

"deduplication": {

"enabled": True, # 启用内容去重

"field": "body" # 基于正文内容哈希去重

},

"limit": max_pages, # 限制最大爬取页面数

"formatOutput": "markdown"

}

# 启动整站爬取(异步执行,通过回调获取结果)

def crawl_callback(status: str, data: dict):

"""爬取回调函数:处理单页结果并写入文件"""

if status == "success" and data.get("content", {}).get("body"):

# 按发布日期分类存储(便于后续按时间筛选训练数据)

publish_date = data["metadata"].get("publishDate", "unknown-date")

date_dir = f"ai_corpus/{publish_date[:4]}-{publish_date[5:7]}"

os.makedirs(date_dir, exist_ok=True)

# 生成文件名(基于URL哈希,避免重复)

file_name = hashlib.md5(data["metadata"]["url"].encode()).hexdigest() + ".md"

file_path = os.path.join(date_dir, file_name)

# 写入文件

with open(file_path, "w", encoding="utf-8") as f:

f.write(f"# {data['metadata']['title']}\n\n")

f.write(f"发布时间: {publish_date}\n\n")

f.write(data["content"]["body"])

print(f"已保存: {file_path}")

# 启动整站爬取(后台执行,通过回调处理结果)

app.crawl(

url=start_url,

mode="site", # 整站爬取模式

params=crawl_params,

callback=crawl_callback

)

print(f"整站爬取启动,最大爬取{max_pages}页,结果将自动保存到ai_corpus目录")

# 测试:批量爬取AI技术博客,构建训练语料库

if __name__ == "__main__":

import os

import hashlib

BLOG_START_URL = "https://example.com/ai-blog" # 博客首页URL

batch_crawl_ai_corpus(BLOG_START_URL, API_KEY, max_pages=100)

工程化落地与高级功能:从测试到生产

作为成熟的爬虫工具,FireCrawl 支持分布式部署、反爬策略适配、数据持久化等工程化特性,可满足生产环境下大规模 AI 数据爬取需求。程序员需掌握这些高级功能,确保爬虫稳定运行且符合合规要求。

1. 分布式爬取(提升大规模数据获取效率)

当需要爬取十万级以上页面(如构建行业级 AI 知识库)时,可通过 FireCrawl 的分布式模式,利用多节点并行爬取,大幅提升效率。


from firecrawl.distributed import FirecrawlDistributed

def distributed_ai_crawl(start_url: str, api_key: str, worker_count: int = 5) -> None:

"""

分布式爬取:多节点并行爬取,提升大规模AI数据获取效率

:param worker_count: 工作节点数量(根据服务器资源调整)

"""

# 初始化分布式爬虫(需先部署FireCrawl Coordinator服务)

distributed</doubaocanvas>

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐