From 8f2455729618edcfc13edd8aa31a9d5d8d3a08d1 Mon Sep 17 00:00:00 2001 From: test01 Date: Sun, 4 Jan 2026 17:35:59 +0800 Subject: [PATCH] Add mirror feature v1.6.0 --- .gitignore | 5 +++ README.md | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++ workers.js | 2 +- 3 files changed, 117 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e380824..1aca035 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,8 @@ edgetunnel_proxy.py test.py test_*.py *.html + +# 镜像输出目录 +mirror/ +*_mirror/ +test_mirror_*/ diff --git a/README.md b/README.md index 163698c..9e5b397 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ Cloudflare Workers 免费版每日 100,000 请求,无需信用卡,无需付 - **支持流式响应**,高效处理大文件下载 - **支持 TLS 指纹模拟**(基于 curl_cffi),可模拟 Chrome/Safari/Firefox/Edge 浏览器指纹 - **支持 IP 地图可视化**(基于 MapLibre GL),生成 HTML 地图文件,显示代理 IP 地理位置 +- **支持网页镜像**(基于 Playwright + BeautifulSoup),一键保存完整网页到本地,自动下载所有资源 - 完全免费,Workers 免费版每日 100,000 请求 ## 测试结果 @@ -131,6 +132,7 @@ Cloudflare Workers 免费版每日 100,000 请求,无需信用卡,无需付 | 浏览器(VLESS) | OK | Cloudflare IP 出口 | | 浏览器(无代理) | OK | 本地 IP 出口 | | IP 地图可视化 | OK | 生成 HTML 地图文件 | +| 网页镜像 | OK | 保存完整网页到本地 | ## 部署 Workers @@ -714,6 +716,115 @@ print(f"东京: {nrt['city']}, {nrt['country']} ({nrt['lat']}, {nrt['lng']})") - **节点列表**:显示所有使用的 Cloudflare 节点代码 - **自动缩放**:地图自动缩放到数据范围 +## 网页镜像 + +CFspider 支持将网页完整镜像到本地,包括 HTML、CSS、JavaScript、图片、字体等所有资源,并自动重写链接,实现离线浏览。 + +### 基本用法 + +```python +import cfspider + +# 镜像网页到本地,自动打开浏览器预览 +result = cfspider.mirror("https://httpbin.org", open_browser=True) + +print(f"保存位置: {result.index_file}") +print(f"资源目录: {result.assets_dir}") +print(f"总文件数: {result.total_files}") +print(f"总大小: {result.total_size / 1024:.2f} KB") +``` + +### 指定保存目录 + +```python +import cfspider + +# 指定保存目录,不自动打开浏览器 +result = cfspider.mirror( + "https://example.com", + save_dir="./my_mirror", + open_browser=False +) +``` + +### 配合代理使用 + +```python +import cfspider + +# 使用 VLESS 代理镜像网页 +result = cfspider.mirror( + "https://httpbin.org", + save_dir="./mirror_output", + cf_proxies="vless://uuid@v2.example.com:443?path=/", + open_browser=True +) +``` + +### 高级选项 + +```python +import cfspider + +result = cfspider.mirror( + "https://example.com", + save_dir="./output", + open_browser=True, + timeout=60, # 请求超时时间(秒) + max_workers=10 # 并发下载线程数 +) +``` + +### 目录结构 + +镜像完成后的目录结构如下: + +``` +save_dir/ +├── index.html # 主页面(链接已重写为相对路径) +└── assets/ + ├── css/ + │ └── style.css + ├── js/ + │ └── main.js + ├── images/ + │ ├── logo.png + │ └── banner.jpg + ├── fonts/ + │ └── roboto.woff2 + └── other/ + └── favicon.ico +``` + +### MirrorResult 对象 + +| 属性 | 类型 | 说明 | +|------|------|------| +| index_file | str | 主 HTML 文件路径 | +| assets_dir | str | 资源目录路径 | +| total_files | int | 下载的文件总数 | +| total_size | int | 总大小(字节) | +| failed_urls | list | 下载失败的 URL 列表 | +| success | bool | 是否成功 | + +### 镜像 API 参考 + +| 方法 | 说明 | +|------|------| +| `cfspider.mirror(url, **kwargs)` | 镜像网页到本地 | +| `cfspider.MirrorResult` | 镜像结果类 | +| `cfspider.WebMirror(**kwargs)` | 镜像器类 | + +### 镜像功能特性 + +- **完整资源保存**:自动下载 CSS、JS、图片、字体等所有资源 +- **CSS 资源解析**:自动解析 CSS 中的 `url()` 引用(背景图、字体等) +- **链接重写**:将绝对 URL 自动转换为相对路径 +- **并发下载**:多线程并发下载资源,提高效率 +- **代理支持**:支持 VLESS、HTTP、SOCKS5 代理 +- **浏览器渲染**:使用 Playwright 渲染 JavaScript 动态页面 +- **自动预览**:下载完成后自动打开浏览器预览 + ## 浏览器模式 CFspider 支持浏览器模式,可以渲染 JavaScript 动态页面、截图、生成 PDF、自动化操作等。 diff --git a/workers.js b/workers.js index c4484b9..bf18994 100644 --- a/workers.js +++ b/workers.js @@ -2,7 +2,7 @@ // 支持:同步/异步请求、TLS指纹模拟、浏览器自动化 let 反代IP = ''; -const VERSION = '1.5.1'; +const VERSION = '1.6.0'; const START_TIME = Date.now(); export default {