requests默认tls指纹易被识别拦截,因其底层urllib3+openssl生成固定clienthello(加密套件顺序、缺alpn/key_share、椭圆曲线单一),ja3指纹稳定如“a0a1a2b3c4d5”,被cloudflare等waf直接标记为爬虫。

为什么requests默认TLS指纹会被识别和拦截?
现代反爬系统(如Cloudflare、Akamai、Imperva)会深度检查TLS握手过程中的细节,包括tls_client_hello的扩展顺序、支持的密码套件、椭圆曲线列表、ALPN协议等。Python原生requests底层使用urllib3 + openssl,其TLS Client Hello结构固定、指纹高度可识别,容易被标记为自动化流量。
用curl_cffi替代requests发起真实浏览器TLS请求
curl_cffi基于libcurl + chrome内核指纹,能复现Chrome 110+的完整TLS握手特征(含JA3哈希匹配),且无需手动编译或管理证书。它不是“伪装User-Agent”,而是真正发出与浏览器一致的TLS Client Hello。
实操建议:
- 安装:
pip install curl-cffi(注意是curl-cffi,不是curl_cffi) - 基础用法:
from curl_cffi import requests; r = requests.get("https://example.com", impersonate="chrome110") -
impersonate参数必须显式指定(如"chrome110"、"edge101"),不传值会退化为普通curl行为,失去指纹效果 - 不兼容
requests.Session的插件(如requests-toolbelt流式上传),需改用curl_cffi.requests.Session()
绕过TLS指纹检测时不能忽略的三个关键点
仅换库不够,以下配置错误会导致指纹失效或触发二次验证:
- HTTP/2必须启用:
curl_cffi默认开启,但若手动禁用http2=False,TLS指纹虽对但协议层暴露异常 - Cookie和Referer需同步更新:单独发TLS正确请求,但
Cookie为空或Referer缺失,仍会被WAF拒绝(尤其登录后页面) - 证书验证不能跳过:
verify=False会改变TLS握手流程(如禁用SNI或跳过证书校验扩展),反而让指纹失真;应保持verify=True并用系统证书
遇到“SSL: CERTIFICATE_VERIFY_FAILED”错误怎么办?
这不是证书问题,而是curl_cffi在Windows/macOS上未正确加载系统CA证书路径导致的。错误信息是SSLError: [SSL: CERTIFICATE_VERIFY_FAILED],本质是libcurl找不到可信根证书。
解决方式:
- Linux:确保
ca-certificates已安装(apt install ca-certificates或yum install ca-certificates) - macOS:运行
brew install ca-certificates,然后设置环境变量CURL_CA_BUNDLE=/opt/homebrew/etc/ca-certificates/cert.pem - Windows:下载
curl-ca-bundle.crt(官方维护地址:https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251),设环境变量CURL_CA_BUNDLE=绝对路径\cacert.pem
别试图用verify=False掩盖——那会让TLS指纹变成另一个明显异常模式。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











