单页模板
只抓当前页与它引用的资源,不递归 a 链接。适合快速归档落地页、设计稿与单篇文章。
wget -r -E -np -c -k --ignore-tags=a <url>
两种模式对应 wget 的两种经典用法,行为边界清晰:单页模板只抓当前页面及其引用资源,整站克隆按 -np 语义递归追踪站内链接、绝不越界到上级目录。
只抓当前页与它引用的资源,不递归 a 链接。适合快速归档落地页、设计稿与单篇文章。
递归追踪站内链接(不向上级目录),把全站页面与资源完整搬回本地。
核心引擎 webclone-core 为纯 Rust 实现,AOT 友好、零反射;解析器、编码识别、路径映射全部自研,不依赖任何 HTML 库。
二进制资源用 ETag / 304 跳过未变更;中断的下载用 Range + If-Range 续传;一律先写 .part 再原子改名,不留残缺成品。
按 BOM → HTTP charset → meta charset → 严格 UTF-8 嗅探 → GB18030 兜底识别,统一转 UTF-8 保存并改写编码声明,GBK 页面不乱码。
HTML / CSS 扫描器为零依赖状态机,记录原文下标原地替换;覆盖 link、script、img、srcset、video、iframe、内联 style、@import、@font-face 与 data-src 懒加载。
所有资源引用改写为相对路径,跨域 CDN 按各自域名归档;下载完成后按真实 Content-Type 修正扩展名,无扩展名的动态样式表也能正确存为 .css。
SOCKS5 走 socks5h 语义,域名交给代理解析,与 C# 版手写 RFC 1928 行为一致;支持用户名密码认证。
下载时跟随服务端重定向,最终地址与请求地址共享同一本地文件;整站克隆不会因 /doc 与 /doc/ 的写法差异存出两份。
GUI「下载选项」新增自定义 UA 复选框(默认预填 Edge 的 UA),CLI 用 --user-agent 对应;测试服务器会记录收到的 UA 验证真的生效。
CLI 与 GUI 各是一个独立 exe(约 3.3 / 3.4 MB),Rust 直接编成机器码,不需要 .NET 或任何运行库,拷到别的机器直接能跑。
命令行版 bin 名 webclone,与 C# 版参数完全一致;退出码 0 成功、1 有失败项、2 参数错误、3 未处理异常、130 用户取消。
# 单页模板:抓取页面及其引用的全部资源
webclone https://example.com -o D:\site
# 整站递归:深度 3,并发 16
webclone https://example.com -m full -d 3 -c 16 -o D:\site
# SOCKS5 代理(域名交给代理解析,支持 user:pass)
webclone https://example.com --proxy socks5://user:pass@127.0.0.1:1080
# 自定义浏览器 UA
webclone https://example.com --user-agent "Mozilla/5.0 (…) Edg/126.0.0.0"-m single | full | 克隆模式:单页模板 / 整站递归 |
|---|---|
-o 目录 | 输出目录 |
-d 深度 | 整站递归深度 |
-c 并发 | 并发下载数 |
--proxy | HTTP(S) / SOCKS5 代理地址 |
--user-agent | 自定义浏览器 UA |
--no-cross-origin | 不抓取跨域 CDN 资源 |
--no-incremental | 关闭增量下载 |
--ignore-cert-errors | 忽略 HTTPS 证书错误 |
-v | 详细日志 |
更多选项(--max-pages、--timeout、--retry、--keep-absolute、--keep-external-links 等)见项目 README。
webclone-core 的模块划分刻意与 C# 版 WebClone.Core 一一对应,方便对照阅读;GUI 层约 1500 行,核心引擎不受界面影响。
webclone-rs/
├── Cargo.toml # workspace 定义
├── build.ps1 / build.sh # 一键构建
├── assets/app.ico # 程序图标(6 尺寸)
├── build/embed_icon.rs # 图标嵌入共用逻辑
├── crates/
│ ├── webclone-core/ # 核心引擎(纯 Rust)
│ ├── webclone-cli/ # 命令行版(webclone)
│ └── webclone-gui/ # winsafe 原生 Win32
└── tests/
├── make_test_site.py # 验证站点(含 GBK)
├── test_server.py # ETag/304/Range
├── test_proxy.py # HTTP/SOCKS5 代理
├── regression.ps1 # CLI 回归(6 场景)
├── gui_probe.py # GUI 探针(59 断言)
└── check_icon.py # 图标 / 版本校验Rust 模块与 C# 版 WebClone.Core 的类逐一对应,迁移对照阅读零成本。
| C# 版 | Rust 版 |
|---|---|
| CloneEngine.cs | engine.rs |
| CloneOptions.cs / ProxySettings.cs | options.rs |
| Net/ResourceDownloader.cs | net/downloader.rs |
| Parse/HtmlScanner.cs | parse/html_scanner.rs |
| Storage/PathMapper.cs | storage/path_mapper.rs |
| Text/EncodingDetector.cs | text/encoding.rs |
自动化测试覆盖 CLI 与 GUI 两条链路,GUI 探针用 ctypes + PIL 直接操作真实窗口,在沙箱隔离环境下验证行为而非只读状态。
测试基础设施齐备:make_test_site.py 生成含 GBK 页面、查询参数资源、CSS 嵌套引用的验证站点;test_server.py 支持 ETag / 304 / Range 续传;test_proxy.py 提供 HTTP / SOCKS5 双模代理;ua_server.py 记录收到的 UA。
GUI 冒烟在沙箱目录运行,配置写在 exe 同目录,测试与用户配置双向隔离;图标校验用自研的零依赖 PE 资源解析器逐图层比对。
最低支持平台是 Rust 工具链的硬口径而非项目取舍;Rust 1.78+ 起官方最低支持 Windows 10,本项目由 rustc 1.97.1 构建。
dist/webclone.exe — 命令行版,约 3.3 MBdist/WebClone-GUI.exe — 图形界面版,约 3.4 MB# Windows 上优先用 PowerShell
.\build.ps1 # CLI + GUI
.\build.ps1 -SkipGui # 只构建命令行版
.\build.ps1 -SkipCli # 只构建图形界面版
.\build.ps1 -Clean # 先清 dist\ 与 target\