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


