curl_cffi突破Cloudflare验证

Cloudflare 是一种基于云技术的Web应用程序防火墙(WAF),旨在保护网站免受各种Web攻击,它能够在5秒内检测到并阻止恶意流量。

现在很多JW站点都逐步应用Cloudflare WAF,导致采集开发成本日益剧增。


本文涉及场景:通过Python采集程序访问站点页面时,会跳转至《Cloudflare WAF 連線錯誤頁面》,并提示拒绝访问。

file

然而在服务器中通过 Curl 命令可以正常访问。

根据猜测,大概率是请求指纹被识别后拦截。

我尝试随机生成请求库的JA3指纹,但是并没有生效,依旧被拦截到。


经过检索,找到了名为 curl-impersonate 的开源项目,通过它可模拟四种浏览器 Chrome、Edge、Safari和Firefox,执行与真实浏览器相同的TLS和HTTP握手。(通过将curl中的组件全部替换为浏览器使用库,并且让版本保持一致,从而使curl的指纹和浏览器一致)

更多内容大家自行查看,下面说一下基于curl-impersonate 的 Python 开源库 curl_cffi。

https://github.com/yifeikong/curl_cffi


curl_cffi 可模拟真实浏览器的 TLS | JA3 指纹。

直接 pip install curl_cffi 安装即可。

file

使用非常简单,注意impersonate填写的版本即可。

file

也可以支持requests.Session()

下面是两个用于测试的站点,大家可自行体验:

chinatimes.com、boxun.com

from curl_cffi import requests
headers={
    "user-agent":'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
}
def chinatimes():
    sess = requests.Session()
    # 先请求一次取__cf_bm
    sess.get('https://www.chinatimes.com',headers=headers,impersonate="chrome99_android")
    # 第二次携带__cf_bm请求
    d = sess.get('https://www.chinatimes.com/realtimenews/20231130000049-260407',headers=headers,impersonate="chrome99_android")
    print(d.text)

项目地址:https://github.com/yifeikong/curl_cffi

实际情况需要大家自行测试,此方案相对于未有其他限制的新闻站点效果尚可,并不适用于所有cf站点的访问。

点赞
  1. remake说道:
    Firefox Windows 10
    同推荐这个库,前段时间开发某网站爬虫用requests死活过不去,后来朋友推荐试了一下这个库直接就成功了。而且几乎不需要修改代码,因为语法跟requests一样,巨好用

发表回复