cfspider 1.7.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cfspider/__init__.py +230 -0
- cfspider/api.py +937 -0
- cfspider/async_api.py +418 -0
- cfspider/async_session.py +281 -0
- cfspider/browser.py +335 -0
- cfspider/cli.py +81 -0
- cfspider/impersonate.py +388 -0
- cfspider/ip_map.py +522 -0
- cfspider/mirror.py +682 -0
- cfspider/session.py +239 -0
- cfspider/stealth.py +537 -0
- cfspider/vless_client.py +572 -0
- cfspider-1.7.4.dist-info/METADATA +1390 -0
- cfspider-1.7.4.dist-info/RECORD +18 -0
- cfspider-1.7.4.dist-info/WHEEL +5 -0
- cfspider-1.7.4.dist-info/entry_points.txt +2 -0
- cfspider-1.7.4.dist-info/licenses/LICENSE +201 -0
- cfspider-1.7.4.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1390 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cfspider
|
|
3
|
+
Version: 1.7.4
|
|
4
|
+
Summary: Cloudflare Workers proxy IP pool client
|
|
5
|
+
Author-email: violettools <violet@violetteam.cloud>
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://spider.violetteam.cloud
|
|
8
|
+
Project-URL: Repository, https://github.com/violettoolssite/CFspider
|
|
9
|
+
Keywords: cloudflare,workers,proxy,spider
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Requires-Python: >=3.8
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Requires-Dist: requests>=2.20.0
|
|
17
|
+
Requires-Dist: httpx[http2]>=0.25.0
|
|
18
|
+
Requires-Dist: curl_cffi>=0.5.0
|
|
19
|
+
Requires-Dist: beautifulsoup4>=4.9.0
|
|
20
|
+
Provides-Extra: browser
|
|
21
|
+
Requires-Dist: playwright>=1.40.0; extra == "browser"
|
|
22
|
+
Dynamic: license-file
|
|
23
|
+
|
|
24
|
+
# CFspider - Cloudflare Workers Spider
|
|
25
|
+
|
|
26
|
+
免费的代理 IP 池,利用 Cloudflare 全球 300+ 边缘节点作为出口,支持隐身模式、TLS 指纹模拟、网页镜像和浏览器自动化。
|
|
27
|
+
|
|
28
|
+
## 📸 项目截图
|
|
29
|
+
|
|
30
|
+
### 官网首页
|
|
31
|
+
|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
### Workers 部署界面
|
|
35
|
+
|
|
36
|
+

|
|
37
|
+
|
|
38
|
+
## 视频教程
|
|
39
|
+
|
|
40
|
+
**如何用 Cloudflare Workers 免费搭建代理 IP 池**
|
|
41
|
+
|
|
42
|
+
- [点击观看 B 站视频教程](https://b23.tv/1uzOf7M)
|
|
43
|
+
- [点击观看 YouTube 视频教程](https://youtu.be/oPeXiIFJ9TA?si=ukXsX8iP86ZTB4LP)
|
|
44
|
+
|
|
45
|
+
> ⚠️ **重要声明**:本项目仅供学习研究、网络安全测试、合规数据采集等**合法用途**。使用者须遵守所在地法律法规及 Cloudflare 服务条款。**任何非法使用(包括但不限于网络攻击、侵犯隐私、规避版权保护等)均与本项目开发者无关,使用者自行承担全部法律责任。**
|
|
46
|
+
|
|
47
|
+
## 代理方案对比
|
|
48
|
+
|
|
49
|
+
| 代理方案 | 价格 | IP 质量 | 速度 | 稳定性 | IP 数量 | 反爬能力 |
|
|
50
|
+
|---------|------|---------|------|--------|---------|----------|
|
|
51
|
+
| **CFspider (Workers)** | **免费** | **企业级** | **极快** | **99.9%** | **300+ 节点** | **强** |
|
|
52
|
+
| 直接爬取 CF CDN IP | 免费 | 无法使用 | - | 无法连接 | 理论很多 | 无 |
|
|
53
|
+
| 住宅代理 / 家庭代理 | $5-15/GB | 极高 | 中等 | 中等 | 百万+ | 极强 |
|
|
54
|
+
| 数据中心代理 | $1-5/月 | 中等 | 快 | 高 | 有限 | 中等 |
|
|
55
|
+
| 免费公共代理 | 免费 | 极差 | 慢 | <10% | 数千 | 弱 |
|
|
56
|
+
| VPN 服务 | $3-12/月 | 中等 | 中等 | 高 | 数十服务器 | 中等 |
|
|
57
|
+
| 自建代理服务器 | $5-50/月 | 取决于IP | 快 | 高 | 1个 | 弱 |
|
|
58
|
+
|
|
59
|
+
### 合规使用 vs 违规滥用
|
|
60
|
+
|
|
61
|
+
| 对比项 | 违规滥用:直接攻击 CF CDN IP | CFspider 官方方式:Workers 部署 |
|
|
62
|
+
|--------|------------------------------|--------------------------------|
|
|
63
|
+
| **本质** | 撬锁硬闯公共大门 | 租用独立办公室 |
|
|
64
|
+
| **行为性质** | 对基础设施的违规滥用 | 合规使用计算服务 |
|
|
65
|
+
| **IP 信誉** | 极易被封,污染 IP 池 | 信誉相对更高 |
|
|
66
|
+
| **影响范围** | 害人害己,殃及无辜 | 风险自担,行为可控 |
|
|
67
|
+
| **法律风险** | 高风险,可能违反计算机滥用法规 | 低风险,遵守 Cloudflare TOS |
|
|
68
|
+
| **可持续性** | 不可持续,IP 被封后需不断寻找 | 长期可用,Workers 稳定运行 |
|
|
69
|
+
| **数据控制** | 无法控制 | 完全可控,有完整日志 |
|
|
70
|
+
|
|
71
|
+
**违规滥用方式:**
|
|
72
|
+
```python
|
|
73
|
+
# 错误示范 - 直接使用 CF CDN IP
|
|
74
|
+
proxies = {"http": "172.64.155.xxx:80"}
|
|
75
|
+
requests.get(url, proxies=proxies) # 无法工作且违规!
|
|
76
|
+
```
|
|
77
|
+
- 直接使用 172.64.x.x、104.21.x.x 等公共 CDN IP
|
|
78
|
+
- 这属于**对基础设施的违规滥用**
|
|
79
|
+
- 流量会**污染 IP 池**,极易被封
|
|
80
|
+
- 导致该 IP 段上其他正常网站遭殃
|
|
81
|
+
- 可能触发 Cloudflare 安全机制被封禁
|
|
82
|
+
- 存在法律风险
|
|
83
|
+
|
|
84
|
+
**CFspider 官方方式:**
|
|
85
|
+
```python
|
|
86
|
+
# 正确方式 - 使用你的 Workers
|
|
87
|
+
import cfspider
|
|
88
|
+
cfspider.get(url, cf_proxies="你的.workers.dev")
|
|
89
|
+
```
|
|
90
|
+
- 在你的 Cloudflare 账户中部署个人 Workers 脚本
|
|
91
|
+
- 这属于**合规使用 Cloudflare 计算服务**
|
|
92
|
+
- 流量来自你的独立 Worker,行为可控
|
|
93
|
+
- IP 信誉由 Cloudflare 维护,相对更高
|
|
94
|
+
- 符合 Cloudflare 服务条款
|
|
95
|
+
|
|
96
|
+
**简单说:一个是在撬锁硬闯公共大门(违规、害人害己),一个是在租用大楼里的独立办公室(合规、风险自担)。**
|
|
97
|
+
|
|
98
|
+
### 各方案详解
|
|
99
|
+
|
|
100
|
+
**直接爬取 Cloudflare CDN IP**
|
|
101
|
+
- Cloudflare CDN IP(如 172.64.x.x、104.21.x.x)是 Anycast IP
|
|
102
|
+
- 无法直接作为 HTTP/SOCKS5 代理使用
|
|
103
|
+
- 即使扫描出在线 IP,也无法建立代理连接
|
|
104
|
+
- CDN IP 仅用于边缘加速,不提供代理服务
|
|
105
|
+
|
|
106
|
+
**住宅代理 / 家庭代理**
|
|
107
|
+
- 使用真实家庭网络 IP,反爬能力最强
|
|
108
|
+
- 价格昂贵,按流量计费($5-15/GB)
|
|
109
|
+
- 部分服务存在合规风险
|
|
110
|
+
- 适合对匿名性要求极高的商业爬虫场景
|
|
111
|
+
|
|
112
|
+
**数据中心代理**
|
|
113
|
+
- 速度快、价格适中
|
|
114
|
+
- IP 容易被识别为机房 IP
|
|
115
|
+
- 被大型网站封禁概率较高
|
|
116
|
+
- 适合目标网站防护较弱的场景
|
|
117
|
+
|
|
118
|
+
**免费公共代理**
|
|
119
|
+
- 完全免费但质量极差
|
|
120
|
+
- 可用率通常低于 10%
|
|
121
|
+
- 速度慢、不稳定
|
|
122
|
+
- 存在安全风险(可能被中间人攻击)
|
|
123
|
+
|
|
124
|
+
**CFspider 优势**
|
|
125
|
+
- 利用 Cloudflare Workers 的边缘计算能力
|
|
126
|
+
- 请求从 Cloudflare 300+ 全球节点发出
|
|
127
|
+
- IP 是 Cloudflare 企业级 IP(与大量正常网站共用)
|
|
128
|
+
- 不易被封禁,且完全免费
|
|
129
|
+
- Workers 免费版每日 100,000 请求
|
|
130
|
+
|
|
131
|
+
## 核心优势
|
|
132
|
+
|
|
133
|
+
### 企业级 IP 信誉
|
|
134
|
+
Cloudflare IP (AS13335) 被全球数百万网站使用,包括 Discord、Shopify、Medium 等知名服务。这些 IP 拥有极高的信誉度,不会像普通代理 IP 那样被轻易封禁。
|
|
135
|
+
|
|
136
|
+
### 零成本运营
|
|
137
|
+
Cloudflare Workers 免费版每日 100,000 请求,无需信用卡,无需付费。相比住宅代理每月数百美元的费用,这是真正的零成本方案。
|
|
138
|
+
|
|
139
|
+
### 全球边缘网络
|
|
140
|
+
请求自动路由到离目标网站最近的 Cloudflare 边缘节点。全球 100+ 个国家,300+ 个数据中心,确保最低延迟。
|
|
141
|
+
|
|
142
|
+
### Serverless 无服务器
|
|
143
|
+
无需购买服务器、无需运维、无需担心扩容。Cloudflare 自动处理所有基础设施,冷启动时间接近零毫秒。
|
|
144
|
+
|
|
145
|
+
### 数据完全可控
|
|
146
|
+
代码部署在你自己的 Cloudflare 账户,请求日志、访问数据完全由你掌控。100% 的隐私和控制权。
|
|
147
|
+
|
|
148
|
+
### 企业级安全
|
|
149
|
+
所有请求自动享受 Cloudflare 的 DDoS 防护、WAF 防火墙、SSL/TLS 加密。
|
|
150
|
+
|
|
151
|
+
## 适用场景
|
|
152
|
+
|
|
153
|
+
| 场景 | 说明 |
|
|
154
|
+
|------|------|
|
|
155
|
+
| 数据采集 / 爬虫 | 采集公开数据时避免 IP 被封禁,适合新闻聚合、价格监控、市场调研 |
|
|
156
|
+
| SEO 监控 | 从不同地理位置检查搜索引擎排名、网站可访问性 |
|
|
157
|
+
| 网站可用性测试 | 从全球各地测试网站的响应时间和可用性 |
|
|
158
|
+
| API 聚合服务 | 调用多个第三方 API 时隐藏真实服务器 IP |
|
|
159
|
+
| 内容验证 | 验证 CDN 缓存、检查不同地区的内容分发 |
|
|
160
|
+
| 学术研究 | 网络研究、互联网测量、安全研究等学术项目 |
|
|
161
|
+
|
|
162
|
+
## 技术架构
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
+------------------+ +----------------------+ +------------------+
|
|
166
|
+
| | | Cloudflare Edge | | |
|
|
167
|
+
| Your Python | ---> | Workers (300+) | ---> | Target Website |
|
|
168
|
+
| Application | | Global Nodes | | |
|
|
169
|
+
| | +----------------------+ +------------------+
|
|
170
|
+
+------------------+ |
|
|
171
|
+
| v
|
|
172
|
+
v +----------------------+
|
|
173
|
+
+------------------+ | Cloudflare IP Pool |
|
|
174
|
+
| cfspider lib | | 172.64.x.x |
|
|
175
|
+
| requests-like | | 104.21.x.x |
|
|
176
|
+
+------------------+ | 162.159.x.x ... |
|
|
177
|
+
+----------------------+
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**工作流程:**
|
|
181
|
+
1. 你的应用调用 `cfspider.get(url, cf_proxies="workers.dev")`
|
|
182
|
+
2. CFspider 发送请求到你的 Cloudflare Workers
|
|
183
|
+
3. Workers 从最近的边缘节点获取目标 URL
|
|
184
|
+
4. 响应返回,目标网站看到的是 Cloudflare IP,而不是你的 IP
|
|
185
|
+
|
|
186
|
+
## 特性
|
|
187
|
+
|
|
188
|
+
- 使用 Cloudflare 全球 300+ 边缘节点 IP
|
|
189
|
+
- 与 requests 库语法一致,无学习成本
|
|
190
|
+
- 支持 GET、POST、PUT、DELETE 等所有 HTTP 方法
|
|
191
|
+
- 支持 Session 会话管理
|
|
192
|
+
- 返回 Cloudflare 节点信息(cf_colo、cf_ray)
|
|
193
|
+
- **支持浏览器模式**,可渲染 JavaScript 动态页面、截图、自动化操作
|
|
194
|
+
- **支持多种代理方式**:HTTP 代理、SOCKS5 代理、VLESS 链接(支持直接填写完整链接)
|
|
195
|
+
- **支持异步请求**(基于 httpx),可使用 async/await 语法
|
|
196
|
+
- **支持 HTTP/2 协议**,更快的连接复用和性能
|
|
197
|
+
- **支持流式响应**,高效处理大文件下载
|
|
198
|
+
- **支持 TLS 指纹模拟**(基于 curl_cffi),可模拟 Chrome/Safari/Firefox/Edge 浏览器指纹
|
|
199
|
+
- **支持 IP 地图可视化**(基于 MapLibre GL),生成 HTML 地图文件,显示代理 IP 地理位置
|
|
200
|
+
- **支持网页镜像**(基于 Playwright + BeautifulSoup),一键保存完整网页到本地,自动下载所有资源
|
|
201
|
+
- **支持隐身模式**:自动添加完整浏览器请求头(Sec-Fetch-*、Accept-* 等 15+ 个头)
|
|
202
|
+
- **支持会话一致性**(StealthSession):保持 User-Agent 和 Cookie 一致,模拟真实用户
|
|
203
|
+
- **支持行为模拟**:请求随机延迟、自动 Referer、多浏览器指纹轮换
|
|
204
|
+
- 完全免费,Workers 免费版每日 100,000 请求
|
|
205
|
+
|
|
206
|
+
## 测试结果
|
|
207
|
+
|
|
208
|
+
| 功能 | 状态 | 说明 |
|
|
209
|
+
|------|------|------|
|
|
210
|
+
| HTTP GET 请求 | OK | 返回 Cloudflare IP |
|
|
211
|
+
| HTTP POST 请求 | OK | 发送数据成功 |
|
|
212
|
+
| 自定义 Headers | OK | Header 正确传递 |
|
|
213
|
+
| Session 会话 | OK | 多次请求正常 |
|
|
214
|
+
| Workers Debug | OK | 返回 CF 机房信息 |
|
|
215
|
+
| 浏览器(HTTP代理) | OK | 支持本地/远程代理 |
|
|
216
|
+
| 浏览器(VLESS) | OK | Cloudflare IP 出口 |
|
|
217
|
+
| 浏览器(无代理) | OK | 本地 IP 出口 |
|
|
218
|
+
| IP 地图可视化 | OK | 生成 HTML 地图文件 |
|
|
219
|
+
| 网页镜像 | OK | 保存完整网页到本地 |
|
|
220
|
+
| 隐身模式 | OK | 自动添加 15+ 个请求头 |
|
|
221
|
+
| StealthSession | OK | 会话一致性、自动 Referer |
|
|
222
|
+
| 随机延迟 | OK | 请求间随机等待 |
|
|
223
|
+
|
|
224
|
+
## 部署 Workers
|
|
225
|
+
|
|
226
|
+
1. 登录 [Cloudflare Dashboard](https://dash.cloudflare.com/)
|
|
227
|
+
2. 进入 Workers & Pages
|
|
228
|
+
3. 点击 Create application → Create Worker
|
|
229
|
+
4. 将 `workers.js` 代码粘贴到编辑器中
|
|
230
|
+
5. 点击 Deploy
|
|
231
|
+
|
|
232
|
+
部署完成后,你将获得一个 Workers 地址,如 `https://xxx.username.workers.dev`
|
|
233
|
+
|
|
234
|
+
如需自定义域名,可在 Worker → Settings → Triggers → Custom Domain 中添加。
|
|
235
|
+
|
|
236
|
+
### Token 鉴权配置(可选)
|
|
237
|
+
|
|
238
|
+
为了增强安全性,你可以为 Workers 配置 Token 鉴权:
|
|
239
|
+
|
|
240
|
+
1. 在 Worker → Settings → Variables and Secrets 中添加环境变量
|
|
241
|
+
2. 变量名:`TOKEN`
|
|
242
|
+
3. 变量值:你的 token(支持多个 token,用逗号分隔,如 `token1,token2,token3`)
|
|
243
|
+
4. 保存并重新部署 Worker
|
|
244
|
+
|
|
245
|
+
配置 Token 后,所有 API 请求(除了首页和 debug 页面)都需要提供有效的 token:
|
|
246
|
+
|
|
247
|
+
```python
|
|
248
|
+
import cfspider
|
|
249
|
+
|
|
250
|
+
# 在请求时传递 token
|
|
251
|
+
response = cfspider.get(
|
|
252
|
+
"https://httpbin.org/ip",
|
|
253
|
+
cf_proxies="https://your-workers.dev",
|
|
254
|
+
token="your-token" # 从查询参数传递
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
# 或在 Session 中设置 token
|
|
258
|
+
with cfspider.Session(
|
|
259
|
+
cf_proxies="https://your-workers.dev",
|
|
260
|
+
token="your-token"
|
|
261
|
+
) as session:
|
|
262
|
+
response = session.get("https://httpbin.org/ip")
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**注意:**
|
|
266
|
+
- 如果不配置 `TOKEN` 环境变量,则所有请求都可以访问(无鉴权)
|
|
267
|
+
- Token 可以通过查询参数 `?token=xxx` 或 Header `Authorization: Bearer xxx` 传递
|
|
268
|
+
- 支持配置多个 token,用逗号分隔
|
|
269
|
+
|
|
270
|
+
## 安装
|
|
271
|
+
|
|
272
|
+
### 方式一:PyPI 安装(推荐)
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
pip install cfspider
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
> **注意**:Python 3.11+ 在 Debian/Ubuntu 上可能提示 `externally-managed-environment` 错误,请使用以下任一方式解决:
|
|
279
|
+
>
|
|
280
|
+
> ```bash
|
|
281
|
+
> # 方式 A:使用虚拟环境(推荐)
|
|
282
|
+
> python3 -m venv venv
|
|
283
|
+
> source venv/bin/activate
|
|
284
|
+
> pip install cfspider
|
|
285
|
+
>
|
|
286
|
+
> # 方式 B:使用 pipx
|
|
287
|
+
> pipx install cfspider
|
|
288
|
+
>
|
|
289
|
+
> # 方式 C:强制安装(不推荐)
|
|
290
|
+
> pip install cfspider --break-system-packages
|
|
291
|
+
> ```
|
|
292
|
+
|
|
293
|
+
### 方式二:国内镜像源安装
|
|
294
|
+
|
|
295
|
+
如果 PyPI 访问较慢,可使用国内镜像:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
# 清华源
|
|
299
|
+
pip install cfspider -i https://pypi.tuna.tsinghua.edu.cn/simple
|
|
300
|
+
|
|
301
|
+
# 阿里云源
|
|
302
|
+
pip install cfspider -i https://mirrors.aliyun.com/pypi/simple
|
|
303
|
+
|
|
304
|
+
# 中科大源
|
|
305
|
+
pip install cfspider -i https://pypi.mirrors.ustc.edu.cn/simple
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### 方式三:从 GitHub 安装
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
pip install git+https://github.com/violettoolssite/CFspider.git
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### 安装浏览器功能(可选)
|
|
315
|
+
|
|
316
|
+
如需使用浏览器模式,需要额外安装:
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
# 安装带浏览器支持的 cfspider
|
|
320
|
+
pip install cfspider[browser]
|
|
321
|
+
|
|
322
|
+
# 安装 Chromium 浏览器
|
|
323
|
+
cfspider install
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## 快速开始
|
|
327
|
+
|
|
328
|
+
### HTTP 代理请求
|
|
329
|
+
|
|
330
|
+
```python
|
|
331
|
+
import cfspider
|
|
332
|
+
|
|
333
|
+
cf_proxies = "https://your-workers.dev"
|
|
334
|
+
|
|
335
|
+
response = cfspider.get("https://httpbin.org/ip", cf_proxies=cf_proxies)
|
|
336
|
+
print(response.text)
|
|
337
|
+
# {"origin": "2a06:98c0:3600::103, 172.71.24.151"} # Cloudflare IP
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### 浏览器模式
|
|
341
|
+
|
|
342
|
+
```python
|
|
343
|
+
import cfspider
|
|
344
|
+
|
|
345
|
+
# 使用本地 HTTP 代理
|
|
346
|
+
browser = cfspider.Browser(cf_proxies="127.0.0.1:9674")
|
|
347
|
+
html = browser.html("https://httpbin.org/ip")
|
|
348
|
+
print(html)
|
|
349
|
+
browser.close()
|
|
350
|
+
|
|
351
|
+
# 使用 VLESS 链接(推荐,无需填写 UUID)
|
|
352
|
+
browser = cfspider.Browser(
|
|
353
|
+
cf_proxies="vless://your-uuid@v2.example.com:443?path=/"
|
|
354
|
+
)
|
|
355
|
+
html = browser.html("https://httpbin.org/ip")
|
|
356
|
+
print(html) # 返回 Cloudflare IP
|
|
357
|
+
browser.close()
|
|
358
|
+
|
|
359
|
+
# 使用 edgetunnel 域名 + UUID(旧方式)
|
|
360
|
+
browser = cfspider.Browser(
|
|
361
|
+
cf_proxies="v2.example.com",
|
|
362
|
+
vless_uuid="your-vless-uuid"
|
|
363
|
+
)
|
|
364
|
+
html = browser.html("https://httpbin.org/ip")
|
|
365
|
+
browser.close()
|
|
366
|
+
|
|
367
|
+
# 无代理模式
|
|
368
|
+
browser = cfspider.Browser()
|
|
369
|
+
html = browser.html("https://example.com")
|
|
370
|
+
browser.close()
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
## API 参考
|
|
374
|
+
|
|
375
|
+
### 请求方法
|
|
376
|
+
|
|
377
|
+
CFspider 支持以下 HTTP 方法,语法与 requests 库一致:
|
|
378
|
+
|
|
379
|
+
```python
|
|
380
|
+
import cfspider
|
|
381
|
+
|
|
382
|
+
cf_proxies = "https://your-workers.dev"
|
|
383
|
+
|
|
384
|
+
cfspider.get(url, cf_proxies=cf_proxies)
|
|
385
|
+
cfspider.post(url, cf_proxies=cf_proxies, json=data)
|
|
386
|
+
cfspider.put(url, cf_proxies=cf_proxies, data=data)
|
|
387
|
+
cfspider.delete(url, cf_proxies=cf_proxies)
|
|
388
|
+
cfspider.head(url, cf_proxies=cf_proxies)
|
|
389
|
+
cfspider.options(url, cf_proxies=cf_proxies)
|
|
390
|
+
cfspider.patch(url, cf_proxies=cf_proxies, json=data)
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### 请求参数
|
|
394
|
+
|
|
395
|
+
| 参数 | 类型 | 说明 |
|
|
396
|
+
|------|------|------|
|
|
397
|
+
| url | str | 目标 URL |
|
|
398
|
+
| cf_proxies | str | Workers 地址(必填) |
|
|
399
|
+
| params | dict | URL 查询参数 |
|
|
400
|
+
| data | dict/str | 表单数据 |
|
|
401
|
+
| json | dict | JSON 数据 |
|
|
402
|
+
| headers | dict | 请求头 |
|
|
403
|
+
| cookies | dict | Cookies |
|
|
404
|
+
| timeout | int/float | 超时时间(秒) |
|
|
405
|
+
|
|
406
|
+
### 响应对象
|
|
407
|
+
|
|
408
|
+
| 属性 | 类型 | 说明 |
|
|
409
|
+
|------|------|------|
|
|
410
|
+
| text | str | 响应文本 |
|
|
411
|
+
| content | bytes | 响应字节 |
|
|
412
|
+
| json() | dict | 解析 JSON |
|
|
413
|
+
| status_code | int | HTTP 状态码 |
|
|
414
|
+
| headers | dict | 响应头 |
|
|
415
|
+
| cf_colo | str | Cloudflare 节点代码(如 NRT) |
|
|
416
|
+
| cf_ray | str | Cloudflare Ray ID |
|
|
417
|
+
|
|
418
|
+
## 使用示例
|
|
419
|
+
|
|
420
|
+
### GET 请求
|
|
421
|
+
|
|
422
|
+
```python
|
|
423
|
+
import cfspider
|
|
424
|
+
|
|
425
|
+
cf_proxies = "https://your-workers.dev"
|
|
426
|
+
|
|
427
|
+
response = cfspider.get(
|
|
428
|
+
"https://httpbin.org/get",
|
|
429
|
+
cf_proxies=cf_proxies,
|
|
430
|
+
params={"key": "value"}
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
print(response.status_code)
|
|
434
|
+
print(response.json())
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### POST 请求
|
|
438
|
+
|
|
439
|
+
```python
|
|
440
|
+
import cfspider
|
|
441
|
+
|
|
442
|
+
cf_proxies = "https://your-workers.dev"
|
|
443
|
+
|
|
444
|
+
response = cfspider.post(
|
|
445
|
+
"https://httpbin.org/post",
|
|
446
|
+
cf_proxies=cf_proxies,
|
|
447
|
+
json={"name": "cfspider", "version": "1.0"}
|
|
448
|
+
)
|
|
449
|
+
|
|
450
|
+
print(response.json())
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### 使用 Session
|
|
454
|
+
|
|
455
|
+
Session 可以复用 Workers 地址,无需每次请求都指定:
|
|
456
|
+
|
|
457
|
+
```python
|
|
458
|
+
import cfspider
|
|
459
|
+
|
|
460
|
+
cf_proxies = "https://your-workers.dev"
|
|
461
|
+
|
|
462
|
+
session = cfspider.Session(cf_proxies=cf_proxies)
|
|
463
|
+
|
|
464
|
+
r1 = session.get("https://httpbin.org/ip")
|
|
465
|
+
r2 = session.post("https://httpbin.org/post", json={"test": 1})
|
|
466
|
+
r3 = session.get("https://example.com")
|
|
467
|
+
|
|
468
|
+
print(r1.text)
|
|
469
|
+
print(r2.json())
|
|
470
|
+
|
|
471
|
+
session.close()
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### 获取 Cloudflare 节点信息
|
|
475
|
+
|
|
476
|
+
```python
|
|
477
|
+
import cfspider
|
|
478
|
+
|
|
479
|
+
cf_proxies = "https://your-workers.dev"
|
|
480
|
+
|
|
481
|
+
response = cfspider.get("https://httpbin.org/ip", cf_proxies=cf_proxies)
|
|
482
|
+
|
|
483
|
+
print(f"出口 IP: {response.json()['origin']}")
|
|
484
|
+
print(f"节点代码: {response.cf_colo}")
|
|
485
|
+
print(f"Ray ID: {response.cf_ray}")
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### 自定义请求头
|
|
489
|
+
|
|
490
|
+
```python
|
|
491
|
+
import cfspider
|
|
492
|
+
|
|
493
|
+
cf_proxies = "https://your-workers.dev"
|
|
494
|
+
|
|
495
|
+
response = cfspider.get(
|
|
496
|
+
"https://httpbin.org/headers",
|
|
497
|
+
cf_proxies=cf_proxies,
|
|
498
|
+
headers={
|
|
499
|
+
"User-Agent": "MyApp/1.0",
|
|
500
|
+
"Accept-Language": "zh-CN"
|
|
501
|
+
}
|
|
502
|
+
)
|
|
503
|
+
|
|
504
|
+
print(response.json())
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### 设置超时
|
|
508
|
+
|
|
509
|
+
```python
|
|
510
|
+
import cfspider
|
|
511
|
+
|
|
512
|
+
cf_proxies = "https://your-workers.dev"
|
|
513
|
+
|
|
514
|
+
response = cfspider.get(
|
|
515
|
+
"https://httpbin.org/delay/5",
|
|
516
|
+
cf_proxies=cf_proxies,
|
|
517
|
+
timeout=10
|
|
518
|
+
)
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### HTTP/2 支持
|
|
522
|
+
|
|
523
|
+
启用 HTTP/2 可以获得更好的性能(连接复用、头部压缩等):
|
|
524
|
+
|
|
525
|
+
> **注意**: `http2` 和 `impersonate` 参数使用不同后端(httpx vs curl_cffi),不能同时启用。
|
|
526
|
+
|
|
527
|
+
```python
|
|
528
|
+
import cfspider
|
|
529
|
+
|
|
530
|
+
cf_proxies = "https://your-workers.dev"
|
|
531
|
+
|
|
532
|
+
# 同步请求启用 HTTP/2
|
|
533
|
+
response = cfspider.get(
|
|
534
|
+
"https://httpbin.org/ip",
|
|
535
|
+
cf_proxies=cf_proxies,
|
|
536
|
+
http2=True
|
|
537
|
+
)
|
|
538
|
+
|
|
539
|
+
print(response.text)
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
## 异步 API(httpx)
|
|
543
|
+
|
|
544
|
+
CFspider 提供基于 httpx 的异步 API,支持 async/await 语法,适合高并发场景。
|
|
545
|
+
|
|
546
|
+
### 异步请求
|
|
547
|
+
|
|
548
|
+
```python
|
|
549
|
+
import asyncio
|
|
550
|
+
import cfspider
|
|
551
|
+
|
|
552
|
+
async def main():
|
|
553
|
+
cf_proxies = "https://your-workers.dev"
|
|
554
|
+
|
|
555
|
+
# 异步 GET 请求
|
|
556
|
+
response = await cfspider.aget("https://httpbin.org/ip", cf_proxies=cf_proxies)
|
|
557
|
+
print(response.text)
|
|
558
|
+
|
|
559
|
+
# 异步 POST 请求
|
|
560
|
+
response = await cfspider.apost(
|
|
561
|
+
"https://httpbin.org/post",
|
|
562
|
+
cf_proxies=cf_proxies,
|
|
563
|
+
json={"key": "value"}
|
|
564
|
+
)
|
|
565
|
+
print(response.json())
|
|
566
|
+
|
|
567
|
+
asyncio.run(main())
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### 异步 Session
|
|
571
|
+
|
|
572
|
+
```python
|
|
573
|
+
import asyncio
|
|
574
|
+
import cfspider
|
|
575
|
+
|
|
576
|
+
async def main():
|
|
577
|
+
cf_proxies = "https://your-workers.dev"
|
|
578
|
+
|
|
579
|
+
async with cfspider.AsyncSession(cf_proxies=cf_proxies) as session:
|
|
580
|
+
# 复用连接,高效执行多个请求
|
|
581
|
+
r1 = await session.get("https://httpbin.org/ip")
|
|
582
|
+
r2 = await session.post("https://httpbin.org/post", json={"test": 1})
|
|
583
|
+
r3 = await session.get("https://example.com")
|
|
584
|
+
|
|
585
|
+
print(r1.text)
|
|
586
|
+
print(r2.json())
|
|
587
|
+
|
|
588
|
+
asyncio.run(main())
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
### 流式响应(大文件下载)
|
|
592
|
+
|
|
593
|
+
```python
|
|
594
|
+
import asyncio
|
|
595
|
+
import cfspider
|
|
596
|
+
|
|
597
|
+
async def download_large_file():
|
|
598
|
+
cf_proxies = "https://your-workers.dev"
|
|
599
|
+
|
|
600
|
+
async with cfspider.astream("GET", "https://example.com/large-file.zip", cf_proxies=cf_proxies) as response:
|
|
601
|
+
with open("large-file.zip", "wb") as f:
|
|
602
|
+
async for chunk in response.aiter_bytes(chunk_size=8192):
|
|
603
|
+
f.write(chunk)
|
|
604
|
+
|
|
605
|
+
asyncio.run(download_large_file())
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
### 并发请求
|
|
609
|
+
|
|
610
|
+
```python
|
|
611
|
+
import asyncio
|
|
612
|
+
import cfspider
|
|
613
|
+
|
|
614
|
+
async def fetch_url(url, cf_proxies):
|
|
615
|
+
response = await cfspider.aget(url, cf_proxies=cf_proxies)
|
|
616
|
+
return response.json()
|
|
617
|
+
|
|
618
|
+
async def main():
|
|
619
|
+
cf_proxies = "https://your-workers.dev"
|
|
620
|
+
|
|
621
|
+
urls = [
|
|
622
|
+
"https://httpbin.org/ip",
|
|
623
|
+
"https://httpbin.org/headers",
|
|
624
|
+
"https://httpbin.org/user-agent"
|
|
625
|
+
]
|
|
626
|
+
|
|
627
|
+
# 并发执行所有请求
|
|
628
|
+
tasks = [fetch_url(url, cf_proxies) for url in urls]
|
|
629
|
+
results = await asyncio.gather(*tasks)
|
|
630
|
+
|
|
631
|
+
for result in results:
|
|
632
|
+
print(result)
|
|
633
|
+
|
|
634
|
+
asyncio.run(main())
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
### 异步 API 参考
|
|
638
|
+
|
|
639
|
+
| 方法 | 说明 |
|
|
640
|
+
|------|------|
|
|
641
|
+
| `cfspider.aget(url, **kwargs)` | 异步 GET 请求 |
|
|
642
|
+
| `cfspider.apost(url, **kwargs)` | 异步 POST 请求 |
|
|
643
|
+
| `cfspider.aput(url, **kwargs)` | 异步 PUT 请求 |
|
|
644
|
+
| `cfspider.adelete(url, **kwargs)` | 异步 DELETE 请求 |
|
|
645
|
+
| `cfspider.ahead(url, **kwargs)` | 异步 HEAD 请求 |
|
|
646
|
+
| `cfspider.aoptions(url, **kwargs)` | 异步 OPTIONS 请求 |
|
|
647
|
+
| `cfspider.apatch(url, **kwargs)` | 异步 PATCH 请求 |
|
|
648
|
+
| `cfspider.astream(method, url, **kwargs)` | 流式请求(上下文管理器) |
|
|
649
|
+
| `cfspider.AsyncSession(**kwargs)` | 异步会话(支持连接池) |
|
|
650
|
+
|
|
651
|
+
## 隐身模式(反爬虫规避)
|
|
652
|
+
|
|
653
|
+
CFspider v1.7.0 新增隐身模式,解决反爬检测中最常见的三个问题:
|
|
654
|
+
|
|
655
|
+
1. **请求头不完整**:自动添加完整的浏览器请求头(15+ 个头)
|
|
656
|
+
2. **会话不一致**:StealthSession 保持 User-Agent、Cookie 一致
|
|
657
|
+
3. **行为模式单一**:支持随机延迟、自动 Referer、浏览器指纹轮换
|
|
658
|
+
|
|
659
|
+
### 基本用法(stealth=True)
|
|
660
|
+
|
|
661
|
+
```python
|
|
662
|
+
import cfspider
|
|
663
|
+
|
|
664
|
+
# 启用隐身模式 - 自动添加完整浏览器请求头
|
|
665
|
+
response = cfspider.get(
|
|
666
|
+
"https://example.com",
|
|
667
|
+
stealth=True
|
|
668
|
+
)
|
|
669
|
+
print(response.text)
|
|
670
|
+
|
|
671
|
+
# 自动添加的请求头包括:
|
|
672
|
+
# - User-Agent (Chrome 131 完整指纹)
|
|
673
|
+
# - Accept, Accept-Language, Accept-Encoding
|
|
674
|
+
# - Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site, Sec-Fetch-User
|
|
675
|
+
# - Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform
|
|
676
|
+
# - Upgrade-Insecure-Requests, Cache-Control, Connection, DNT
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
### 选择浏览器类型
|
|
680
|
+
|
|
681
|
+
```python
|
|
682
|
+
import cfspider
|
|
683
|
+
|
|
684
|
+
# 使用 Firefox 请求头
|
|
685
|
+
response = cfspider.get(
|
|
686
|
+
"https://example.com",
|
|
687
|
+
stealth=True,
|
|
688
|
+
stealth_browser='firefox' # chrome, firefox, safari, edge, chrome_mobile
|
|
689
|
+
)
|
|
690
|
+
|
|
691
|
+
# 查看支持的浏览器
|
|
692
|
+
print(cfspider.STEALTH_BROWSERS)
|
|
693
|
+
# ['chrome', 'firefox', 'safari', 'edge', 'chrome_mobile']
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
### 随机延迟
|
|
697
|
+
|
|
698
|
+
```python
|
|
699
|
+
import cfspider
|
|
700
|
+
|
|
701
|
+
# 每次请求前随机延迟 1-3 秒
|
|
702
|
+
response = cfspider.get(
|
|
703
|
+
"https://example.com",
|
|
704
|
+
stealth=True,
|
|
705
|
+
delay=(1, 3) # 最小 1 秒,最大 3 秒
|
|
706
|
+
)
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
### StealthSession 会话一致性
|
|
710
|
+
|
|
711
|
+
```python
|
|
712
|
+
import cfspider
|
|
713
|
+
|
|
714
|
+
# 隐身会话 - 保持 User-Agent、Cookie 一致
|
|
715
|
+
with cfspider.StealthSession(
|
|
716
|
+
browser='chrome', # 固定浏览器类型
|
|
717
|
+
delay=(0.5, 2.0), # 请求间随机延迟
|
|
718
|
+
auto_referer=True # 自动添加 Referer
|
|
719
|
+
) as session:
|
|
720
|
+
# 第一次请求
|
|
721
|
+
r1 = session.get("https://example.com/page1")
|
|
722
|
+
|
|
723
|
+
# 第二次请求 - 自动带上 Cookie 和 Referer
|
|
724
|
+
r2 = session.get("https://example.com/page2")
|
|
725
|
+
|
|
726
|
+
# 查看会话状态
|
|
727
|
+
print(f"请求次数: {session.request_count}")
|
|
728
|
+
print(f"当前 Cookie: {session.get_cookies()}")
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
### 配合 Workers 代理使用
|
|
732
|
+
|
|
733
|
+
```python
|
|
734
|
+
import cfspider
|
|
735
|
+
|
|
736
|
+
# 隐身模式 + Cloudflare IP 出口
|
|
737
|
+
response = cfspider.get(
|
|
738
|
+
"https://httpbin.org/headers",
|
|
739
|
+
cf_proxies="https://your-workers.dev",
|
|
740
|
+
stealth=True
|
|
741
|
+
)
|
|
742
|
+
print(response.cf_colo) # Cloudflare 节点代码
|
|
743
|
+
|
|
744
|
+
# 隐身会话 + Workers 代理
|
|
745
|
+
with cfspider.StealthSession(
|
|
746
|
+
cf_proxies="https://your-workers.dev",
|
|
747
|
+
browser='chrome'
|
|
748
|
+
) as session:
|
|
749
|
+
r1 = session.get("https://example.com")
|
|
750
|
+
r2 = session.get("https://example.com/api")
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
### 配合 TLS 指纹模拟
|
|
754
|
+
|
|
755
|
+
```python
|
|
756
|
+
import cfspider
|
|
757
|
+
|
|
758
|
+
# 隐身模式 + TLS 指纹模拟(终极反爬方案)
|
|
759
|
+
response = cfspider.get(
|
|
760
|
+
"https://example.com",
|
|
761
|
+
stealth=True,
|
|
762
|
+
impersonate='chrome131' # 模拟 Chrome 131 的 TLS 指纹
|
|
763
|
+
)
|
|
764
|
+
# 同时具备:完整请求头 + 真实 TLS 指纹
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
### 手动获取请求头
|
|
768
|
+
|
|
769
|
+
```python
|
|
770
|
+
import cfspider
|
|
771
|
+
|
|
772
|
+
# 获取指定浏览器的请求头模板
|
|
773
|
+
chrome_headers = cfspider.get_stealth_headers('chrome')
|
|
774
|
+
firefox_headers = cfspider.get_stealth_headers('firefox')
|
|
775
|
+
|
|
776
|
+
# 获取随机浏览器的请求头
|
|
777
|
+
random_headers = cfspider.get_random_browser_headers()
|
|
778
|
+
|
|
779
|
+
# 使用预定义的请求头常量
|
|
780
|
+
from cfspider import CHROME_HEADERS, FIREFOX_HEADERS, SAFARI_HEADERS
|
|
781
|
+
```
|
|
782
|
+
|
|
783
|
+
### 支持的浏览器请求头
|
|
784
|
+
|
|
785
|
+
| 浏览器 | 参数值 | 请求头数量 | 特点 |
|
|
786
|
+
|--------|--------|------------|------|
|
|
787
|
+
| Chrome 131 | `chrome` | 15 | 包含完整 Sec-CH-UA 客户端提示 |
|
|
788
|
+
| Firefox 133 | `firefox` | 12 | 包含 Sec-GPC 隐私头 |
|
|
789
|
+
| Safari 18 | `safari` | 5 | 简洁的 macOS Safari 指纹 |
|
|
790
|
+
| Edge 131 | `edge` | 14 | 基于 Chromium 的 Edge |
|
|
791
|
+
| Chrome Mobile | `chrome_mobile` | 10 | Android Pixel 设备指纹 |
|
|
792
|
+
|
|
793
|
+
## TLS 指纹模拟 (curl_cffi)
|
|
794
|
+
|
|
795
|
+
CFspider 集成了 curl_cffi,支持模拟各种浏览器的 TLS 指纹,有效绕过基于 JA3/JA4 指纹的反爬检测。
|
|
796
|
+
|
|
797
|
+
### 基本用法(直接在 get/post 中使用)
|
|
798
|
+
|
|
799
|
+
```python
|
|
800
|
+
import cfspider
|
|
801
|
+
|
|
802
|
+
# 直接在 get() 中使用 impersonate 参数
|
|
803
|
+
response = cfspider.get(
|
|
804
|
+
"https://example.com",
|
|
805
|
+
impersonate="chrome131"
|
|
806
|
+
)
|
|
807
|
+
print(response.text)
|
|
808
|
+
|
|
809
|
+
# POST 请求也支持
|
|
810
|
+
response = cfspider.post(
|
|
811
|
+
"https://api.example.com",
|
|
812
|
+
impersonate="safari18_0",
|
|
813
|
+
json={"key": "value"}
|
|
814
|
+
)
|
|
815
|
+
```
|
|
816
|
+
|
|
817
|
+
### 配合 Workers 代理使用
|
|
818
|
+
|
|
819
|
+
```python
|
|
820
|
+
import cfspider
|
|
821
|
+
|
|
822
|
+
# TLS 指纹 + Cloudflare IP 出口
|
|
823
|
+
response = cfspider.get(
|
|
824
|
+
"https://httpbin.org/ip",
|
|
825
|
+
impersonate="chrome131",
|
|
826
|
+
cf_proxies="https://your-workers.dev"
|
|
827
|
+
)
|
|
828
|
+
print(response.text) # Cloudflare IP
|
|
829
|
+
print(response.cf_colo) # 节点代码
|
|
830
|
+
```
|
|
831
|
+
|
|
832
|
+
### TLS 指纹会话
|
|
833
|
+
|
|
834
|
+
```python
|
|
835
|
+
import cfspider
|
|
836
|
+
|
|
837
|
+
# 创建 Chrome 131 指纹会话
|
|
838
|
+
with cfspider.ImpersonateSession(impersonate="chrome131") as session:
|
|
839
|
+
r1 = session.get("https://example.com")
|
|
840
|
+
r2 = session.post("https://api.example.com", json={"key": "value"})
|
|
841
|
+
r3 = session.get("https://example.com/data")
|
|
842
|
+
```
|
|
843
|
+
|
|
844
|
+
### 支持的浏览器指纹
|
|
845
|
+
|
|
846
|
+
```python
|
|
847
|
+
import cfspider
|
|
848
|
+
|
|
849
|
+
# 获取支持的浏览器列表
|
|
850
|
+
browsers = cfspider.get_supported_browsers()
|
|
851
|
+
print(browsers)
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
| 类型 | 版本 |
|
|
855
|
+
|------|------|
|
|
856
|
+
| Chrome | chrome99, chrome100, chrome101, chrome104, chrome107, chrome110, chrome116, chrome119, chrome120, chrome123, chrome124, chrome131 |
|
|
857
|
+
| Chrome Android | chrome99_android, chrome131_android |
|
|
858
|
+
| Safari | safari15_3, safari15_5, safari17_0, safari17_2_ios, safari18_0, safari18_0_ios |
|
|
859
|
+
| Firefox | firefox102, firefox109, firefox133 |
|
|
860
|
+
| Edge | edge99, edge101 |
|
|
861
|
+
|
|
862
|
+
### TLS 指纹 API 参考
|
|
863
|
+
|
|
864
|
+
| 方法 | 说明 |
|
|
865
|
+
|------|------|
|
|
866
|
+
| `cfspider.impersonate_get(url, impersonate="chrome131", **kwargs)` | GET 请求 |
|
|
867
|
+
| `cfspider.impersonate_post(url, impersonate="chrome131", **kwargs)` | POST 请求 |
|
|
868
|
+
| `cfspider.impersonate_put(url, **kwargs)` | PUT 请求 |
|
|
869
|
+
| `cfspider.impersonate_delete(url, **kwargs)` | DELETE 请求 |
|
|
870
|
+
| `cfspider.impersonate_request(method, url, **kwargs)` | 自定义方法请求 |
|
|
871
|
+
| `cfspider.ImpersonateSession(impersonate="chrome131", **kwargs)` | 指纹会话 |
|
|
872
|
+
| `cfspider.get_supported_browsers()` | 获取支持的浏览器列表 |
|
|
873
|
+
|
|
874
|
+
## IP 地图可视化
|
|
875
|
+
|
|
876
|
+
CFspider 支持生成 IP 地理位置地图,可视化展示代理请求使用的 Cloudflare 节点分布。
|
|
877
|
+
|
|
878
|
+
### 基本用法
|
|
879
|
+
|
|
880
|
+
```python
|
|
881
|
+
import cfspider
|
|
882
|
+
|
|
883
|
+
# 启用地图输出
|
|
884
|
+
response = cfspider.get(
|
|
885
|
+
"https://httpbin.org/get",
|
|
886
|
+
cf_proxies="https://your-workers.dev",
|
|
887
|
+
map_output=True, # 启用地图输出
|
|
888
|
+
map_file="my_proxy_map.html" # 自定义文件名(可选)
|
|
889
|
+
)
|
|
890
|
+
|
|
891
|
+
# 请求完成后会自动生成 HTML 地图文件
|
|
892
|
+
# 在浏览器中打开 my_proxy_map.html 即可查看地图
|
|
893
|
+
```
|
|
894
|
+
|
|
895
|
+
### 多次请求收集
|
|
896
|
+
|
|
897
|
+
```python
|
|
898
|
+
import cfspider
|
|
899
|
+
|
|
900
|
+
# 清空之前的记录
|
|
901
|
+
cfspider.clear_map_records()
|
|
902
|
+
|
|
903
|
+
# 发送多个请求
|
|
904
|
+
urls = [
|
|
905
|
+
"https://httpbin.org/get",
|
|
906
|
+
"https://api.ipify.org",
|
|
907
|
+
"https://ifconfig.me/ip"
|
|
908
|
+
]
|
|
909
|
+
|
|
910
|
+
for url in urls:
|
|
911
|
+
response = cfspider.get(
|
|
912
|
+
url,
|
|
913
|
+
cf_proxies="https://your-workers.dev",
|
|
914
|
+
map_output=True,
|
|
915
|
+
map_file="multi_request_map.html"
|
|
916
|
+
)
|
|
917
|
+
print(f"{url}: {response.cf_colo}")
|
|
918
|
+
|
|
919
|
+
# 获取收集器信息
|
|
920
|
+
collector = cfspider.get_map_collector()
|
|
921
|
+
print(f"总请求数: {len(collector.get_records())}")
|
|
922
|
+
print(f"使用的节点: {collector.get_unique_colos()}")
|
|
923
|
+
```
|
|
924
|
+
|
|
925
|
+
### 手动添加记录
|
|
926
|
+
|
|
927
|
+
```python
|
|
928
|
+
import cfspider
|
|
929
|
+
|
|
930
|
+
# 手动添加 IP 记录
|
|
931
|
+
cfspider.add_ip_record(
|
|
932
|
+
url="https://example.com",
|
|
933
|
+
cf_colo="NRT", # Cloudflare 节点代码
|
|
934
|
+
status_code=200,
|
|
935
|
+
response_time=50.0 # 毫秒
|
|
936
|
+
)
|
|
937
|
+
|
|
938
|
+
# 生成地图
|
|
939
|
+
cfspider.generate_map_html(
|
|
940
|
+
output_file="custom_map.html",
|
|
941
|
+
title="My Custom IP Map"
|
|
942
|
+
)
|
|
943
|
+
```
|
|
944
|
+
|
|
945
|
+
### 节点坐标数据
|
|
946
|
+
|
|
947
|
+
CFspider 内置了 39 个主要 Cloudflare 节点的坐标数据:
|
|
948
|
+
|
|
949
|
+
```python
|
|
950
|
+
import cfspider
|
|
951
|
+
|
|
952
|
+
# 查看支持的节点
|
|
953
|
+
print(f"支持节点数: {len(cfspider.COLO_COORDINATES)}")
|
|
954
|
+
|
|
955
|
+
# 查看某个节点信息
|
|
956
|
+
nrt = cfspider.COLO_COORDINATES["NRT"]
|
|
957
|
+
print(f"东京: {nrt['city']}, {nrt['country']} ({nrt['lat']}, {nrt['lng']})")
|
|
958
|
+
```
|
|
959
|
+
|
|
960
|
+
### IP 地图 API 参考
|
|
961
|
+
|
|
962
|
+
| 方法 | 说明 |
|
|
963
|
+
|------|------|
|
|
964
|
+
| `cfspider.get(..., map_output=True)` | 请求时启用地图输出 |
|
|
965
|
+
| `cfspider.clear_map_records()` | 清空地图记录 |
|
|
966
|
+
| `cfspider.get_map_collector()` | 获取 IP 收集器 |
|
|
967
|
+
| `cfspider.add_ip_record(**kwargs)` | 手动添加 IP 记录 |
|
|
968
|
+
| `cfspider.generate_map_html(**kwargs)` | 生成地图 HTML |
|
|
969
|
+
| `cfspider.COLO_COORDINATES` | 节点坐标数据库 |
|
|
970
|
+
|
|
971
|
+
### 地图特性
|
|
972
|
+
|
|
973
|
+
生成的 HTML 地图包含:
|
|
974
|
+
|
|
975
|
+
- **Cyberpunk 风格**:与 CFspider 整体风格一致
|
|
976
|
+
- **MapLibre GL**:高性能 WebGL 地图渲染
|
|
977
|
+
- **交互式标记**:点击标记查看详细信息
|
|
978
|
+
- **统计面板**:显示请求总数、唯一节点数
|
|
979
|
+
- **节点列表**:显示所有使用的 Cloudflare 节点代码
|
|
980
|
+
- **自动缩放**:地图自动缩放到数据范围
|
|
981
|
+
|
|
982
|
+
## 网页镜像
|
|
983
|
+
|
|
984
|
+
CFspider 支持将网页完整镜像到本地,包括 HTML、CSS、JavaScript、图片、字体等所有资源,并自动重写链接,实现离线浏览。
|
|
985
|
+
|
|
986
|
+
### 基本用法
|
|
987
|
+
|
|
988
|
+
```python
|
|
989
|
+
import cfspider
|
|
990
|
+
|
|
991
|
+
# 镜像网页到本地,自动打开浏览器预览
|
|
992
|
+
result = cfspider.mirror("https://httpbin.org", open_browser=True)
|
|
993
|
+
|
|
994
|
+
print(f"保存位置: {result.index_file}")
|
|
995
|
+
print(f"资源目录: {result.assets_dir}")
|
|
996
|
+
print(f"总文件数: {result.total_files}")
|
|
997
|
+
print(f"总大小: {result.total_size / 1024:.2f} KB")
|
|
998
|
+
```
|
|
999
|
+
|
|
1000
|
+
### 指定保存目录
|
|
1001
|
+
|
|
1002
|
+
```python
|
|
1003
|
+
import cfspider
|
|
1004
|
+
|
|
1005
|
+
# 指定保存目录,不自动打开浏览器
|
|
1006
|
+
result = cfspider.mirror(
|
|
1007
|
+
"https://example.com",
|
|
1008
|
+
save_dir="./my_mirror",
|
|
1009
|
+
open_browser=False
|
|
1010
|
+
)
|
|
1011
|
+
```
|
|
1012
|
+
|
|
1013
|
+
### 配合代理使用
|
|
1014
|
+
|
|
1015
|
+
```python
|
|
1016
|
+
import cfspider
|
|
1017
|
+
|
|
1018
|
+
# 使用 VLESS 代理镜像网页
|
|
1019
|
+
result = cfspider.mirror(
|
|
1020
|
+
"https://httpbin.org",
|
|
1021
|
+
save_dir="./mirror_output",
|
|
1022
|
+
cf_proxies="vless://uuid@v2.example.com:443?path=/",
|
|
1023
|
+
open_browser=True
|
|
1024
|
+
)
|
|
1025
|
+
```
|
|
1026
|
+
|
|
1027
|
+
### 高级选项
|
|
1028
|
+
|
|
1029
|
+
```python
|
|
1030
|
+
import cfspider
|
|
1031
|
+
|
|
1032
|
+
result = cfspider.mirror(
|
|
1033
|
+
"https://example.com",
|
|
1034
|
+
save_dir="./output",
|
|
1035
|
+
open_browser=True,
|
|
1036
|
+
timeout=60, # 请求超时时间(秒)
|
|
1037
|
+
max_workers=10 # 并发下载线程数
|
|
1038
|
+
)
|
|
1039
|
+
```
|
|
1040
|
+
|
|
1041
|
+
### 目录结构
|
|
1042
|
+
|
|
1043
|
+
镜像完成后的目录结构如下:
|
|
1044
|
+
|
|
1045
|
+
```
|
|
1046
|
+
save_dir/
|
|
1047
|
+
├── index.html # 主页面(链接已重写为相对路径)
|
|
1048
|
+
└── assets/
|
|
1049
|
+
├── css/
|
|
1050
|
+
│ └── style.css
|
|
1051
|
+
├── js/
|
|
1052
|
+
│ └── main.js
|
|
1053
|
+
├── images/
|
|
1054
|
+
│ ├── logo.png
|
|
1055
|
+
│ └── banner.jpg
|
|
1056
|
+
├── fonts/
|
|
1057
|
+
│ └── roboto.woff2
|
|
1058
|
+
└── other/
|
|
1059
|
+
└── favicon.ico
|
|
1060
|
+
```
|
|
1061
|
+
|
|
1062
|
+
### MirrorResult 对象
|
|
1063
|
+
|
|
1064
|
+
| 属性 | 类型 | 说明 |
|
|
1065
|
+
|------|------|------|
|
|
1066
|
+
| index_file | str | 主 HTML 文件路径 |
|
|
1067
|
+
| assets_dir | str | 资源目录路径 |
|
|
1068
|
+
| total_files | int | 下载的文件总数 |
|
|
1069
|
+
| total_size | int | 总大小(字节) |
|
|
1070
|
+
| failed_urls | list | 下载失败的 URL 列表 |
|
|
1071
|
+
| success | bool | 是否成功 |
|
|
1072
|
+
|
|
1073
|
+
### 镜像 API 参考
|
|
1074
|
+
|
|
1075
|
+
| 方法 | 说明 |
|
|
1076
|
+
|------|------|
|
|
1077
|
+
| `cfspider.mirror(url, **kwargs)` | 镜像网页到本地 |
|
|
1078
|
+
| `cfspider.MirrorResult` | 镜像结果类 |
|
|
1079
|
+
| `cfspider.WebMirror(**kwargs)` | 镜像器类 |
|
|
1080
|
+
|
|
1081
|
+
### 镜像功能特性
|
|
1082
|
+
|
|
1083
|
+
- **完整资源保存**:自动下载 CSS、JS、图片、字体等所有资源
|
|
1084
|
+
- **CSS 资源解析**:自动解析 CSS 中的 `url()` 引用(背景图、字体等)
|
|
1085
|
+
- **链接重写**:将绝对 URL 自动转换为相对路径
|
|
1086
|
+
- **并发下载**:多线程并发下载资源,提高效率
|
|
1087
|
+
- **代理支持**:支持 VLESS、HTTP、SOCKS5 代理
|
|
1088
|
+
- **浏览器渲染**:使用 Playwright 渲染 JavaScript 动态页面
|
|
1089
|
+
- **自动预览**:下载完成后自动打开浏览器预览
|
|
1090
|
+
|
|
1091
|
+
## 浏览器模式
|
|
1092
|
+
|
|
1093
|
+
CFspider 支持浏览器模式,可以渲染 JavaScript 动态页面、截图、生成 PDF、自动化操作等。
|
|
1094
|
+
|
|
1095
|
+
### 安装
|
|
1096
|
+
|
|
1097
|
+
```bash
|
|
1098
|
+
# 安装带浏览器支持的 cfspider
|
|
1099
|
+
pip install cfspider[browser]
|
|
1100
|
+
|
|
1101
|
+
# 安装 Chromium 浏览器
|
|
1102
|
+
cfspider install
|
|
1103
|
+
```
|
|
1104
|
+
|
|
1105
|
+
### 代理类型支持
|
|
1106
|
+
|
|
1107
|
+
浏览器模式支持多种代理类型:
|
|
1108
|
+
|
|
1109
|
+
```python
|
|
1110
|
+
import cfspider
|
|
1111
|
+
|
|
1112
|
+
# 1. HTTP 代理(IP:PORT 格式)
|
|
1113
|
+
browser = cfspider.Browser(cf_proxies="127.0.0.1:9674")
|
|
1114
|
+
|
|
1115
|
+
# 2. HTTP 代理(完整格式)
|
|
1116
|
+
browser = cfspider.Browser(cf_proxies="http://127.0.0.1:9674")
|
|
1117
|
+
|
|
1118
|
+
# 3. SOCKS5 代理
|
|
1119
|
+
browser = cfspider.Browser(cf_proxies="socks5://127.0.0.1:1080")
|
|
1120
|
+
|
|
1121
|
+
# 4. VLESS 链接(推荐,无需填写 UUID)
|
|
1122
|
+
browser = cfspider.Browser(cf_proxies="vless://uuid@v2.example.com:443?path=/")
|
|
1123
|
+
|
|
1124
|
+
# 5. edgetunnel 域名 + UUID(旧方式)
|
|
1125
|
+
browser = cfspider.Browser(
|
|
1126
|
+
cf_proxies="v2.example.com",
|
|
1127
|
+
vless_uuid="your-vless-uuid"
|
|
1128
|
+
)
|
|
1129
|
+
|
|
1130
|
+
# 6. 无代理
|
|
1131
|
+
browser = cfspider.Browser()
|
|
1132
|
+
```
|
|
1133
|
+
|
|
1134
|
+
### 获取渲染后的 HTML
|
|
1135
|
+
|
|
1136
|
+
```python
|
|
1137
|
+
import cfspider
|
|
1138
|
+
|
|
1139
|
+
browser = cfspider.Browser(cf_proxies="127.0.0.1:9674")
|
|
1140
|
+
|
|
1141
|
+
# 获取 JavaScript 渲染后的完整 HTML
|
|
1142
|
+
html = browser.html("https://example.com")
|
|
1143
|
+
print(html)
|
|
1144
|
+
|
|
1145
|
+
browser.close()
|
|
1146
|
+
```
|
|
1147
|
+
|
|
1148
|
+
### 页面截图
|
|
1149
|
+
|
|
1150
|
+
```python
|
|
1151
|
+
import cfspider
|
|
1152
|
+
|
|
1153
|
+
browser = cfspider.Browser()
|
|
1154
|
+
|
|
1155
|
+
# 截图并保存
|
|
1156
|
+
browser.screenshot("https://example.com", "screenshot.png")
|
|
1157
|
+
|
|
1158
|
+
# 截取整个页面
|
|
1159
|
+
browser.screenshot("https://example.com", "full.png", full_page=True)
|
|
1160
|
+
|
|
1161
|
+
browser.close()
|
|
1162
|
+
```
|
|
1163
|
+
|
|
1164
|
+
### 生成 PDF
|
|
1165
|
+
|
|
1166
|
+
```python
|
|
1167
|
+
import cfspider
|
|
1168
|
+
|
|
1169
|
+
browser = cfspider.Browser()
|
|
1170
|
+
|
|
1171
|
+
# 生成 PDF(仅无头模式可用)
|
|
1172
|
+
browser.pdf("https://example.com", "page.pdf")
|
|
1173
|
+
|
|
1174
|
+
browser.close()
|
|
1175
|
+
```
|
|
1176
|
+
|
|
1177
|
+
### 自动化操作
|
|
1178
|
+
|
|
1179
|
+
```python
|
|
1180
|
+
import cfspider
|
|
1181
|
+
|
|
1182
|
+
browser = cfspider.Browser()
|
|
1183
|
+
|
|
1184
|
+
# 打开页面,返回 Playwright Page 对象
|
|
1185
|
+
page = browser.get("https://example.com")
|
|
1186
|
+
|
|
1187
|
+
# 点击元素
|
|
1188
|
+
page.click("button#submit")
|
|
1189
|
+
|
|
1190
|
+
# 填写表单
|
|
1191
|
+
page.fill("input#username", "myname")
|
|
1192
|
+
page.fill("input#password", "mypassword")
|
|
1193
|
+
|
|
1194
|
+
# 等待元素
|
|
1195
|
+
page.wait_for_selector(".result")
|
|
1196
|
+
|
|
1197
|
+
# 获取文本
|
|
1198
|
+
text = page.inner_text(".result")
|
|
1199
|
+
print(text)
|
|
1200
|
+
|
|
1201
|
+
browser.close()
|
|
1202
|
+
```
|
|
1203
|
+
|
|
1204
|
+
### 执行 JavaScript
|
|
1205
|
+
|
|
1206
|
+
```python
|
|
1207
|
+
import cfspider
|
|
1208
|
+
|
|
1209
|
+
browser = cfspider.Browser()
|
|
1210
|
+
|
|
1211
|
+
# 在页面中执行 JavaScript
|
|
1212
|
+
result = browser.execute_script("https://example.com", "document.title")
|
|
1213
|
+
print(result) # Example Domain
|
|
1214
|
+
|
|
1215
|
+
browser.close()
|
|
1216
|
+
```
|
|
1217
|
+
|
|
1218
|
+
### 使用 with 语句
|
|
1219
|
+
|
|
1220
|
+
```python
|
|
1221
|
+
import cfspider
|
|
1222
|
+
|
|
1223
|
+
with cfspider.Browser() as browser:
|
|
1224
|
+
html = browser.html("https://example.com")
|
|
1225
|
+
print(html)
|
|
1226
|
+
# 自动关闭浏览器
|
|
1227
|
+
```
|
|
1228
|
+
|
|
1229
|
+
### 非无头模式
|
|
1230
|
+
|
|
1231
|
+
```python
|
|
1232
|
+
import cfspider
|
|
1233
|
+
|
|
1234
|
+
# headless=False 可以看到浏览器窗口
|
|
1235
|
+
browser = cfspider.Browser(headless=False)
|
|
1236
|
+
|
|
1237
|
+
page = browser.get("https://example.com")
|
|
1238
|
+
# 可以看到浏览器操作
|
|
1239
|
+
|
|
1240
|
+
browser.close()
|
|
1241
|
+
```
|
|
1242
|
+
|
|
1243
|
+
## 错误处理
|
|
1244
|
+
|
|
1245
|
+
```python
|
|
1246
|
+
import cfspider
|
|
1247
|
+
|
|
1248
|
+
cf_proxies = "https://your-workers.dev"
|
|
1249
|
+
|
|
1250
|
+
try:
|
|
1251
|
+
response = cfspider.get("https://httpbin.org/ip", cf_proxies=cf_proxies)
|
|
1252
|
+
response.raise_for_status()
|
|
1253
|
+
print(response.text)
|
|
1254
|
+
except cfspider.CFSpiderError as e:
|
|
1255
|
+
print(f"请求失败: {e}")
|
|
1256
|
+
except Exception as e:
|
|
1257
|
+
print(f"其他错误: {e}")
|
|
1258
|
+
```
|
|
1259
|
+
|
|
1260
|
+
## Workers API 接口
|
|
1261
|
+
|
|
1262
|
+
| 方法 | 接口 | 说明 |
|
|
1263
|
+
|------|------|------|
|
|
1264
|
+
| GET | /api/fetch?url=... | 代理请求目标 URL,返回原始内容 |
|
|
1265
|
+
| GET | /api/json?url=... | 代理请求目标 URL,返回 JSON(含节点信息) |
|
|
1266
|
+
| GET | /api/pool | 获取当前节点的 IP 池状态信息 |
|
|
1267
|
+
| GET | /api/proxyip | 获取当前使用的 Proxy IP 和节点代码 |
|
|
1268
|
+
| POST | /proxy?url=...&method=... | Python 客户端使用的代理接口 |
|
|
1269
|
+
| GET | /debug | 调试接口,返回当前请求的详细信息 |
|
|
1270
|
+
|
|
1271
|
+
## FAQ 常见问题
|
|
1272
|
+
|
|
1273
|
+
### 免费版有什么限制?
|
|
1274
|
+
Workers 免费版每日 100,000 请求,单次 CPU 时间 10ms,足够大多数个人项目使用。付费版 $5/月起,无请求限制。
|
|
1275
|
+
|
|
1276
|
+
### IP 会被封吗?
|
|
1277
|
+
Cloudflare IP 被数百万网站使用,信誉极高。但如果对单一网站高频请求,仍可能触发反爬。建议控制请求频率,模拟正常用户行为。
|
|
1278
|
+
|
|
1279
|
+
### 支持 HTTPS 吗?
|
|
1280
|
+
完全支持。Workers 自动提供 SSL/TLS 加密,所有请求都通过 HTTPS 传输,确保数据安全。
|
|
1281
|
+
|
|
1282
|
+
### 能用于商业项目吗?
|
|
1283
|
+
可以。Apache 2.0 许可证允许商业使用。但建议阅读 Cloudflare Workers 服务条款,确保用途合规。
|
|
1284
|
+
|
|
1285
|
+
### 为什么不能直接用 CF CDN IP?
|
|
1286
|
+
Cloudflare CDN IP (如 172.64.x.x) 是 Anycast IP,仅用于边缘加速,不提供 HTTP 代理服务。必须通过 Workers 才能实现代理功能。
|
|
1287
|
+
|
|
1288
|
+
### 浏览器模式如何获得 CF IP?
|
|
1289
|
+
需要配合 edgetunnel 项目使用 VLESS 协议。edgetunnel 将流量通过 Cloudflare 网络转发,实现浏览器流量从 CF IP 出口。
|
|
1290
|
+
|
|
1291
|
+
## 注意事项
|
|
1292
|
+
|
|
1293
|
+
1. Workers 免费版限制:每日 100,000 请求,单次 CPU 时间 10ms
|
|
1294
|
+
2. 请求体大小限制:免费版 100MB,付费版无限制
|
|
1295
|
+
3. 超时限制:免费版 30 秒,付费版无限制
|
|
1296
|
+
4. 不支持 WebSocket、gRPC 等非 HTTP 协议
|
|
1297
|
+
5. 浏览器模式需要额外安装 `playwright` 和 Chromium
|
|
1298
|
+
6. edgetunnel VLESS 代理需要单独部署 edgetunnel Workers
|
|
1299
|
+
|
|
1300
|
+
## 致谢
|
|
1301
|
+
|
|
1302
|
+
本项目的浏览器 VLESS 代理功能借鉴并使用了 [edgetunnel](https://github.com/cmliu/edgetunnel) 项目。
|
|
1303
|
+
|
|
1304
|
+
edgetunnel 是一个优秀的 Cloudflare Workers VLESS 代理实现,感谢 [@cmliu](https://github.com/cmliu) 的开源贡献。
|
|
1305
|
+
|
|
1306
|
+
如需使用浏览器模式的 Cloudflare IP 出口功能,请先部署 edgetunnel Workers:
|
|
1307
|
+
- 仓库地址:https://github.com/cmliu/edgetunnel
|
|
1308
|
+
|
|
1309
|
+
## ⚖️ 法律声明与免责条款
|
|
1310
|
+
|
|
1311
|
+
### 项目定位
|
|
1312
|
+
|
|
1313
|
+
CFspider 是一个**技术研究项目**,旨在探索 Cloudflare Workers 边缘计算能力在网络代理领域的应用。本项目的目标用户是:
|
|
1314
|
+
|
|
1315
|
+
- 网络安全研究人员
|
|
1316
|
+
- 学术研究者
|
|
1317
|
+
- 合规数据采集开发者
|
|
1318
|
+
- 技术爱好者
|
|
1319
|
+
|
|
1320
|
+
### ✅ 合规使用场景
|
|
1321
|
+
|
|
1322
|
+
| 场景 | 描述 | 合规性 |
|
|
1323
|
+
|------|------|--------|
|
|
1324
|
+
| **学术研究** | 研究分布式系统、边缘计算、网络架构 | ✅ 合规 |
|
|
1325
|
+
| **安全测试** | 对自有或授权系统进行渗透测试 | ✅ 合规 |
|
|
1326
|
+
| **公开数据采集** | 采集无需登录的公开信息(遵守 robots.txt) | ✅ 合规 |
|
|
1327
|
+
| **API 开发测试** | 测试自己开发的 API 服务 | ✅ 合规 |
|
|
1328
|
+
| **网络诊断** | 检测网络连通性、延迟、路由 | ✅ 合规 |
|
|
1329
|
+
| **隐私保护** | 在合法范围内保护个人网络隐私 | ✅ 合规 |
|
|
1330
|
+
|
|
1331
|
+
### ❌ 禁止用途
|
|
1332
|
+
|
|
1333
|
+
**以下行为严格禁止,使用者须自行承担全部法律责任:**
|
|
1334
|
+
|
|
1335
|
+
| 禁止行为 | 法律风险 |
|
|
1336
|
+
|----------|----------|
|
|
1337
|
+
| 🚫 DDoS 攻击或任何形式的网络攻击 | 刑事犯罪 |
|
|
1338
|
+
| 🚫 未授权访问计算机系统 | 刑事犯罪 |
|
|
1339
|
+
| 🚫 侵犯版权(绕过付费墙、下载盗版内容) | 民事/刑事责任 |
|
|
1340
|
+
| 🚫 侵犯隐私(爬取个人隐私数据) | 民事/刑事责任 |
|
|
1341
|
+
| 🚫 网络诈骗、钓鱼攻击 | 刑事犯罪 |
|
|
1342
|
+
| 🚫 规避制裁或出口管制 | 刑事犯罪 |
|
|
1343
|
+
| 🚫 恶意竞争(大规模爬取竞争对手数据) | 不正当竞争 |
|
|
1344
|
+
| 🚫 违反目标网站 Terms of Service | 民事责任 |
|
|
1345
|
+
|
|
1346
|
+
### 免责声明
|
|
1347
|
+
|
|
1348
|
+
1. **开发者免责**:本项目开发者仅提供技术工具,不对使用者的任何行为负责。使用者的行为完全由其个人承担法律责任。
|
|
1349
|
+
|
|
1350
|
+
2. **无担保**:本软件按"原样"提供,不提供任何明示或暗示的担保,包括但不限于适销性、特定用途适用性和非侵权性的担保。
|
|
1351
|
+
|
|
1352
|
+
3. **风险自担**:使用者理解并同意,使用本软件的风险完全由使用者自行承担。
|
|
1353
|
+
|
|
1354
|
+
4. **合规责任**:使用者有责任确保其使用行为符合:
|
|
1355
|
+
- 所在国家/地区的法律法规
|
|
1356
|
+
- Cloudflare 服务条款
|
|
1357
|
+
- 目标网站的服务条款和 robots.txt
|
|
1358
|
+
- 相关行业监管规定
|
|
1359
|
+
|
|
1360
|
+
5. **第三方服务**:本项目依赖 Cloudflare Workers 服务,使用者须同时遵守 [Cloudflare 服务条款](https://www.cloudflare.com/terms/)。
|
|
1361
|
+
|
|
1362
|
+
### 社区治理
|
|
1363
|
+
|
|
1364
|
+
本项目采取积极的社区管理策略:
|
|
1365
|
+
|
|
1366
|
+
1. **Issue 审核**:对于明显涉及非法用途的讨论(如"如何爬取 xxx 付费内容"、"如何攻击 xxx"),将:
|
|
1367
|
+
- 立即关闭 Issue
|
|
1368
|
+
- 保留证据记录
|
|
1369
|
+
- 必要时向 GitHub 举报
|
|
1370
|
+
|
|
1371
|
+
2. **PR 审核**:拒绝合并任何旨在促进非法活动的代码贡献
|
|
1372
|
+
|
|
1373
|
+
3. **文档明确**:在所有文档中明确声明合法用途
|
|
1374
|
+
|
|
1375
|
+
**如发现有人滥用本项目进行非法活动,请通过 GitHub Issue 举报。**
|
|
1376
|
+
|
|
1377
|
+
## License
|
|
1378
|
+
|
|
1379
|
+
Apache License 2.0
|
|
1380
|
+
|
|
1381
|
+
本项目采用 Apache 2.0 许可证。Apache 2.0 许可证已包含免责条款(第7、8条),请仔细阅读 [LICENSE](LICENSE) 文件。
|
|
1382
|
+
|
|
1383
|
+
## 链接
|
|
1384
|
+
|
|
1385
|
+
- GitHub: https://github.com/violettoolssite/CFspider
|
|
1386
|
+
- PyPI: https://pypi.org/project/cfspider/
|
|
1387
|
+
- 官网: https://spider.violetteam.cloud
|
|
1388
|
+
- B 站视频教程: https://b23.tv/1uzOf7M
|
|
1389
|
+
- YouTube 视频教程: https://youtu.be/oPeXiIFJ9TA?si=ukXsX8iP86ZTB4LP
|
|
1390
|
+
- edgetunnel: https://github.com/cmliu/edgetunnel
|