curl_cffi能绕过tls指纹检测,因其底层调用libcurl并注入chrome/firefox真实tls指纹模板,使clienthello字段(如supported_versions、alpn、key_share等)与浏览器完全一致,而非伪造;需正确初始化session、设置impersonate、复用会话并匹配user-agent。

curl_cffi 能绕过大多数基于 TLS 指纹的反爬,但前提是正确初始化、禁用默认行为、并复用会话 —— 直接调用 get() 而不设 impersonate 或复用 Session,基本等于没用。
为什么 curl_cffi 能绕过 TLS 指纹检测
网站(如 Cloudflare、Akamai)通过 TLS 握手时的 ClientHello 字段(如 supported_versions、key_share、alpn、signature_algorithms 等)识别非浏览器流量。原生 requests 或 httpx 的 TLS 栈(OpenSSL)指纹固定、缺乏浏览器级协商顺序和扩展组合;curl_cffi 底层调用 libcurl + cfssl(或系统 curl),并注入 Chromium/Firefox 的真实 TLS 指纹模板,让 ClientHello 和主流浏览器一致。
关键点:
-
curl_cffi不是“伪造”指纹,而是加载真实浏览器编译时固化的行为模式 - 指纹生效依赖底层
libcurl版本 ≥ 8.0(推荐 8.5+),旧版可能缺失key_share或 ALPN 顺序控制 - 每次新建
Session都会重置 TLS 状态,必须复用同一实例才能维持连接复用和指纹一致性
正确初始化 Session 并设置 impersonate
错误写法:curl_cffi.get("https://example.com", impersonate="chrome120") —— 这会创建临时 session,无法复用连接,且部分参数(如 http2)被忽略。
正确做法:
- 显式创建
curl_cffi.Session,传入impersonate参数(如"chrome120"、"firefox115") - 设置
http2=True(默认开启,但显式声明更稳妥) - 禁用自动跳转(
follow_redirects=False)避免中间 TLS 指纹错乱 - 添加标准浏览器 headers(
User-Agent必须与impersonate匹配,否则服务端校验失败)
示例:
from curl_cffi import requests
session = requests.Session(impersonate="chrome120", http2=True)
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
})
resp = session.get("https://example.com", timeout=10)
常见失败场景与修复
即使用了 curl_cffi,仍返回 403 或 520,大概率是以下问题:
- 未安装对应平台的
libcurl:Linux/macOS 需brew install curl(macOS)或apt install libcurl4-openssl-dev(Ubuntu),Windows 用户直接用pip install curl-cffi自带二进制 -
impersonate值拼写错误,如写成"chrome120"却实际只支持"chrome119"(查文档确认可用值:curl_cffi.requests.impersonate枚举) - 服务端还校验 HTTP/2 SETTINGS 帧或首帧顺序 —— 此时需加
max_retries=1避免重试污染指纹,或启用stream=True手动读取响应头 - Cookie 或 Referer 缺失触发二次校验:首次请求后务必用
session.cookies持有状态,后续请求带上Referer
绕过 TLS 指纹只是第一步
TLS 指纹只是反爬链路的第一环。如果目标站启用了 JA3S、HTTP/2 优先级树校验、或 JS 挑战(如 Cloudflare Turnstile),curl_cffi 本身不执行 JS,也无法模拟鼠标轨迹或 canvas 指纹。此时要么切到 Playwright + stealth 插件,要么在 curl_cffi 成功拿到初始 HTML 后,用 execjs 或 py-mini-racer 解析 challenge token —— 但后者已越来越难维持稳定。
最容易被忽略的一点:TLS 指纹匹配了,但 DNS 解析走的是系统默认 resolver(如 8.8.8.8),而真实浏览器走的是操作系统 DoH/DoT 或 host 绑定。若目标站做了 DNS 指纹联动,得额外配置 session.dns_servers = ["1.1.1.1"] 或 patch curl_cffi 的 resolver 行为。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











