前提条件#
- Python 3.8+
- 一个 Firecrawl API 密钥——免费获取
设置#
pip install fastapi uvicorn firecrawl-py将 API 密钥添加到 .env 中:
FIRECRAWL_API_KEY=fc-YOUR-API-KEY编写 API#
创建 main.py:
import osfrom fastapi import FastAPIfrom pydantic import BaseModelfrom firecrawl import Firecrawlapp = FastAPI()firecrawl = Firecrawl(api_key=os.environ["FIRECRAWL_API_KEY"])class SearchRequest(BaseModel): query: str limit: int = 5class ScrapeRequest(BaseModel): url: strclass InteractRequest(BaseModel): scrape_id: str prompt: str@app.post("/search")async def search(req: SearchRequest): results = firecrawl.search(req.query, limit=req.limit) return [{"title": r.title, "url": r.url} for r in results.web]@app.post("/scrape")async def scrape(req: ScrapeRequest): result = firecrawl.scrape(req.url) return {"markdown": result.markdown, "metadata": result.metadata}@app.post("/interact/start")async def interact_start(req: ScrapeRequest): result = firecrawl.scrape(req.url, formats=["markdown"]) return {"scrape_id": result.metadata.scrape_id}@app.post("/interact")async def interact(req: InteractRequest): response = firecrawl.interact(req.scrape_id, prompt=req.prompt) return {"output": response.output}@app.post("/interact/stop")async def interact_stop(req: InteractRequest): firecrawl.stop_interaction(req.scrape_id) return {"status": "stopped"}运行#
uvicorn main:app --reload试一下#
# 进行网页搜索curl -X POST http://localhost:8000/search \ -H "Content-Type: application/json" \ -d '{"query": "firecrawl web scraping", "limit": 5}'# 抓取页面curl -X POST http://localhost:8000/scrape \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com"}'# 启动交互会话,然后发送 promptcurl -X POST http://localhost:8000/interact/start \ -H "Content-Type: application/json" \ -d '{"url": "https://www.amazon.com"}'FastAPI 会自动在 http://localhost:8000/docs 生成交互式文档。
异步变体#
为在高负载下获得更好的并发性能,请使用 AsyncFirecrawl:
from firecrawl import AsyncFirecrawlasync_firecrawl = AsyncFirecrawl(api_key=os.environ["FIRECRAWL_API_KEY"])@app.post("/scrape-async")async def scrape_async(req: ScrapeRequest): result = await async_firecrawl.scrape(req.url) return {"markdown": result.markdown}
