【数据采集】[特殊字符] Firecrawl 示例页面 —— 技术设计、原理与部署全解(二)
将任意网站转化为 LLM 可用数据的展示型全栈应用。 项目概述Firecrawl 示例页面是一个基于Next.js 16的全栈 Web 应用它复现了 Firecrawl 的核心价值主张将任意网页抓取为干净的 Markdown直接供大语言模型LLM消费。应用本身是一个“展示型 功能型”页面 —— 既有营销落地页的视觉冲击火焰主题、动画、渐变又有可实际操作的在线抓取演示Live Demo。用户输入任意 URL即可获得清洗后的 Markdown、统计数据和原始 HTML。维度选型前端框架Next.js 16App Router React 19样式方案Tailwind CSS 4 shadcn/uinew-york 风格动画库Framer Motion后端运行时Node.jsNext.js Route Handler数据抓取z-ai-web-dev-sdkpage_reader函数数据库Prisma ORM SQLite构建工具Bun反向代理Caddy部署模式Standalone 产物 进程编排 系统架构应用采用经典的“单页前端 API 后端 进程编排”三层结构。前端通过 HTTP 调用后端 API后端借助z-aiSDK 获取目标网页并转换为 Markdown部署层由 Caddy 统一入口将请求分发到 Next.js 服务和可选的 mini-services。HTTP / fetch带 ?XTransformPortN 的请求其余请求/api/scrape调用无头浏览器抓取htmlToMarkdownPrisma浏览器用户Caddy 反向代理 :81Mini-Services 子服务 :NNext.js Standalone :3000Route Handlerz-ai-web-dev-sdkpage_reader目标网页 HTML清洗后 MarkdownSQLite请求流转以 Live Demo 为例当用户在LiveDemo中输入 URL 并点击Scrape时数据流经以下路径前端发起POST /api/scrape请求体{ url: string }。Caddy将请求转发到 Next.js 的3000端口。Route Handler校验 URL 合法性调用ZAI.create()初始化 SDK。SDK 的page_reader函数无头抓取目标页面返回标题、HTML、发布时间等元数据。htmlToMarkdown()将原始 HTML 清洗并转换为Markdown。后端组装响应markdown、stats、fetchedAt返回 JSON。前端在Markdown / Stats / Raw三个标签页中展示结果。⚙️ 核心原理解析 网页抓取链路抓取链路的灵魂是z-ai-web-dev-sdk提供的page_reader函数。它封装了无头浏览器渲染 内容提取的完整流程constzaiawaitZAI.create();constresultawaitzai.functions.invoke(page_reader,{url});page_reader的工作分为三个阶段页面渲染—— 启动无头 Chrome导航到目标 URL等待页面加载完成。这保证了 JavaScript 渲染的 SPA、动态加载内容都能被正确捕获。内容提取—— 从渲染后的 DOM 中提取标题、最终 URL经重定向、完整 HTML 和发布时间检查多种 meta 标签。用量统计—— 返回usage.tokens记录本次抓取消耗的 token 数用于计费和监控。拿到原始 HTML 后后端调用自定义的htmlToMarkdown()进行清洗和格式转换 —— 这是整个应用的“价值放大器”。 HTML 转 Markdown 算法htmlToMarkdown()位于src/lib/html-to-markdown.ts用纯正则 递归下降实现了一个轻量级转换器不依赖第三方库约 150 行代码。处理管线原始 HTML剥离噪声标签script/style/nav/footer/注释提取 main/article聚焦主内容区块级元素转换标题/代码块/引用/列表/表格行内元素转换链接/图片/加粗/斜体/代码清理残余标签 压缩空行干净 Markdown关键设计亮点噪声剥离优先移除script、style、nav、footer、header、svg等非内容标签避免污染统计和 token 消耗。递归下降对div、section、article等容器递归处理能应对任意深度的嵌套。行内与块级分离inlineToMarkdown()专注处理链接、图片、加粗、斜体、代码等在块级转换中被反复调用职责单一。HTML 实体解码支持nbsp;、amp;、#39;等命名、数字和十六进制实体确保输出无转义残留。表格支持能将简单 HTML 表格转换为 Markdown 管道表格格式。取舍说明正则方案比 DOM 解析更快且零依赖但无法处理畸形 HTML。对于结构良好的网页博客、文档站、新闻页输出质量足以支撑 LLM 消费。 部署架构原理 Standalone 构建模式next.config.ts中声明output: standalone这是 Next.js 的生产部署优化模式。构建时会将所有必需的node_modules依赖追踪并打包进.next/standalone/目录产出一个自包含的server.js可直接用bun server.js或node server.js运行无需在部署环境安装依赖。构建脚本build.sh包含“自愈”机制如果构建后server.js不存在例如误删配置会自动注入配置并重新构建。完整构建收集流程bun installbun run buildnext build生成 .next/standalone/server.js生成 .next/static/复制 public/复制到 next-service-dist/database-runtime-build.sh初始化数据库python-runtime-build.sh固化 Python 依赖mini-services-build.sh编译子服务tar -czf 打包 Caddy 反向代理Caddyfile配置了基于查询参数的智能路由:81 { transform_port_query { query XTransformPort* } handle transform_port_query { reverse_proxy localhost:{query.XTransformPort} } handle { reverse_proxy localhost:3000 } }这个设计使得所有子服务mini-services都可通过同一个81端口访问 —— 前端只需在 URL 中附加?XTransformPort3003Caddy 自动将请求路由到对应端口解决了端口暴露和跨域问题。️ 数据库运行时处理database-runtime-build.sh在构建阶段处理数据库若 Preview 环境已有db/custom.db则复制否则初始化空数据库并对构建产物中的数据库执行prisma db push同步 schema。start.sh运行时检查数据库文件是否存在默认路径/app/db/custom.db若缺失则直接终止启动避免连接到空数据库。也可通过DATABASE_URL环境变量指定外部数据库。 Python 运行时支持python-runtime-build.sh处理可选的 Python 依赖检测项目中是否存在.py源文件、requirements.txt或pyproject.toml。用uv将生产依赖安装到构建产物的python-runtime/site-packages/。修复 console scripts 的 shebang使运行时能正确解析。复制源码到部署产物保持相对路径。start.sh运行时检测到该目录后会将其加入PYTHONPATH和PATH使 Next.js 及其子进程能直接使用打包的 Python 环境。 Firecrawl API 使用指南Firecrawl 提供了一整套将网页转化为 LLM 就绪数据的 API包括搜索、抓取、交互等核心能力。以下为快速上手示例。 无密钥快速开始无需 API Key 即可体验基础功能有速率限制。需要更高限制时可在 Firecrawl App 获取 Key 并添加请求头Authorization: Bearer $FIRECRAWL_API_KEY。 1. 搜索Search搜索网络并返回结果页面的完整内容。# cURLcurl-s-XPOSThttps://api.firecrawl.dev/v2/search\-HContent-Type: application/json\-d{query: firecrawl, limit: 3}# Python SDKfromfirecrawlimportFirecrawl firecrawlFirecrawl()# 无需 API Keyresultsfirecrawl.search(firecrawl,limit3)print(results)// Node.js SDKimport{Firecrawl}fromfirecrawl;constfirecrawlnewFirecrawl();constresultsawaitfirecrawl.search(firecrawl,{limit:3});console.log(results); 2. 抓取Scrape抓取任意 URL获得 Markdown、HTML 或结构化 JSON。curl-s-XPOSThttps://api.firecrawl.dev/v2/scrape\-HContent-Type: application/json\-d{url: https://firecrawl.dev, formats: [markdown, html]}返回示例节选{success:true,data:{markdown:# Home - Firecrawl\n\n...,html:!DOCTYPE html...,metadata:{title:Home - Firecrawl,description:...}}}️ 3. 交互Interact抓取页面后可以继续与之交互点击按钮、填写表单、提取动态内容等。# 1. 抓取 Amazon 首页resultapp.scrape(https://www.amazon.com,formats[markdown])scrape_idresult.metadata.scrape_id# 2. 搜索产品并获取价格app.interact(scrape_id,promptSearch for iPhone 16 Pro Max)responseapp.interact(scrape_id,promptClick on the first result and tell me the price)print(response.output)# 3. 停止会话app.stop_interaction(scrape_id) 更多能力功能说明Map发现网站上的所有 URLCrawl递归抓取整个网站Parse将本地 PDF、DOCX、XLSX、HTML 等转换为 Markdown 或 JSONBrowser Sandbox托管浏览器会话适用于交互式工作流Webhooks异步事件通知️ 安装与部署示例项目环境要求依赖版本要求用途Bun 1.0包管理 构建 运行时Node.js 20Next.js 运行时基础Caddy 2生产环境反向代理uv可选 0.4Python 依赖管理如有 Python 源码本地开发# 1. 安装依赖buninstall# 2. 初始化数据库bun run db:push# 3. 启动开发服务器bun run dev访问http://localhost:3000支持热重载。也可使用一键脚本sh.zscripts/dev.sh生产构建# 构建 Next.js 应用bun run build# 使用完整构建脚本含子服务、Python 等BUILD_ID唯一标识sh.zscripts/build.sh构建产物为/tmp/build_fullstack_${BUILD_ID}.tar.gz。部署启动将构建产物解压到部署目录后执行shstart.sh启动顺序检测并配置 Python 运行时如有启动 Next.js Standalone 服务bun server.js后台运行校验数据库文件存在性启动 mini-services如有后台运行前台启动 Caddy主进程监听81端口验证部署# 健康检查curlhttp://localhost:81/# API 自描述curlhttp://localhost:81/api/scrape# 抓取测试curl-XPOST http://localhost:81/api/scrape\-HContent-Type: application/json\-d{url: https://example.com}成功响应应包含success: true、markdown字段和统计数据。 数据模型Prisma SQLite项目预设了User和Post模型一对多关系虽然当前抓取功能不直接使用但为后续扩展如保存抓取历史、用户管理奠定基础。model User { id String id default(cuid()) email String unique name String? createdAt DateTime default(now()) updatedAt DateTime updatedAt } model Post { id String id default(cuid()) title String content String? published Boolean default(false) authorId String createdAt DateTime default(now()) updatedAt DateTime updatedAt }数据库连接采用单例模式避免 Next.js 热重载时反复创建 PrismaClient 实例。 目录结构速览firecrawl/ ├── src/ │ ├── app/ │ │ ├── api/ │ │ │ ├── route.ts # 健康检查 │ │ │ └── scrape/route.ts # 核心抓取 API │ │ ├── globals.css # 火焰主题 │ │ ├── layout.tsx # 根布局 SEO │ │ └── page.tsx # 首页组装所有区块 │ ├── components/ │ │ ├── firecrawl/ # 8 个业务组件 │ │ └── ui/ # shadcn/ui 40 基础组件 │ ├── hooks/ # use-mobile, use-toast │ └── lib/ │ ├── db.ts # Prisma 单例 │ ├── html-to-markdown.ts # 转换器 │ └── utils.ts # 类名工具 ├── prisma/ │ └── schema.prisma ├── examples/websocket/ # WebSocket 聊天示例 ├── mini-services/ # 子服务目录 ├── .zscripts/ # 构建与部署脚本 ├── Caddyfile # 反向代理配置 ├── next.config.ts └── package.json 火焰主题设计系统项目使用一套鲜明的视觉语言定义在globals.css中类名作用实现.fire-gradient-text橙红渐变文字linear-gradientbackground-clip: text.fire-gradient-bg橙红渐变背景linear-gradient(135deg, #fb923c, #f97316, #ef4444).fire-glow大范围火焰光晕双层box-shadow橙色 红色.fire-grid透视网格背景双向渐变 径向mask-image渐隐.fire-radial径向火焰光双椭圆radial-gradient叠加动画flame-flicker2.6s 呼吸循环和float-up粒子向上飘升加载骨架屏使用shimmer橙色高光扫过。 总结Firecrawl不仅是一个功能完整的网页抓取工具更是一个技术演示的范本前端展示与交互设计精良采用现代 React 生态后端抓取链路清晰自定义转换算法轻量高效部署架构兼顾生产环境需求通过 Caddy Standalone 模式实现一体化交付丰富的 API 能力搜索、抓取、交互使其成为 LLM 应用的数据源利器。无论是想快速搭建自己的“网页转 Markdown”服务还是学习项目的架构与部署这个项目都值得深入研究和借鉴。

相关新闻

构建可审计的LLM社会模拟器:从推理调节到系统验证

构建可审计的LLM社会模拟器:从推理调节到系统验证

这类项目标题看起来学术味很浓,但核心要解决的问题其实很实际:如何用大语言模型(LLM)来模拟社会行为,并且用一种“有道理”的方式去检验这些模拟结果是否靠谱。简单说,它不是为了生成一个会聊天的AI&#x…

2026/10/14 20:53:08 阅读更多 →
电路仿真软件怎么选?3 步装好 CircuitJS1 离线版,免费获得随身电子实验室

电路仿真软件怎么选?3 步装好 CircuitJS1 离线版,免费获得随身电子实验室

电路仿真软件怎么选?3 步装好 CircuitJS1 离线版,免费获得随身电子实验室 【免费下载链接】circuitjs1 Standalone (offline) version of the Circuit Simulator with small modifications based on modified NW.js. 项目地址: https://gitcode.com/gh…

2026/10/3 6:33:35 阅读更多 →
电视节目资料数字化处理全流程:从采集到归档的完整技术指南

电视节目资料数字化处理全流程:从采集到归档的完整技术指南

最近在整理历史影像资料时,发现很多朋友对早期电视节目的包装素材,尤其是像CCTV-13新闻频道《360度》这类经典栏目的片头片尾有研究和收藏的需求。这类资料不仅是媒体从业者的宝贵参考,也承载着一代观众的集体记忆。本文将围绕如何系统性地理…

2026/10/13 18:49:13 阅读更多 →

最新新闻

iMX8M异构多核开发:A53与M4的Rpmsg核间通信全解析

iMX8M异构多核开发:A53与M4的Rpmsg核间通信全解析

拿到一块iMX8M板卡,A53那边跑着Linux做业务逻辑,M4这边想跑FreeRTOS管实时控制,第一个绕不开的问题就是:这两个核之间到底怎么通信。我在实际项目里试过几种土办法——共享变量太脆弱,串口又太慢,敲了半天代…

2026/10/14 20:53:22 阅读更多 →
802.11-2020 PDF高效阅读指南:条款定位与测试基线实战

802.11-2020 PDF高效阅读指南:条款定位与测试基线实战

简介:此PDF为IEEE 802.11-2020标准的正式版全文,属于无线局域网领域的核心规范,面向网络工程师、通信专业学生与科研人员,用于理解WLAN介质访问控制层与物理层的完整定义。该版本由IEEE计算机协会LAN/MAN标准委员会开发&#xff0…

2026/10/14 20:53:22 阅读更多 →
ArcGIS Pro 2.5发布OSGB三维模型失败原因与修复指南

ArcGIS Pro 2.5发布OSGB三维模型失败原因与修复指南

1. 为什么OSGB在ArcGIS Pro 2.5里突然“变难了”——从模型加载到服务发布的断层真相你是不是也遇到过这样的情况:用ContextCapture或Pix4D生成的OSGB倾斜摄影模型,在本地ArcGIS Pro里打开时缩放流畅、纹理清晰,连瓦片层级切换都丝滑&#xf…

2026/10/14 20:53:22 阅读更多 →
Wing 模拟器中的 sim.Container:从 entrypoint 测试快照看自定义容器启动与底层实现

Wing 模拟器中的 sim.Container:从 entrypoint 测试快照看自定义容器启动与底层实现

编程语言编译器云原生语言运行时 【免费下载链接】wing A programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡ 项目地址: https://gitcode.com/gh_mirrors/wi/wing 点击查看 免…

2026/10/14 20:53:22 阅读更多 →
JDK 11.0.15 Linux部署指南:TLS 1.3与GC调优实战

JDK 11.0.15 Linux部署指南:TLS 1.3与GC调优实战

简介:本资源为Linux平台下Java 11.0.15正式版JDK标准发行包(jdk-11.0.15_linux-x64_bin.tar.gz),面向Java初学者、Linux服务器开发者及需要稳定LTS版本JDK的生产环境部署人员,解决跨平台开发、服务端编译运行及JVM调优…

2026/10/14 20:53:22 阅读更多 →
Dubbo服务注册与暴露全流程解析:从Spring容器启动到注册中心

Dubbo服务注册与暴露全流程解析:从Spring容器启动到注册中心

1. 从一次线上故障说起&#xff1a;为什么要搞清楚服务注册与暴露很多同学用 Dubbo 做微服务&#xff0c;配置文件里写个<dubbo:service>或者加个DubboService注解&#xff0c;服务就能被调用了&#xff0c;至于背后发生了什么&#xff0c;基本靠“框架自动搞定”这句话糊…

2026/10/14 20:52:20 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →