ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用 Firecrawl 将任意网站一键转成结构化 API:Website-to-API-with-FireCrawl 配置、源码与 Schema 抽取实战指南

用 Firecrawl 将任意网站一键转成结构化 API:Website-to-API-with-FireCrawl 配置、源码与 Schema 抽取实战指南 用 Firecrawl 将任意网站一键转成结构化 APIWebsite-to-API-with-FireCrawl 配置、源码与 Schema 抽取实战指南【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub这是一篇面向 AI 工程师的实战指南基于 ai-engineering-hub 仓库中的 Website-to-API-with-FireCrawl 项目完整讲解如何借助 Firecrawl 的爬取与 LLM 抽取能力把任意网站变成一个“可对话、可返回结构化 JSON/表格”的 API并用 Streamlit 提供聊天式交互界面。读完你将掌握.env密钥配置、streamlit run启动方式、动态 Pydantic Schema 生成以及FirecrawlApp.extract()的核心调用链能够直接把任意网页 URL 变成机器可读的结构化数据接口。项目做什么从爬网页到抽 API传统抓取网页的方案通常只能拿到 HTML 或全文文本想从中提取公司使命、是否开源、发布日期这类字段还得自己再写解析逻辑。这个项目的思路完全不同让Firecrawl 负责抓取让LLM 负责按你给定的 Schema 抽取最终把网站内容直接结构化输出。从代码与文档可以看出整个项目由两大技术组件构成Firecrawl负责访问并抓取目标网页。项目通过其 Python SDKfrom firecrawl import FirecrawlApp见 app.py调用extract()接口Streamlit负责将抽取能力包装成 Web 界面——左侧输入网址、可视化构建 Schema 字段主区域以聊天框的形式提问如提取该页面所有与 LLM 相关的文章标题与链接。也就是说对用户而言最终效果是把一个 URL 粘贴进去像聊天一样提问就能拿到表格化的结构化数据等价于把网站封装成了一个可查询的轻量级 API。一、环境准备申请密钥与安装依赖1. 获取 Firecrawl API KeyFirecrawl 的网页抓取与抽取能力由云端服务承载因此必须先在 Firecrawl 官网注册账号然后在 API Key 页面复制你的密钥。2. 写入.env文件项目通过python-dotenv加载环境变量app.py 与 notebook.ipynb 中均有load_dotenv()调用。在项目根目录创建.env文件并填入密钥FIRECRAWL_API_KEYyour_api_key密钥随后被读取并用于初始化客户端app.pyfirecrawl_api_key os.getenv(FIRECRAWL_API_KEY)。因此如果密钥缺失或写错变量名客户端将无法完成鉴权。3. 安装依赖官方文档Website-to-API-with-FireCrawl/README.md要求Python 3.11 或更高版本notebook 的运行内核为 Python 3.12.2。安装核心依赖pip install streamlit firecrawl需要补充说明的是阅读 app.py 的全部 import 可知运行时还依赖python-dotenv、pandas、pydantic三个库分别用于环境变量、结果转 Markdown 表格、动态 Schema 建模。若你的环境中尚未安装可一并安装避免运行时报错pip install streamlit firecrawl python-dotenv pandas pydantic二、一键启动把网页变成可对话 API配置完成后在项目目录执行README 原文命令streamlit run app.py启动后浏览器会打开 Streamlit 界面整个使用流程分为三段左侧栏输入网站 URL在 Enter Website URL 中输入目标网址如https://example.com这是本次抽取的范围可选在 Schema Builder 中构建字段默认提供一个字段可点击Add Field ➕继续添加上限 5 个字段代码中硬编码len(st.session_state.schema_fields) 5见 app.py。每个字段需指定字段名和类型类型选项固定为str / bool / int / float四种在主区域提问在底部聊天输入框输入针对该网站的问题例如extract the mission and whether the company supports SSO即可获得结构化返回。Schema 字段的四类数据类型代码把界面下拉选项直接映射为 Python 类型app.py界面选项Python 类型典型语义strstr文本如文章标题、公司使命boolbool布尔判断如是否开源是否支持 SSOintint整数如发布日期中的年份floatfloat浮点数如价格、评分勾选的字段会被构造成 JSON Schema 并随请求提交从而强制 LLM 的输出严格符合该字段结构。三、源码解读数据是如何被抽出来的下面沿着 app.py 的执行路径剖析提问 → 抽取 → 表格化渲染这条调用链。1. 客户端单例初始化st.cache_resource def load_app(): app FirecrawlApp(api_keyfirecrawl_api_key) return app见 app.py。st.cache_resource保证 Firecrawl 客户端只在首次运行时创建一次避免每个请求重复实例化。2. Session State 承载 UI 状态界面依赖两组会话状态app.pymessages聊天记录列表schema_fieldsSchema Builder 中当前字段集合初始为[{name: , type: str}]。用户点击Add Field ➕时向schema_fields追加一个空字段reset_chat()则清空消息并调用gc.collect()回收内存。3. 动态生成 Pydantic 模型与 JSON Schema这是本项目最核心的技巧不让用户写代码而是让用户在界面上勾选字段再由程序动态生成类型安全的 Schema。def create_dynamic_model(fields): field_annotations {} for field in fields: if field[name]: type_mapping {str: str, bool: bool, int: int, float: float} field_annotations[field[name]] type_mapping[field[type]] return type(ExtractSchema, (BaseModel,), {__annotations__: field_annotations})见 app.py。它使用 Python 内建type()函数以ExtractSchema为类名、以用户勾选的字段注解动态构造一个 PydanticBaseModel子类create_schema_from_fields()再调用model_json_schema()输出标准 JSON Schema若没有任何字段名则返回None。这种做法的等价手写版在 notebook 中有直观对照静态定义class ExtractSchema(BaseModel): article_title: str publish_date: str article_link: str并调用ExtractSchema.model_json_schema()生成相同结构的 Schema见 notebook.ipynb。也就是说界面上的Schema Builder本质是把这段 Pydantic 定义搬到了 UI 上由用户勾选决定输出契约。4. 组装参数并调用 Firecrawl extractextract_params {prompt: prompt} if schema: extract_params[schema] schema data app.extract([website_url], extract_params)见 app.py。调用要点URL 以列表传入[website_url]这与 notebook 中app.extract([https://blog.dailydoseofds.com/*], ...)的用法一致即一个抽取请求可以覆盖多个 URL 或一个带通配符的站点范围prompt为必填用自然语言描述要从网页中抽什么例如Extract the article title, publish date, and article link of all articles related to LLMs.schema为可选一旦提供抽取结果的字段类型与结构即受 Schema 约束LLM 抽取更稳定、结果更可预测。5. 结果渲染列表优先字典兜底Firecrawl 返回体形如{data: ...}。代码对结果做了两种兼容app.py若data[data]是列表典型的 LLM 抽取返回直接交给convert_to_table()若data[data]是字典可能因页面内多组数据被按键分组则取第一个 key 对应的值再转表格。convert_to_table()利用 pandas 把结果组装成 DataFrame再通过df.to_markdown(indexFalse)输出 Markdown 表格app.py最后用stream_text()实现打字机逐字渲染效果app.py并在出错时通过st.error反馈异常app.py。这样一个来自网页的原始 HTML最终就以规整表格的形式沉淀在聊天记录中可被复制到任何下游系统继续消费。四、无界面方案用 Notebook / 脚本完成批量化抽取并不是所有场景都需要 Web 界面。仓库自带的 notebook.ipynb 提供了完全等价的脚本化实现封装了一个WebsiteScraper类将上面三个环节读密钥、动态建 Schema、调用 extract收敛为单一方法scrape_website()。关键示例抓取某博客下所有与 LLM 相关的文章website_url https://blog.dailydoseofds.com/* prompt extract publish date, title and link of all articles related to LLMs schema_fields [ {name: Article_title, type: str}, {name: Publish_date, type: str}, {name: Article_link, type: str} ] result scraper.scrape_website(website_url, prompt, []) print(result)这段代码有两个值得注意的工程细节通配符 URLhttps://blog.dailydoseofds.com/*将抽取范围扩展到该站点下多个页面配合抓取并抽取全部相关文章的 prompt即可实现站点级 API而不是单个页面级本例传入的空schema_fields走的是仅用 prompt 驱动抽取的宽松路径返回结构由 LLM 自行决定当需要严格控制字段时再把schema_fields或手写 Pydantic 模型的model_json_schema()作为schema传入详见 notebook 中的ExtractSchema对照实现。类式封装与函数式实现的差异对比两种写法可以看到同一逻辑的两种表达notebook 把逻辑收进WebsiteScraper类便于在脚本、定时任务或 API 服务中复用notebook.ipynb而 app.py 采用 Streamlit 惯用的模块级函数 session_state风格二者功能一一对应可以按场景自由选择。五、使用边界与常见问题基于源码的提醒必须先填 URL 再提问主流程明确检查了if not website_url并提示 Please enter a website URL first!app.py不填网址时不会发起任何请求Schema 为空则退化为自由抽取当 Schema Builder 中没有任何已命名字段时create_schema_from_fields()返回None请求将只携带promptapp.py——这适合不确定字段、先跑一遍看结果的探索场景字段数量上限为 5为避免 UI 失控代码主动限制了可追加字段个数app.py需要更多字段时建议直接改用 notebook 中的 Pydantic 模型定义运行依赖文档要求 Python 3.11且运行时实际用到pandas、pydantic、python-dotenv等库见第一节全新环境建议一次性安装齐全输出结构兼容两种形态convert_to_table()分支处理了列表与字典两类data返回app.py如果你观察到表格为空可以先打印原始返回体确认data[data]的真实结构。六、延伸阅读官方最小安装与启动说明见 Website-to-API-with-FireCrawl/README.md可交互界面完整实现见 Website-to-API-with-FireCrawl/app.py涵盖缓存初始化、动态 Schema、抽取与渲染的完整链路无界面脚本与WebsiteScraper类、静态/动态 Schema 对照实验见 Website-to-API-with-FireCrawl/notebook.ipynb仓库中基于 Firecrawl 的进阶用法与 Agent 工作流结合可参考 firecrawl-agent/workflow.py 与 mcp-agentic-rag-firecrawl/rag_code.py。小结总而言之Website-to-API-with-FireCrawl提供了一条把任意网站转换为结构化 API的最短路径Firecrawl 负责抓取与 LLM 抽取Streamlit 负责把 Schema 构建与对话查询变成可视界面动态 Pydantic 模型则让输出契约既可由用户在界面上勾选、也可在代码中显式声明。无论你是想快速验证某个网页能不能抽出结构化字段还是想为下游 Agent/RAG 搭建持续可用的站点级数据接口都可以把本文的配置步骤、app.extract()调用范式与两类代码风格直接作为起点复用。【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表