FlareSolverr:Cloudflare 反爬绕过原理与实践
一句话概括
FlareSolverr 是一个代理服务器,用真浏览器替你过 Cloudflare 验证,把解锁后的 Cookie 返回给你。本质是"代考"——CF 出题考浏览器,FlareSolverr 派真 Chrome 去考试,把答卷带回来给你抄。
Cloudflare 反爬机制
Cloudflare 保护网站的核心是区分真人浏览器和自动化程序,主要检测维度:
1. TLS 指纹(JA3/JA4)
每个 HTTP 客户端在 TLS 握手时会暴露特征指纹。Python requests、Go net/http、curl 的 TLS 握手特征都跟 Chrome 不同。Cloudflare 维护了一个巨大的指纹库,看到 Python 指纹直接拦截。
Chrome JA3: 771,4865-4866-4867-49195-49199...
Python JA3: 771,4866-4867-4865-49196-49200... ← 顺序不同,秒识别
2. JavaScript Challenge(五秒盾)
Cloudflare 返回一段混淆的 JS 代码,在浏览器端执行后:
- 检测 DOM 环境是否完整(window、document、navigator 等)
- 检测浏览器 API 是否齐全(Canvas、WebGL、Web Audio)
- 收集浏览器指纹(屏幕尺寸、字体列表、时区等)
- 通过验证后生成
cf_clearanceCookie
普通 HTTP 客户端没有 JS 引擎,根本跑不了这段代码。
3. 浏览器指纹
navigator.webdriver— Selenium/Playwright 默认为true- ChromeDriver 在 DOM 里注入
$cdc_前缀的变量 navigator.plugins和navigator.languages的异常值- Canvas/WebGL 渲染结果的一致性
- 屏幕分辨率 vs 窗口大小的合理性
4. 行为分析
- 鼠标移动轨迹
- 键盘输入模式
- 页面加载后的交互延迟
- Turnstile 验证码(高级场景)
FlareSolverr 绕过原理
架构
你的爬虫代码
↓ POST http://localhost:8191/v1
FlareSolverr 代理服务器
↓ 启动
undetected-chromedriver + Chrome
↓ 打开目标 URL
Cloudflare JS Challenge
↓ Chrome 自动执行 JS
验证通过,生成 cf_clearance
↓ 提取
HTML + Cookies 返回给你
↓ 你拿着 cookie
后续请求直接通过 CF
核心组件:undetected-chromedriver
这是 FlareSolverr 能工作的关键。它是一个魔改版的 ChromeDriver,做了以下反检测处理:
1. 删除 webdriver 标记
// 正常 Selenium
navigator.webdriver === true // 被检测!
// undetected-chromedriver
navigator.webdriver === undefined // 像真人
2. 修改 ChromeDriver 二进制特征
ChromeDriver 在编译时硬编码了 $cdc_ 前缀的变量名,Cloudflare 会检测 DOM 中是否存在这些变量。undetected-chromedriver 在启动前直接修改 ChromeDriver 二进制文件,把这些特征字符串替换掉。
3. TLS 指纹天然正确
因为跑的是真 Chrome 浏览器,TLS 握手特征跟正常用户完全一致,JA3 指纹无法区分。
4. 完整的 JS 执行环境
Chrome 本身就有完整的 V8 引擎和 DOM 实现,Cloudflare 的 JS challenge 正常执行,所有浏览器 API 调用都返回真实结果。
Cookie 传递机制
CF 验证通过后会设置两个关键 Cookie:
cf_clearance— 验证通过的凭证,有效期通常 15-30 分钟__cf_bm— Bot Management 的跟踪 Cookie
FlareSolverr 提取这些 Cookie 返回给调用方。后续请求只要带上这些 Cookie + 匹配的 User-Agent,CF 就会放行。
# 拿到 cookie 后的使用方式
import requests
cookies = {"cf_clearance": "从FlareSolverr拿到的值"}
headers = {"User-Agent": "跟FlareSolverr用的同一个UA"}
resp = requests.get("https://目标网站/api/data", cookies=cookies, headers=headers)
实际使用
部署(Docker 一行)
docker run -d --name=flaresolverr \
-p 8191:8191 \
-e LOG_LEVEL=info \
--restart unless-stopped \
ghcr.io/flaresolverr/flaresolverr:latest
支持 x86、x64、ARM32、ARM64 全架构。
API 调用
基本请求:
curl -X POST http://localhost:8191/v1 \
-H 'Content-Type: application/json' \
-d '{
"cmd": "request.get",
"url": "https://目标网站",
"maxTimeout": 60000
}'
返回结构:
{
"status": "ok",
"solution": {
"url": "https://目标网站",
"status": 200,
"response": "<html>完整页面HTML</html>",
"cookies": [
{"name": "cf_clearance", "value": "xxx", "domain": ".目标网站"},
{"name": "__cf_bm", "value": "yyy", "domain": ".目标网站"}
],
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..."
}
}
Session 模式(推荐)
避免每次都重新启动浏览器 + 重新解验证:
# 创建会话
curl -X POST http://localhost:8191/v1 \
-d '{"cmd": "sessions.create", "session": "my-session"}'
# 使用会话请求(复用浏览器实例和 cookies)
curl -X POST http://localhost:8191/v1 \
-d '{"cmd": "request.get", "url": "https://xxx", "session": "my-session"}'
# 查看活跃会话
curl -X POST http://localhost:8191/v1 \
-d '{"cmd": "sessions.list"}'
# 销毁会话(释放资源)
curl -X POST http://localhost:8191/v1 \
-d '{"cmd": "sessions.destroy", "session": "my-session"}'
代理支持
{
"cmd": "request.get",
"url": "https://目标网站",
"proxy": {
"url": "http://127.0.0.1:7890",
"username": "user",
"password": "pass"
}
}
支持 http://、socks4://、socks5:// 协议。
资源消耗与限制
| 指标 | 数值 |
|---|---|
| 每个浏览器实例内存 | ~300-500 MB |
| 首次解验证耗时 | 5-15 秒 |
| Session 复用请求耗时 | 1-3 秒 |
| cf_clearance 有效期 | 15-30 分钟(站点配置不同) |
注意事项:
- 内存有限的机器(<2GB)不要并发请求
- Session 用完必须 destroy,否则 Chrome 进程累积吃光内存
- 部分站点启用了 Turnstile 验证码,FlareSolverr 无法自动解决
- Cookie 有效期过后需要重新解验证
- User-Agent 必须和获取 Cookie 时一致,否则 CF 会拒绝
对比其他方案
| 方案 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| **FlareSolverr** | 真 Chrome + undetected-chromedriver | 成功率高,部署简单 | 内存大,速度慢 |
| **curl-impersonate** | 魔改 curl 模拟 Chrome TLS 指纹 | 轻量快速 | 过不了 JS challenge |
| **Playwright Stealth** | Playwright + 反检测插件 | 灵活可控 | 需要自己处理反检测细节 |
| **cloudscraper** | Python 库,内置 JS 解释器 | 轻量 | CF 升级后经常失效 |
| **付费服务(ScraperAPI 等)** | 代理池 + 浏览器农场 | 省心 | 贵,$29-$249/月 |
FlareSolverr 适合自部署、中低频率的场景。高频抓取建议考虑 curl-impersonate(如果目标站只有 TLS 检测没有 JS challenge)或付费服务。
典型集成场景
FlareSolverr 最常见的用途是配合 Sonarr/Radarr/Prowlarr 等自动化媒体管理工具抓取被 CF 保护的 PT 站点和索引器。在这些工具的设置里填入 http://localhost:8191 就行。
也可以集成到自己的爬虫框架中,作为 Cloudflare 站点的统一入口。
项目地址: github.com/FlareSolverr/FlareSolverr
Stars: 9.2k+ | 语言: Python | 许可证: MIT