Firecrawl实战指南:网页抓取、结构化提取到深度研究,一次讲透
【免费下载链接】firecrawlThe context API to search, scrape, and interact with the web at scale. 🔥项目地址: https://gitcode.com/GitHub_Trending/fi/firecrawl
做竞品调研时,你手动复制了 200 个网页,再一条条粘进 LLM 提示词里。Firecrawl 把这条链路压缩成一次 API 调用:网页抓取后直接输出 LLM 友好的 Markdown,再按你定义的 Schema 完成结构化提取。
Firecrawl是什么:把网站变成可调用的数据源
Firecrawl 是一个面向 AI 应用的网页抓取与数据提取 API:把任意 URL 或整个网站转换成干净的 Markdown / JSON,内置渲染、反爬代理、结构化提取和深度研究能力,解决"网页数据怎么稳定地喂给模型"这个核心问题。
快速上手:安装、配置、第一次抓取
- 安装:
pip install firecrawl-py - 配置:在 Firecrawl 控制台注册后拿到 Key,设
export FIRECRAWL_API_KEY=你的key - 调用:三行代码完成第一次抓取
下面这段代码抓取一个页面,只取 Markdown 正文,是后面所有能力的基础:
from firecrawl import FirecrawlApp app = FirecrawlApp(api_key="fc-xxxx") result = app.scrape_url("https://example.com/docs", formats=["markdown"]) print(result["markdown"])输出示例:
# Getting Started Install with `npm install` ... POST /v2/scrape accepts a URL and returns markdown ...单页抓取与格式转换:把网页变成干净的 Markdown
语料入库前的清洗,是最典型的 Markdown 转换需求:原文导航、广告、脚注全都会污染 LLM 的上下文。only_main_content=True只保留正文,配合links一次拿全正文和站内链接,直接入队做 RAG。
result = app.scrape_url( "https://example.com/docs/quickstart", formats=["markdown", "links"], only_main_content=True, )输出示例:
{ "markdown": "# Quickstart\nInstall with npm ...", "links": ["https://example.com/docs/api", "https://example.com/docs/cli"] }💡 技巧:需要 JS 渲染的页面加
wait_for=1500,让动态内容加载完再抓,避免拿到空壳。
拿到单页 Markdown 后,下一个需求通常是"只留下我要的字段"——这就从格式转换进入结构化提取。
结构化提取:用 Pydantic 定义数据模型
竞品监控里,你只关心标题、价格和更新时间,而不是整页正文。用 Pydantic 把字段和描述写清楚,Firecrawl 的extract能力会按 Schema 从页面里抽数据,返回的就是干净 JSON,不用自己正则。完整可运行脚本见examples/hacker_news_scraper/firecrawl_scraper.py。
from pydantic import BaseModel, Field, List class NewsItem(BaseModel): title: str = Field(description="新闻标题") upvotes: str = Field(description="点赞数") class NewsData(BaseModel): news_items: List[NewsItem] data = app.scrape_url( "https://news.ycombinator.com/", formats=["extract"], extract={"schema": NewsData.model_json_schema()}, )输出示例:
{ "extract": { "news_items": [ {"title": "Show HN: ...", "upvotes": "312"}, {"title": "Postgres 17 released", "upvotes": "287"} ] } }💡 技巧:
Field(description=...)里写清取值规则(如"取整数、不带逗号"),提取准确率明显更高。
单页提取解决"已知 URL 取字段",但真实调研里,你连该看哪些页面都还没确定——这就要交给深度研究。
深度研究:多轮探索与实时进度回调
评估"目标城市租房市场行情"时,你不知道该看哪些房源站。deep_research会自己搜索、逐页跟进、交叉分析,on_activity回调把每一步(search / scrape / analyze)实时打出来,过程不再黑盒。示例见examples/deep-research-apartment-finder/apartment_finder.py。
result = app.deep_research( query="杭州西湖区两居室租房,预算4000以内", max_depth=3, # 迭代轮数 time_limit=180, # 秒 max_urls=20, # 最多分析的URL数 on_activity=lambda a: print(f"[{a['type']}] {a['message']}"), ) print(result["data"]["finalAnalysis"])输出示例:
[search] 找到 12 个相关来源 [scrape] 已抓取 /listings/hangzhou-xihu [analyze] 正在汇总价格区间 finalAnalysis: 西湖区两居室均价 3600-4200 元,性价比集中在文新、三墩板块 ...💡 技巧:
max_urls先设 10 试跑一轮,确认来源质量后再放大,避免预算烧在低质页面上。
研究能力回答了"看哪里",但业务要的不是一次性结果,而是持续、自动、带动作的数据流。
自动化与业务集成:批量抓取加阈值告警
价格监控是最直接的落地场景:每 30 分钟抓一批商品页,按 Schema 提取价格,比上一轮跌了就推 Discord。抓取侧用batch_scrape_urls并发处理,业务侧就是一个普通的定时脚本。仓库里examples/blog-articles/amazon-price-tracking/有一套完整的价格跟踪实现。
results = app.batch_scrape_urls(product_urls, formats=["markdown"]) for r in results["data"]: if r["success"]: price = extract_price_from_markdown(r["markdown"]) if price < last_price[r["url"]]: push_discord(r["url"], price)输出示例:
[OK] /products/b001 price=41.47 (last 43.20) [ALERT] 降价 $1.73 -> 已推送 Discord💡 技巧:批量任务用
poll_interval=2控制轮询频率,长任务配合 webhook 回调,比客户端死等更稳。
常见问题与避坑
Q:遇到 429 限流怎么办?按套餐 QPS 控制并发;批量接口用poll_interval放慢轮询,失败请求指数退避重试即可。
Q:大页面抓取超时怎么解决?timeout单位是毫秒,JS 重的页面设 30000+,或用wait_for只等关键元素出现,比干等更快。
Q:目标站反爬严格怎么办?scrape_url支持proxy="stealth"(或 auto)走隐身代理池,多数 Cloudflare 级防护可过;仍失败就换actions模拟点击、滚动。
Q:费用怎么估算?按抓取页数计费,批量和多格式输出(截图、PDF 解析)单价更高;先用max_urls、limit把规模压到最小再放量。
Q:非 Python 项目能用吗?官方提供 JS、Go、Java、Ruby、PHP、.NET、Rust 等 SDK,API 形态一致,examples/下按语言都有示例。
延伸与搭配
把抓取的 Markdown 切块后写进向量数据库,就是一套现成的 RAG 语料管线;定时任务跑批量抓取加阈值告警,监控类业务直接落地。仓库examples/目录按场景分了 50+ 个示例,克隆后即可对照:git clone https://gitcode.com/GitHub_Trending/fi/firecrawl。能力边界在于你能定义多准的 Schema,下一步值得试的是把extract的字段描述写成业务语言,而不是字段名直译。
【免费下载链接】firecrawlThe context API to search, scrape, and interact with the web at scale. 🔥项目地址: https://gitcode.com/GitHub_Trending/fi/firecrawl
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考