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 代码,在浏览器端执行后:

普通 HTTP 客户端没有 JS 引擎,根本跑不了这段代码。

3. 浏览器指纹

4. 行为分析

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:

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 分钟(站点配置不同)

注意事项:

对比其他方案

方案原理优点缺点
**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