GeiserX/Wayback-Archive

GitHub: GeiserX/Wayback-Archive

一款专用于从 Wayback Machine 下载并重建完整网站的工具,支持资产本地化和离线预览。

Stars: 3 | Forks: 0

Wayback-Archive banner

从 Wayback Machine 下载完整网站以供离线查看。

Build Release License Python 3.8+ GitHub Stars

Wayback-Archive 是一个 Python 工具,用于从 [Wayback Machine](https://web.archive.org/) 下载已归档的网站并重建它们,以实现完全功能的离线查看。它保留了所有资产——HTML、CSS、JavaScript、图片和字体——将 URL 重写为相对路径,并清理 Wayback Machine 的伪影,因此结果看起来像原始站点。 ## 快速开始 ``` # 安装 git clone https://github.com/GeiserX/Wayback-Archive.git cd Wayback-Archive pip install -r config/requirements.txt # 运行 export WAYBACK_URL="https://web.archive.org/web/20250417203037/http://example.com/" python3 -m wayback_archive.cli # 预览 cd output && python3 -m http.server 8000 # 打开 http://localhost:8000 ``` ## 功能 ### 核心 - **完整网站下载** —— HTML、CSS、JS、图片、字体及所有链接的资产 - **递归链接发现** —— 自动跟踪 HTML、CSS 和 JS 文件中的链接 - **智能 URL 重写** —— 将所有链接转换为相对路径以便本地提供服务 - **时间范围回退** —— 当资源返回 404 时搜索附近的 Wayback Machine 时间戳 - **实时进度日志** —— 实时显示下载状态和文件处理情况 ### 资产处理 - **Google Fonts 支持** —— 本地下载 Google Fonts CSS 和字体文件,修复 CORS 问题 - **字体损坏检测** —— 识别并删除损坏的字体文件(作为字体提供的 HTML 错误页面) - **CDN 回退** —— 当 Wayback Machine 失败时,自动回退到 CDN 获取关键库(例如 jQuery) - **Data 属性处理** —— 处理包含 URL 的 `data-*` 属性(视频、图片等) ### 保留 - **图标组保留** —— 保留图标组中的所有链接(社交媒体、联系图标) - **按钮链接保留** —— 维持按钮链接的样式和功能 - **Cookie 同意保留** —— 保持 Cookie 同意弹窗及其功能完好 ### 优化 - **HTML 压缩** —— 使用 `minify-html`(兼容 Python 3.14+) - **JS/CSS 压缩** —— 可选的通过 `rjsmin` 和 `cssmin` 进行 JavaScript 和 CSS 压缩 - **图片压缩** —— 可选的通过 Pillow 进行图片优化 - **追踪器/广告移除** —— 剥离分析、广告和外部 iframe - **链接清理** —— 可配置的外部链接移除,并提供锚点保留选项 - **www/non-www 规范化** —— 自动规范域名变体 ## 为什么选择 Wayback-Archive? | 能力 | Wayback-Archive | wget | httrack | |---|:---:|:---:|:---:| | Wayback Machine URL 重写 | 是 | 否 | 否 | | Wayback 伪影清理 | 是 | 否 | 否 | | 404 时间范围回退 | 是 | 否 | 否 | | Google Fonts 本地化 | 是 | 否 | 否 | | 字体损坏检测 | 是 | 否 | 否 | | CDN 回退 | 是 | 否 | 否 | | HTML/CSS/JS 压缩 | 是 | 否 | 否 | | 追踪器和广告移除 | 是 | 否 | 否 | | `data-*` 属性处理 | 是 | 否 | 否 | 像 `wget --mirror` 或 `httrack` 这样的通用工具可以下载实时网站,但它们不理解 Wayback Machine URL 结构,无法清理归档伪影,并且缺乏 Wayback-Archive 提供的专业资产恢复功能。 ## 安装 ### 先决条件 - Python 3.8 或更高版本 - pip ### 从源码安装 ``` git clone https://github.com/GeiserX/Wayback-Archive.git cd Wayback-Archive # 可选:创建 virtual environment python3 -m venv venv source venv/bin/activate # macOS/Linux # venv\Scripts\activate # Windows pip install -r config/requirements.txt ``` ### 作为包安装 ``` cd Wayback-Archive pip install -e . wayback-archive # Available as a CLI command after installation ``` ## 配置 所有选项均通过环境变量设置。您也可以使用 `.env` 文件。 ### 必填项 | 变量 | 描述 | |---|---| | `WAYBACK_URL` | 要下载的 Wayback Machine URL | ### 输出 | 变量 | 默认值 | 描述 | |---|---|---| | `OUTPUT_DIR` | `./output` | 下载文件的输出目录 | ### 优化 | 变量 | 默认值 | 描述 | |---|---|---| | `OPTIMIZE_HTML` | `true` | 压缩 HTML | | `OPTIMIZE_IMAGES` | `false` | 压缩图片 | | `MINIFY_JS` | `false` | 压缩 JavaScript | | `MINIFY_CSS` | `false` | 压缩 CSS | ### 内容移除 | 变量 | 默认值 | 描述 | |---|---|---| | `REMOVE_TRACKERS` | `true` | 移除分析和追踪器 | | `REMOVE_ADS` | `true` | 移除广告 | | `REMOVE_CLICKABLE_CONTACTS` | `true` | 移除 `tel:` 和 `mailto:` 链接 | | `REMOVE_EXTERNAL_IFRAMES` | `false` | 移除外部 iframe | ### 链接处理 | 变量 | 默认值 | 描述 | |---|---|---| | `REMOVE_EXTERNAL_LINKS_KEEP_ANCHORS` | `true` | 移除外部链接,保留锚文本 | | `REMOVE_EXTERNAL_LINKS_REMOVE_ANCHORS` | `false` | 移除外部链接和锚元素 | | `MAKE_INTERNAL_LINKS_RELATIVE` | `true` | 将内部链接转换为相对路径 | ### 域名 | 变量 | 默认值 | 描述 | |---|---|---| | `MAKE_NON_WWW` | `true` | 将 www 转换为非 www | | `MAKE_WWW` | `false` | 将非 www 转换为 www | | `KEEP_REDIRECTIONS` | `false` | 保留重定向页面 | ### 测试 | 变量 | 默认值 | 描述 | |---|---|---| | `MAX_FILES` | 无限制 | 限制要下载的文件数量 | ## 用法 ### macOS / Linux ``` export WAYBACK_URL="https://web.archive.org/web/20250417203037/http://example.com/" export OUTPUT_DIR="./my_website" export REMOVE_CLICKABLE_CONTACTS="false" # Keep email/phone links python3 -m wayback_archive.cli ``` ### Windows (PowerShell) ``` $env:WAYBACK_URL = "https://web.archive.org/web/20250417203037/http://example.com/" $env:OUTPUT_DIR = ".\my_website" $env:REMOVE_CLICKABLE_CONTACTS = "false" python -m wayback_archive.cli ``` ### Windows (CMD) ``` set WAYBACK_URL=https://web.archive.org/web/20250417203037/http://example.com/ set OUTPUT_DIR=.\my_website set REMOVE_CLICKABLE_CONTACTS=false python -m wayback_archive.cli ``` ### 快速测试 下载有限数量的文件以验证一切正常: ``` export WAYBACK_URL="https://web.archive.org/web/20250417203037/http://example.com/" export MAX_FILES=5 python3 -m wayback_archive.cli ``` ## 工作原理 1. **初始下载** —— 从 Wayback Machine 获取主页 2. **链接提取** —— 解析 HTML 以查找所有引用的资产(链接、图片、CSS、JS) 3. **CSS 处理** —— 提取字体 URL、背景图片和 `@import` 语句;本地下载 Google Fonts;检测损坏的字体文件 4. **JS 处理** —— 从 JavaScript 中提取动态加载的资源 5. **Data 属性** —— 扫描 `data-*` 属性以查找额外的资产 URL 6. **迭代爬取** —— 持续发现和下载资源,直到队列为空 7. **时间范围回退** —— 对于 404 响应,搜索附近的 Wayback Machine 时间戳 8. **URL 重写** —— 将所有 URL 转换为相对路径以供离线服务 9. **保留** —— 维护图标组、按钮链接和 Cookie 同意功能 ## 项目结构 ``` Wayback-Archive/ wayback_archive/ # Main package __init__.py __main__.py cli.py # CLI entry point config.py # Environment variable configuration downloader.py # Core download and processing engine config/ requirements.txt # Runtime dependencies requirements-dev.txt # Development dependencies setup.py # Package setup pytest.ini # Test configuration tests/ # Test suite docs/ # Documentation LICENSE # GPL-3.0 README.md ``` ## 测试 ``` pip install -r config/requirements-dev.txt # 运行测试 pytest # 运行测试并生成 coverage pytest --cov=wayback_archive ``` ## 故障排除 ### 端口已被占用 ``` python3 -m http.server 8080 # Use a different port ``` ### 字体加载问题 - **Google Fonts**:自动下载以避免 CORS 问题 - **损坏的字体**:自动从 CSS 中检测并移除 - **缺失的字体**:某些字体可能不存在于 Wayback Machine 归档中 详情请参阅 [字体加载研究笔记](docs/FONT_LOADING.md)。 ### 缺失链接或图标 - 图标组(社交媒体、联系方式)会自动保留 - 带有 `sppb-btn` 或 `btn` 类的按钮链接会被保留 - 设置 `REMOVE_CLICKABLE_CONTACTS=false` 以保留 `tel:` 和 `mailto:` 链接 ### jQuery 或库未加载 该工具包含针对关键库的自动 CDN 回退功能。如果从 Wayback Machine 下载文件失败,它将尝试从 CDN 获取。 ## 依赖项 | 包 | 用途 | |---|---| | [requests](https://pypi.org/project/requests/) | HTTP 客户端 | | [beautifulsoup4](https://pypi.org/project/beautifulsoup4/) | HTML 解析 | | [lxml](https://pypi.org/project/lxml/) | 快速 HTML/XML 解析器 | | [minify-html](https://pypi.org/project/minify-html/) | HTML 压缩 | | [cssmin](https://pypi.org/project/cssmin/) | CSS 压缩 | | [rjsmin](https://pypi.org/project/rjsmin/) | JS 压缩 | | [Pillow](https://pypi.org/project/Pillow/) | 图片优化 | | [python-dotenv](https://pypi.org/project/python-dotenv/) | `.env` 文件支持 | ## 贡献 欢迎贡献。请随时提交 Pull Request。 ## 许可证 本项目根据 [GNU General Public License v3.0](LICENSE) (GPL-3.0) 授权。
标签:ESC4, OSINT, Python, URL 重写, Wayback Machine, 二进制发布, 历史快照, 反汇编, 密码管理, 开源工具, 数字取证, 数据恢复, 无后门, 离线浏览, 网站下载, 网站克隆, 网络归档, 自动化脚本, 资产保全, 逆向工具, 静态网站生成