Cloudflare 是一种基于云技术的Web应用程序防火墙(WAF),旨在保护网站免受各种Web攻击,它能够在5秒内检测到并阻止恶意流量。
现在很多JW站点都逐步应用Cloudflare WAF,导致采集开发成本日益剧增。
本文涉及场景:通过Python采集程序访问站点页面时,会跳转至《Cloudflare WAF 連線錯誤頁面》,并提示拒绝访问。
然而在服务器中通过 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 安装即可。
使用非常简单,注意impersonate填写的版本即可。
也可以支持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站点的访问。