TOP_BANNER
使用 Python curl_cffi 模拟真实浏览器 TLS 指纹和 UA 绕过风控的代码示例
产品评测发布于 2026-08-21

使用 Python curl_cffi 模拟真实浏览器 TLS 指纹和 UA 绕过风控的代码示例

curl_cffi 是基于 libcURL 封装的 Python 库,能够完美模拟真实浏览器的 TLS/JA3 指纹 和 HTTP/2 帧指纹(这是传统 requests 库即使修改了 User-Agent 也无法解决的底层风控特征)。

云评测网
原创 · 内容专栏
阅读 3

在使用 curl_cffi 时,建议配合 Session 以及随机延迟等策略,以实现最佳的避风控效果。

一、 基础使用示例:模拟 Chrome 客户端

以下代码演示了如何使用 curl_cffi 模拟最新的桌面版 Chrome 浏览器发起请求:

Python


import time
import random
from curl_cffi import requests

# 1. 建议使用 Session 保存 Cookie 和连接复用特征
session = requests.Session()

# 2. 目标测试地址(此处以 tls.peet.ws 为例,可查看返回的 ja3_hash 和 tls 指纹)
url = "https://tls.peet.ws/api/clean"

# 3. 指定 impersonate 参数(支持 chrome110, chrome120, safari15_5, edge99 等)
# 设置 impersonate 后,curl_cffi 会自动匹配该浏览器版本的 TLS 握手特征、 cipher suites 和对应 UA
try:
    response = session.get(
        url,
        impersonate="chrome120",  # 模拟 Chrome 120 的 TLS 指纹与默认 Header
        timeout=10,
        headers={
            # 补充业务所需的特定请求头(可选)
            "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
            "Sec-Fetch-Dest": "document",
            "Sec-Fetch-Mode": "navigate",
            "Sec-Fetch-Site": "none",
            "Sec-Fetch-User": "?1",
        }
    )
    
    print("状态码:", response.status_code)
    print("返回内容 (部分):", response.text[:300])

except Exception as e:
    print(f"请求发生异常: {e}")

二、 高级进阶:代理池 + 浏览器指纹轮换 + 随机延迟

为了在批量请求时彻底避开阿里云等 CDN/WAF 的频率与行为风控,建议构建如下防护模式:

Python


import time
import random
from curl_cffi import requests

# 可选的浏览器指纹池(避免单一客户端指纹过于频繁)
IMPERSONATE_TARGETS = [
    "chrome110",
    "chrome120",
    "safari15_5",
    "safari_ios",
    "edge101"
]

# 配置代理池(隐藏本地/阿里云源站 IP)
PROXIES = {
    "http": "http://user:password@your-proxy-host:port",
    "https": "http://user:password@your-proxy-host:port",
}

def send_anti_risk_request(target_url):
    # 随机选择一个浏览器版本进行伪装
    chosen_browser = random.choice(IMPERSONATE_TARGETS)
    
    # 初始化 Session
    with requests.Session() as session:
        # 如果使用代理,解除注释下句
        # session.proxies = PROXIES
        
        try:
            print(f"[*] 正在使用【{chosen_browser}】指纹发起请求...")
            
            response = session.get(
                target_url,
                impersonate=chosen_browser,
                timeout=15,
                headers={
                    "Cache-Control": "max-age=0",
                    "Upgrade-Insecure-Requests": "1",
                }
            )
            
            if response.status_code == 200:
                return response.text
            else:
                print(f"[!] 被拦截或响应异常,状态码: {response.status_code}")
                return None
                
        except Exception as e:
            print(f"[!] 请求失败: {e}")
            return None

# 测试调用并加入行为打散(正态分布/随机等待)
if __name__ == "__main__":
    test_url = "https://httpbin.org/headers"
    
    for i in range(3):
        print(f"\n--- 第 {i+1} 次请求 ---")
        result = send_anti_risk_request(test_url)
        if result:
            print(result)
            
        # 避风控核心:引入正态分布的随机等待时间(如 1.5s ~ 3.5s 之间浮动)
        sleep_time = random.uniform(1.5, 3.5)
        print(f"等待 {sleep_time:.2f} 秒后发起下一次请求...")
        time.sleep(sleep_time)

三、 避风控要点说明

  1. impersonate 参数优先级最高: 使用 curl_cffi 时,千万不要手动指定标准的伪造 TLS Cipher Suites,直接使用 impersonate="chrome120" 即可,它会自动帮你在 C 语言底层配置好相匹配的 TLS 指纹和 HTTP/2 帧。
  2. IP 隔离始终是第一位的: TLS 指纹伪装只能解决“你像不像真人”的问题,如果同一个 IP 在短时间内发起高频 QPS 请求,风控系统依然会通过 IP 频次直接封禁。因此大批量请求必须配合代理池使用。
  3. 配合异步请求: 如果需要并发抓取,可以使用 curl_cffi.requests.AsyncSession 提升效率,但依然要控制单个 IP 的并发量。


© 原创 · 转载请注明来源返回文章列表
在线联系
Telegram 官方入口

可通过 Telegram 联系客服、订阅频道或加入群组,具体入口以后台配置为准。