1. 项目概述:从网页到设计系统的“一键翻译”
如果你和我一样,经常在 Cursor 或 Lovable 这类 AI 编程工具里“折腾”,肯定遇到过这样的场景:看到一个设计精美的网站,想借鉴它的配色、字体和间距,但手动去开发者工具里一个个复制 CSS 值,再整理成 AI 能理解的格式,这个过程既繁琐又容易出错。更别提那些复杂的阴影、渐变和响应式断点了,手动提取几乎是个噩梦。
Scrapestyle 就是为了解决这个痛点而生的。它的核心功能非常直接:你给它一个公开网站的 URL,它就能在几秒钟内,为你生成一份结构清晰、AI 友好的设计系统文档。这份文档包含了颜色、字体、间距、阴影等所有关键的设计令牌,格式可以直接粘贴到 Cursor 或 Lovable 的上下文中,让 AI 助手能精准地理解并复现目标网站的设计语言。
我最初接触这个工具时,第一反应是“这想法太聪明了”。它本质上是一个“设计翻译器”,将视觉层(网页)翻译成结构化的设计规范层(JSON/文本)。对于独立开发者、产品经理,或者像我这样需要快速搭建原型的前端工程师来说,这极大地缩短了从“灵感”到“可执行代码”的路径。你不用再在 Figma、代码和 AI 工具之间反复横跳,一个 URL 就能打通整个流程。
2. 核心原理与技术栈拆解
Scrapestyle 的实现并不复杂,但几个关键技术的选型和组合非常精妙。理解了它的工作原理,你不仅能更好地使用它,甚至能根据自己的需求进行定制或二次开发。
2.1 技术栈全景:为什么是它们?
项目采用了相当现代且高效的技术组合:
- Next.js 15 (App Router):作为全栈框架,它提供了服务端渲染、API 路由和便捷的部署体验。使用 App Router 能更好地组织项目结构,并利用 React Server Components 优化性能。
- Tailwind CSS:这几乎是现代 Web 项目的标配。它的实用性类名(Utility-First)哲学,使得从网页中提取出的设计令牌(如颜色、间距)能非常自然地映射到 Tailwind 的配置体系中,为后续生成 AI 提示词提供了便利。
- Google Gemini API:这是项目的“大脑”。单纯的 CSS 提取是机械的,而 Gemini 的介入赋予了工具“理解”能力。它能分析提取到的原始样式数据,识别出哪些是主色、辅助色、标题字体、正文字体,并归纳出设计规律。
- Puppeteer:这是项目的“手和眼睛”。作为一个无头浏览器库,Puppeteer 能模拟真实用户访问目标网站,完整地加载页面、执行 JavaScript,并获取到最终渲染后的 DOM 和计算样式。这是绕过反爬机制、获取动态生成内容的关键。
- Vercel:作为 Next.js 的“亲爹”,Vercel 提供了无缝的部署、全球 CDN 和 Serverless Functions,让这个工具能快速上线并稳定运行。
这个技术栈的选择体现了清晰的思路:Next.js 提供全栈能力,Puppeteer 负责数据采集,Gemini 负责智能分析,Tailwind 作为设计语言的“中间件”,最后通过 Vercel 轻松交付。
2.2 工作流程深度解析
当你输入一个 URL 并点击“Scrape”后,背后发生了一系列协同工作:
- URL 验证与启动:前端将 URL 发送到 Next.js 的 API 路由。服务端首先验证 URL 格式和可访问性,然后启动一个 Puppeteer 实例。
- 无头浏览器抓取:Puppeteer 会新开一个浏览器页面,导航到目标 URL。这里有几个关键细节:
- 等待策略:工具会等待页面
networkidle0(网络空闲)状态,确保所有资源(包括异步加载的字体、样式)都已加载完毕。这是获取完整样式的关键,否则你可能只能拿到初始的、不完整的 CSS。 - 执行环境:Puppeteer 在页面上下文中执行脚本,可以访问到
window.getComputedStyle等浏览器 API,从而获取到元素最终应用的所有 CSS 属性值,包括继承的和覆盖的。
- 等待策略:工具会等待页面
- 样式数据提取:这是最核心的一步。Puppeteer 脚本会遍历页面中的关键元素(通过预定义的选择器,如
body,h1-h6,p,a,.container,button等),收集它们的计算样式。收集的数据通常是一个庞大的对象,包含数百个元素的颜色、字体大小、行高、字重、边距、内边距、阴影等属性。 - AI 智能归纳:原始样式数据是杂乱无章的。同一个
#3b82f6蓝色可能出现在按钮、链接和标题上。这时,提取到的数据会被整理并发送给 Gemini API。提示词(Prompt)会要求 AI:“分析这些样式数据,归纳出一个设计系统,包括主色、辅助色、字体阶梯、间距比例、阴影样式等,并以 JSON 格式输出。” Gemini 的强大之处在于它能进行聚类和命名,比如识别出#3b82f6是主色primary,#6b7280是中性色neutral-600。 - 格式化与输出:收到 Gemini 返回的结构化 JSON 后,后端会将其转换为两种更友好的格式:
- Tailwind Config 片段:将颜色、字体等直接映射为
tailwind.config.js中的theme.extend对象。 - 纯文本设计指南:生成一段描述性的文字,如“本设计系统采用深蓝色(#1e40af)作为主色,搭配灰色(#6b7280)作为文本色...”,这种格式对 Cursor 的聊天上下文特别友好。
- Tailwind Config 片段:将颜色、字体等直接映射为
- 结果返回与展示:最终,这些格式化好的内容被返回给前端界面,清晰展示给用户,并提供一键复制功能。
注意:整个过程中,你的 Gemini API Key 仅在浏览器端与 Google API 通信(如果使用在线版),或留在你的本地环境(如果自部署)。目标网站的 HTML/CSS 数据会经过后端(你的服务器或 Vercel Serverless Function),但 API Key 本身不会暴露给第三方服务器,这即是所谓的“隐私优先”设计。
3. 从安装到实战:完整操作指南
了解了原理,我们来动手实操。Scrapestyle 提供了在线和本地两种使用方式,我将详细拆解每一步。
3.1 在线快速体验
这是最快上手的方式,适合大多数只想提取设计令牌的用户。
- 访问官网:打开 scrapestyle.com 。
- 获取 API Key:
- 点击界面上的 “Get a free Gemini API key” 链接,它会跳转到 Google AI Studio。
- 登录你的 Google 账号,在 API 密钥页面,点击“创建密钥”。你可以选择“创建新密钥”或使用现有项目。
- 复制生成的 API 密钥(一串以
AIza...开头的字符串)。请像保管密码一样保管它,不要泄露给他人。
- 配置工具:
- 回到 Scrapestyle 页面,将复制的 API Key 粘贴到输入框。
- 在下拉菜单中,确认选择的是Google Gemini模型(默认通常是
gemini-1.5-flash,平衡了速度与成本)。
- 执行抓取:
- 在 URL 输入框,粘贴你想要分析的公开网站地址。例如,
https://tailwindcss.com。 - 点击 “Scrape Style” 按钮。界面会显示“Processing...”状态。
- 在 URL 输入框,粘贴你想要分析的公开网站地址。例如,
- 获取结果:等待几秒到十几秒(取决于网站复杂度和网络),结果面板会显示生成的设计系统。通常包括:
- Colors:以色块和 HEX/RGB 值展示的主色板。
- Typography:字体家族、各级标题和正文的字号、字重、行高。
- Spacing:常用的间距比例(如 4px 的倍数)。
- Shadows:使用的阴影效果。
- 两个可复制的内容区域:一个是Tailwind Config代码块,另一个是文本描述。
你可以直接点击“Copy”按钮,将对应内容粘贴到你的 Cursor 项目中。例如,在 Cursor 中,你可以说:“请使用以下设计系统来构建一个登录页面:”,然后粘贴生成的文本描述。
3.2 本地部署与深度定制
如果你需要更高的隐私性、更频繁的使用,或者想修改代码以满足特定需求(比如增加提取圆角border-radius或渐变gradient的功能),本地部署是更好的选择。
环境准备:
- Node.js:确保系统已安装 Node.js(版本 18.17 或更高,推荐 LTS 版本)。可以在终端运行
node -v检查。 - Git:用于克隆代码库。
- Chrome/Chromium:Puppeteer 需要依赖一个本地的 Chrome 或 Chromium 浏览器来运行。在 macOS 上,它通常会自动安装;在 Linux 上,可能需要手动安装
chromium-browser包。
部署步骤:
克隆项目:
git clone https://github.com/Max-Mogilski/Scrapstyle.git cd Scrapstyle这会将项目源码下载到你的本地
Scrapstyle文件夹。安装依赖:
npm install这个过程会下载 Next.js、Puppeteer、Tailwind 等所有必要的包。Puppeteer 可能会下载一个 Chromium 浏览器,请保持网络通畅。
配置环境变量: 项目根目录下应该有一个
.env.example文件。复制它并重命名为.env:cp .env.example .env打开
.env文件,你需要填入你的 Gemini API Key:# .env 文件内容示例 GEMINI_API_KEY=AIzaSyYourActualApiKeyHereDoNotShareThis重要:
.env文件默认被.gitignore排除,不会提交到 Git,保证了密钥安全。运行开发服务器:
npm run dev终端会输出类似
> Ready on http://localhost:3000的信息。本地访问: 打开浏览器,访问
http://localhost:3000。你现在看到的就是和官网功能一样的本地版本,但所有数据都在你的机器上处理。
自定义抓取逻辑: 本地部署的最大优势是可修改性。假设你想增加对 CSS 自定义属性(CSS Variables)的提取,你可以修改 Puppeteer 的抓取脚本。核心文件通常在app/api/scrape/route.js(或.ts)中。找到执行页面评估(page.evaluate)的部分,那里定义了从 DOM 中提取哪些样式属性。你可以尝试扩展选择器或添加需要提取的新属性名。
4. 高级技巧与实战心得
用了 Scrapestyle 一段时间,我积累了一些能显著提升成功率和结果质量的经验,这些在官方文档里未必会提到。
4.1 目标网站的选择与预处理
不是所有网站都适合“一把抓”。
- 优选静态或服务端渲染(SSR)网站:像 Tailwind CSS 官网、Vercel 官网这类以内容展示为主的网站,结构清晰,样式规整,提取效果最好。
- 谨慎对待复杂 SPA(单页应用):对于重度依赖客户端渲染的 Web App(如某些管理后台),Puppeteer 可能需要更长的等待时间(
networkidle0可能不够)。你可以尝试在代码中修改等待条件,比如增加一个固定的延迟await page.waitForTimeout(2000),确保动态内容加载完毕。 - 处理登录墙或认证:Scrapestyle 无法处理需要登录的页面。如果你需要分析内部系统,唯一的办法是在本地部署后,修改 Puppeteer 脚本,在导航后自动注入 Cookie 或执行登录操作(这涉及敏感信息,务必谨慎)。
- 检查 robots.txt:出于道德和法律考虑,抓取前请检查目标网站的
robots.txt文件(例如https://example.com/robots.txt),尊重Disallow规则。
4.2 优化 Gemini 提示词以获得更佳输出
Scrapestyle 内置的提示词已经不错,但如果你在本地部署,可以尝试微调它,让 AI 的输出更符合你的习惯。提示词通常位于调用 Gemini API 的代码附近。你可以尝试让它:
- 输出更具体的命名:比如要求颜色命名不仅用
primary,secondary,还可以加上primary-dark,primary-light变体。 - 归纳间距比例:要求 AI 分析提取到的所有
margin,padding值,推导出一个基础的间距单位(如4px或5px),并输出像spacing: { 1: '0.25rem', 2: '0.5rem', ... }这样的比例尺。 - 忽略异常值:有些网站可能有某些元素使用了极其特殊的样式(比如促销广告的亮粉色)。你可以在提示词中要求 AI “忽略出现频率低于 X 次的颜色或字体样式”,以过滤噪音。
4.3 将结果高效集成到 AI 工作流
生成设计系统只是第一步,用好它才能提升效率。
在 Cursor 中的使用:
- 上下文对话:最直接的方式是在聊天框中粘贴生成的文本描述。你可以补充指令:“请基于这个设计系统,为我创建一个产品展示卡片组件,使用 React 和 Tailwind CSS。”
- 创建项目级规则:对于长期项目,你可以将生成的
tailwind.config.js片段合并到你项目的实际配置文件中。这样,在整个项目生命周期中,Cursor 的自动补全和代码理解都会基于这套自定义的设计令牌。 - 结合
.cursorrules文件:你可以将一些关键的设计原则(如“所有按钮都应使用primary颜色并带有rounded-lg圆角”)写入.cursorrules文件,让 AI 在编写代码时始终遵循。
在 Lovable 中的使用: Lovable 同样接受自然语言描述。你可以将 Scrapestyle 生成的描述作为项目需求的一部分输入。更精细的做法是,将颜色、字体等直接输入到 Lovable 的样式面板或主题设置中(如果支持),实现视觉还原的精准控制。
4.4 性能与成本考量
- API 调用成本:Gemini API 不是完全免费的,但有慷慨的免费额度。
gemini-1.5-flash模型成本极低,通常每千次请求只需几美分。对于个人偶尔使用,免费额度完全足够。但如果你计划构建一个高频使用的公共服务,需要监控 API 用量并设置预算提醒。 - 本地部署的资源消耗:Puppeteer 启动 Chrome 实例会消耗一定的内存和 CPU。在资源有限的服务器(如便宜的 VPS)上频繁运行可能导致性能问题。考虑增加请求间隔、使用
puppeteer-core并连接远程浏览器实例,或者对抓取任务进行队列管理。 - 超时处理:对于加载缓慢的网站,Vercel Serverless Function 可能有超时限制(默认10秒)。在线版可能会因此失败。本地部署时,你可以在 Next.js API 路由配置中调整
maxDuration,或者优化 Puppeteer 的等待逻辑,避免长时间阻塞。
5. 常见问题与故障排查实录
在实际使用中,你肯定会遇到一些问题。下面是我踩过坑后总结的排查清单。
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 点击 Scrape 后长时间无响应或失败。 | 1. 目标网站服务器响应慢或不可达。 2. Puppeteer 启动/加载超时。 3. Gemini API 密钥无效或额度用尽。 4. (在线版) Vercel Serverless Function 超时。 | 1. 检查网络,尝试一个更简单的知名网站(如example.com)测试。2. 本地部署时,检查 Chrome/Chromium 是否正确安装。尝试在代码中增加 timeout参数。3. 在 Google AI Studio 检查 API 密钥状态和用量。 4. 对于复杂网站,尝试本地部署并调整超时设置。 |
| 提取到的颜色或字体非常杂乱,不成系统。 | 1. 网站本身设计不规范,没有统一的设计令牌。 2. 页面包含大量第三方广告或插件,引入了杂散样式。 3. AI 分析环节的提示词未能有效归纳。 | 1. 这是工具限制,尝试换一个设计更规范的网站。 2. 尝试使用广告拦截器插件后的页面,或者寻找该网站的“无干扰”阅读模式链接。 3. (本地部署) 尝试修改提示词,要求 AI 进行更严格的聚类和过滤。 |
| 结果中缺少阴影、圆角等样式。 | 工具的提取脚本可能默认只关注了颜色、字体、间距等核心属性。 | (本地部署) 这是自定义的好机会。修改page.evaluate中的脚本,增加对box-shadow,border-radius,border-width等属性的收集。 |
本地安装时npm install失败,特别是 Puppeteer 相关错误。 | 1. 网络问题,无法从谷歌服务器下载 Chromium。 2. 系统缺少 Puppeteer 的依赖库(常见于 Linux)。 | 1. 设置 npm 镜像或使用科学上网环境。 2. 可以安装 puppeteer-core并指向系统已安装的 Chrome:npm install puppeteer-core,然后在代码中配置executablePath。对于 Linux,安装依赖:sudo apt-get install -y ca-certificates fonts-liberation libasound2 ...(具体包名请查 Puppeteer 文档)。 |
| 在线版提示“API Key无效”。 | 1. 密钥输入错误,含有空格或换行。 2. 密钥未启用或所在项目未开启 Gemini API。 3. 浏览器插件冲突。 | 1. 重新复制粘贴,确保前后无空格。 2. 登录 Google AI Studio,确保在对应项目中已启用 Gemini API。 3. 尝试在无痕模式下使用。 |
| 生成的 Tailwind Config 在项目中不生效。 | 1. 生成的配置未正确合并到tailwind.config.js的theme.extend下。2. Tailwind CSS 版本不兼容。 3. 未重新编译 CSS。 | 1. 手动检查合并后的配置文件格式是否正确。 2. 确保项目使用的是 v3.x 版本。 3. 运行 npm run dev重启开发服务器,或重新构建生产版本。 |
一个真实的踩坑案例:我曾试图抓取一个使用大量 CSS-in-JS 和运行时主题切换的网站。Scrapestyle 返回的颜色全是 CSS 变量名(如var(--primary)),而不是具体的色值。这是因为 Puppeteer 获取的计算样式就是变量名。解决方案是在page.evaluate脚本中,添加了获取这些变量实际计算值的逻辑,通过getComputedStyle(document.documentElement).getPropertyValue('--primary')来解析。这个经历说明,面对复杂的技术栈,工具可能需要针对性地增强。
Scrapestyle 是一个优雅地解决特定效率问题的工具。它可能无法 100% 完美复现每一个网站的设计系统精髓,但对于快速捕捉设计语言、建立原型一致性、以及作为 AI 编程的“视觉上下文提供者”来说,它已经足够出色。我的体会是,把它当作一个强大的“设计灵感启动器”和“规范速记员”,而不是一个全自动的替代品。结合你自己的设计判断,它能将你从重复的机械劳动中解放出来,让你更专注于逻辑和创意本身。如果你经常在 AI 辅助下进行前端开发,花半小时试试它,很可能会成为你工作流中一个高频使用的利器。