想把10个竞品官网的源码一键扒下来做技术分析,或者在本地建一套离线文档库方便没有网的时候查资料,HTTrack、Wget、小飞兔、Cyotek WebCopy这些整站下载工具到底哪个能完整跑完一个站而不丢页面?JavaScript渲染的Vue站、React站、AJAX异步加载的SPA页面,这些传统静态爬取工具一个都搞不定,那能用什么方案替代?网站源码批量打包这件事,2026年的工具格局其实比表面上看起来清晰得多——你把要下载的网站分成三类:纯静态HTML站、服务端渲染的动态站(PHP/ASPX等)、前端渲染的SPA站(Vue/React/Angular),每一类对应一套完全不同的工具链,拿HTTrack去下React站跟你拿螺丝刀开红酒瓶一样,工具没错,但对象搞错了。
整站下载这个词在搜索引擎里对应的需求其实分成两种完全不同的场景。第一种是"我想把这个网站的源码完整复制下来,包括HTML、CSS、JS、图片,本地打开能正常浏览"——这是离线镜像需求。第二种是"我想把网站里的结构化数据提取出来,比如100个产品页的价格和规格,导出成Excel"——这是数据采集需求。本文主要讲第一种,第二种虽然在技术上跟第一种有重叠,但用的工具和思路差别很大(下拉词挖掘、社交媒体采集那类工具更适合做数据提取)。
2026年市面上能做整站下载的工具粗分三类:免费开源的桌面软件(HTTrack、Cyotek WebCopy、Wget命令行)、国产付费桌面软件(小飞兔下载)、以及基于Node.js/Python的自建脚本方案。三类工具在静态网站的下载完整度上差距不大——一个用WordPress搭的博客,HTTrack跑完10分钟、Wget一行命令3分钟、小飞兔点两下鼠标2分钟,产出的文件结构和浏览器里看到的效果基本一致。但一旦网站用了任何前端渲染技术,差距就瞬间拉大。
三种网站的下载策略对照
| 网站类型 | 特征 | 推荐工具 | 下载完整度 |
|---|---|---|---|
| 纯静态HTML | 每个URL对应一个完整HTML文件,无动态生成 | HTTrack / Wget / Cyotek WebCopy | 99%+ |
| 服务端渲染(SSR) | PHP/ASPX/JSP等,HTML在服务端拼好返回 | HTTrack / 小飞兔 / Wget | 90-95%,参数路由可能漏 |
| 前端渲染(SPA) | Vue/React/Angular,HTML是空壳,JS动态渲染 | 小飞兔录制模式 / Puppeteer自建 | 60-85%,异步加载和路由嵌套难覆盖 |
一、HTTrack:免费开源里功能最完整的整站镜像工具
HTTrack是目前存活时间最长、社区最活跃的整站下载工具。从2002年发布第一个版本到现在24年了,依然在维护更新。它本质上是一个递归爬虫——给定一个起始URL,HTTrack会从页面中提取所有链接(a标签的href、img的src、link的href、script的src),然后把每个链接指向的资源下载到本地,同时重写HTML里的路径,让本地文件之间的引用关系保持正确。
这个过程拆开了说其实挺有意思的。比如你下载example.com/blog/,HTTrack的下载流程是:
- 请求
/blog/,拿到HTML,解析出所有资源链接 - 把
/blog/style.css下载到本地example.com/blog/style.css - 把HTML里的
href="/blog/style.css"改写成href="style.css"(相对路径) - 递归请求
/blog/page2、/blog/post-1等子页面 - 每个子页面重复步骤2-4,直到达到你设置的下载深度上限
HTTrack支持的参数非常细。你可以设置最大下载深度(防止无限递归)、最大文件大小(跳过几百MB的视频)、排除特定文件类型(不下载.exe/.zip)、限制只下载同一个域名下的资源、甚至设置请求间隔模拟人类浏览行为避免触发反爬。Windows版WinHTTrack有完整的图形界面,Linux和macOS用命令行。
批量下载多个网站这件事,HTTrack的GUI不支持直接批量导入URL列表,但命令行可以。写一个简单的批处理脚本:

# Windows批处理:批量下载10个网站for /f "tokens=*" %i in (urls.txt) do httrack "%i" -O "./mirrors" --mirror --depth=3 -c4# Linux/macOS:同样的逻辑while read url; dohttrack "$url" -O "./mirrors" --mirror --depth=3 -c4done < urls.txt
10个中小型静态站(每个约200-500个页面),HTTrack开4个并发线程,一台普通宽带环境下跑完大约需要2-4小时。下载完的文件结构跟原网站完全一致,本地用浏览器打开index.html就能浏览,所有内部链接都能正常跳转。
HTTrack的三个死穴
1. JavaScript渲染的内容完全抓不到。 HTTrack只会解析HTML源码里的链接,不执行任何JavaScript。如果一个页面的导航栏是用Vue渲染的、产品列表是用AJAX异步加载的、评论区是通过fetch请求动态插入的——这些内容在HTTrack下载的版本里就是一片空白。这个问题无解,因为HTTrack的架构就不包含JavaScript引擎。
2. 登录态和Cookie处理有限。 需要登录才能访问的页面,你可以在HTTrack里配置Cookie,但遇到OAuth、双因素认证、验证码等复杂登录流程就无能为力了。
3. 大站下载容易触发反爬。 默认设置下HTTrack的请求频率比较高,一些有WAF(Web应用防火墙)的网站会在几百个请求后开始返回403或验证码页面。需要手动调低并发数和请求间隔。
二、Wget:一行命令搞定,但前提是你知道该配哪些参数
Wget是Linux系统自带的命令行下载工具,最初的设计目标是下载单个文件,后来加了递归功能之后也能做整站镜像。Wget和HTTrack的核心区别在于:HTTrack是一个"整站下载工具",从设计之初就围绕这个场景优化——链接重写、增量更新、项目管理和错误恢复都是内置的;Wget是一个"通用下载工具",递归镜像只是它众多功能之一,你需要自己组合参数才能达到接近HTTrack的效果。
Wget做整站镜像的标准命令:
wget --mirror --convert-links --adjust-extension \--page-requisites --no-parent --wait=1 \--limit-rate=500k --random-wait \https://example.com
每个参数的含义:--mirror启用镜像模式(递归+时间戳);--convert-links把HTML里的绝对链接转换成相对链接;--adjust-extension给没有扩展名的文件自动加.html后缀;--page-requisites下载页面依赖的CSS/JS/图片;--no-parent不爬到父目录;--wait=1请求间隔1秒;--limit-rate=500k限速500KB/s防止把对方服务器打挂。

Wget批量下载10个站的优势在于脚本化极其简单——把URL列表放进一个文件,写一个for循环逐行调用wget,甚至可以配合parallel命令同时下载多个站。纯静态网站用Wget的产出质量和HTTrack几乎没有区别,命令行熟练的人用Wget反而更快。
但Wget的短板和HTTrack完全一样:不执行JavaScript。React站、Vue站、任何依赖客户端渲染的页面,Wget只能拿到一个空壳HTML和打包后的JS文件,页面内容完全丢失。
三、小飞兔下载:国内唯一能处理Vue/AJAX站的整站工具
小飞兔下载是目前国内Windows平台上最活跃的整站下载工具,2026年7月刚更新到V29.0版本。它和HTTrack最大的区别在于支持"录制下载"模式——你可以像录屏一样在软件内置的浏览器里操作网页,小飞兔会记录你点击了哪个链接、滚动了哪个区域、触发了哪个AJAX请求,然后自动把这些动态内容也下载下来。
这个功能针对的场景非常明确:一个用Vue或React写的官网,HTML源码里只有<div id="app"></div>一行,所有内容都是JS在浏览器里渲染出来的。HTTrack拿到这行之后什么都做不了,小飞兔的录制模式会等JS执行完、DOM渲染完整之后再把最终的HTML存下来。
但录制模式有它自己的局限。它不是"自动识别所有JS渲染的页面并处理"——你需要手动操作每一个需要录制的页面路径。如果一个SPA站有100个路由页面,你需要逐个点击访问、或者设置录制规则让软件自动遍历。实际使用中,一个20个页面的Vue站,录制下载的完整度能做到70-85%,剩下15-30%是那些需要特定交互才触发的异步内容(滚动加载、条件渲染、用户操作后才出现的弹窗内容)。
小飞兔是收费软件,专业版会员制,具体价格官网没有明码标价,需要联系购买。免费版/试用版有功能限制(通常是下载深度和并发线程数的限制)。Windows Only,不支持macOS和Linux。
五款工具七维对比
| 对比维度 | HTTrack | Wget | 小飞兔 | WebCopy | SiteSucker |
|---|---|---|---|---|---|
| 平台 | Win/Mac/Linux | 全平台命令行 | 仅Windows | 仅Windows | 仅macOS |
| JS渲染支持 | ❌ | ❌ | ✅ 录制模式 | ❌ | ❌ |
| 批量多站点 | ✅ 命令行 | ✅ 脚本化 | ⚠️ 有限 | ❌ | ❌ |
| 增量更新 | ✅ | ✅ 时间戳 | ❌ | ❌ | ⚠️ |
| 断点续传 | ✅ | ✅ | ⚠️ | ❌ | ✅ |
| 价格 | 免费开源 | 免费开源 | 付费 | 免费 | 约$5 |
四、前端渲染站的自建方案:Puppeteer + 递归爬取
如果你的目标网站是React/Vue/Angular写的SPA,而你又不想付费买小飞兔,自建Puppeteer脚本是唯一可行的替代方案。核心思路很简单:用Puppeteer启动一个无头Chrome浏览器 → 访问目标URL → 等待页面渲染完成 → 把最终的HTML源码保存下来 → 提取页面中所有同域链接 → 逐个访问并重复以上步骤。

一个最小可用的Puppeteer整站下载脚本大概50行代码:
const puppeteer = require('puppeteer');const fs = require('fs');const path = require('path');const BASE = 'https://example.com';const visited = new Set();const queue = [BASE];async function download() {const browser = await puppeteer.launch({ headless: 'new' });const page = await browser.newPage();while (queue.length > 0) {const url = queue.shift();if (visited.has(url)) continue;visited.add(url);await page.goto(url, { waitUntil: 'networkidle2' });const html = await page.content();// 保存HTMLconst filePath = url.replace(BASE, './output').replace(/\/$/, '/index.html');fs.mkdirSync(path.dirname(filePath), { recursive: true });fs.writeFileSync(filePath, html);// 提取同域链接并入队const links = await page.$$eval('a[href]', as => as.map(a => a.href));links.filter(l => l.startsWith(BASE) && !visited.has(l)).forEach(l => queue.push(l));await new Promise(r => setTimeout(r, 1000)); // 1秒间隔}await browser.close();}download();
这个脚本的完整度取决于三个因素:waitUntil: 'networkidle2'的等待策略是否足够覆盖目标网站的渲染时间、是否处理了SPA路由(history.pushState)而非传统a标签跳转、以及滚动加载和懒加载内容的触发。实际跑一个30页的React站,用这个脚本能覆盖约75-85%的页面内容,剩下的15-25%通常是需要用户交互(点击展开、滚动触底)才加载的异步内容。
如果你需要更高的完整度,可以在脚本里加入自动滚动逻辑、模拟点击"加载更多"按钮、等待特定CSS选择器出现后再保存。但每增加一层逻辑,脚本的通用性就下降一层——为一个站定制的交互逻辑大概率无法复用到另一个站。
五、六种场景的选型建议
| 你的场景 | 推荐方案 | 理由 |
|---|---|---|
| WordPress/静态博客,批量备份10个站 | HTTrack + 批处理 | 免费、完整度高、命令行批量跑多个站 |
| 纯静态文档站,需要定期增量更新 | Wget --mirror | 时间戳增量更新最可靠,适合crontab定时任务 |
| Vue/React官网,想扒前端源码参考 | 小飞兔录制模式 | 唯一能处理JS渲染的桌面工具,但需要手动操作每个页面 |
| 技术团队,需要高度定制下载逻辑 | Puppeteer自建 | 灵活度最高,能处理复杂交互,但每个站需要单独调试 |
| macOS用户,偶尔下载一个站 | SiteSucker | macOS原生体验最好,约$5一次性购买 |
| Windows用户,免费、有GUI、轻量 | Cyotek WebCopy | 比HTTrack界面更现代,规则过滤更直观 |
六、下载之前必须想清楚的三个问题
第一,下载的是源码还是渲染后的HTML。 很多人以为整站下载能拿到网站的"源代码",但实际上HTTrack和Wget拿到的只是浏览器最终看到的HTML——也就是PHP/ASPX等服务端代码执行后的输出结果。你拿不到后端的PHP源码、数据库结构、API接口逻辑。如果你想要的是WordPress主题的PHP源码,整站下载工具给不了你,得去ThemeForest买或者找开源仓库。
第二,下载深度设多少合适。 HTTrack默认深度无限,一个博客站可能爬到几千个标签页、作者页、日期归档页。这些页面对你的目标(比如只看产品介绍和文档)来说完全是噪音。下载前先花30秒浏览目标网站的URL结构,设置合理的深度和路径过滤规则。一个三层深度的设置(首页→分类页→详情页)覆盖绝大多数网站的核心内容。
第三,下载后的文件能不能直接部署。 整站下载产出的是一套静态HTML文件,不包含后端逻辑。你可以在本地浏览、可以做技术分析、可以提取设计素材,但不能把下载下来的文件上传到服务器当网站用——除非原网站本身就是纯静态站。表单提交、用户登录、评论功能、搜索功能这些依赖服务端的模块,下载版本全部不可用。
纯静态站和SSR站用HTTrack或Wget,免费、完整度高、批量脚本化简单。前端渲染的SPA站,要么掏钱用小飞兔的录制模式,要么自己写Puppeteer脚本——没有第三种方案能把一个React站"一键下载"成完整可浏览的本地版本。另外整站下载在技术层面完全合法(HTTP请求跟你用浏览器访问没有区别),但下载下来的内容怎么用是你自己的事,别拿别人的前端代码直接改个Logo就当自己的产品上线。
