python 使用curl_cffi 绕过jax3指纹-Cloudflare 5s盾
现在越来越多的网站已经能够通过JA3
或者其他指纹信息,来识别你是不是爬虫了。传统的方式比如换UA,加代理是没有任何意义了,所以这个时候我们就需要使用到curl_cffi
了。
1.TLS 指纹是啥?
在绝大多数的网站都已经使用了 HTTPS,要建立 HTTPS 链接,服务器和客户端之间首先要进行
TLS 握手,在握手过程中交换双方支持的 TLS 版本,加密算法等信息。不同的客户端之间的差异
很大,而且一般这些信息还都是稳定的,所以服务端就可以根据 TLS 的握手信息来作为特征,识别
一个请求是普通的用户浏览器访问,还是来自 Python 脚本等的自动化访问。
JA3 是生成 TLS 指纹的一个常用算法。它的工作原理也很简单,大概就是把以上特征拼接并求 md5。
查看 tls 指纹的网站有:
- https://tls.browserleaks.com/json
- TrackMe | Home
- https://kawayiyi.com/tls
不同网站的生成的指纹可能有差异,但是多次访问同一个网站生成的指纹是稳定的,而且能区分开
不同客户端。下文以第一个网站为例。
2.直接安装
pip install curl_cffi
功能简介:
- 支持JA3/TLS和http2指纹模拟;
- 比requests/tls_client快分开,和aiohttp/pycurl的速度比肩;
- 预编译,不需要自己的机器上再弄一遍;
- 支持asyncio,并且每个请求都可以换代理;
- 修改请求的API,支持http 2.0;
- 模仿requests。
先来看一段代码:
import requests
from pprint import pprint
headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','cache-control': 'no-cache','dnt': '1','pragma': 'no-cache','sec-ch-ua': '"Chromium";v="118", "Microsoft Edge";v="118", "Not=A?Brand";v="99"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"macOS"','sec-fetch-dest': 'document','sec-fetch-mode': 'navigate','sec-fetch-site': 'same-origin','sec-fetch-user': '?1','upgrade-insecure-requests': '1','user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46',
}response = requests.get('https://tls.browserleaks.com/json', headers=headers)
pprint(response.json())
运行效果:
这是直接使用Requests发起的请求。你可以试一试,加上代理以后,这里的ja3_hash
并不会发生变化。并且akamai_hash
和akamai_text
都是空。这个特征是非常明显的,网站直接根据这些特征就可以屏蔽你的爬虫。
于是为了完美模拟浏览器,国外大佬开发出了 curl-impersonate,将 curl 底层依赖的库全部换成了浏览器使用的库,并且版本也是一致的,这样生成的指纹就和浏览器完全一样了。
而 curl_cffi 正是 curl-impersonate 的 Python binding,我们直接使用 pip 安装即可。
那这个问题咋解决尼?
只需要 把 import requests 改成 from curl_cffi import requests
。最后,在requests.get中加一个参数:impersonate="chrome110"
代码如下:
# import requests
from curl_cffi import requests
from pprint import pprint
headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','cache-control': 'no-cache','dnt': '1','pragma': 'no-cache','sec-ch-ua': '"Chromium";v="118", "Microsoft Edge";v="118", "Not=A?Brand";v="99"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"macOS"','sec-fetch-dest': 'document','sec-fetch-mode': 'navigate','sec-fetch-site': 'same-origin','sec-fetch-user': '?1','upgrade-insecure-requests': '1','user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46',
}response = requests.get('https://tls.browserleaks.com/json', headers=headers, impersonate="chrome110")
pprint(response.json())
这次再运行下代码:
这次可以看到akamai_hash
和 akamai_text
已经都有了,网站已经无法识别你的爬虫了。在网站看来,这只是一个Chrome 110
版本发起的请求。甚至Akamai需要的签名也都有了。
支持使用 Sessions
session = requests.Session()
也支持使用代理
proxies = {"https": "xxxxx:7890"}
proxies=proxies
支持模拟的浏览器版本:
- chrome99、
- chrome100、
- chrome101、
- chrome104、
- chrome107、
- chrome110、
- chrome99_android、
- edge99、
- edge101、
- safari15_3、
- safari15_5
同样它也支持asyncio,示例代码如下所示:
from curl_cffi.requests import AsyncSessionasync with AsyncSession() as s:r = await s.get("https://example.com")
要使用异步写法时,代码如下:
import asyncio
from curl_cffi.requests import AsyncSessionurls = ["https://googel.com/","https://facebook.com/","https://twitter.com/",
]async def main():async with AsyncSession() as s:tasks = []for url in urls:task = s.get("https://example.com")tasks.append(task)results = await asyncio.gather(*tasks)asyncio.run(main())
我们以这个网站为例: https://apk.support/ 分析下:
浏览器抓包是能看到页面返回的关键数据,但是再把这个请求放到postman 发个请求试一下:
Just a moment...
,完蛋凉了 标志性的5s盾。
咋办 用curl_cffi
发个请求试一试?
代码如下:
# import requests
from curl_cffi import requests
url = "https://apk.support/search?q=app"payload={}
headers = {'authority': 'apk.support','accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','accept-language': 'zh-CN,zh;q=0.9,en;q=0.8','cache-control': 'no-cache','pragma': 'no-cache','referer': 'https://apk.support/search?q=app','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"macOS"','sec-fetch-dest': 'document','sec-fetch-mode': 'navigate','sec-fetch-site': 'same-origin','sec-fetch-user': '?1','upgrade-insecure-requests': '1','user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
proxies = {'http': 'http://127.0.0.1:7890','https': 'http://127.0.0.1:7890'
}
response = requests.get(url=url, headers=headers, impersonate="chrome110", proxies=proxies)print(response.text)
看看效果:
可以看到返回的已经是正常数据,不再是5s盾了。
参考链接:
https://mp.weixin.qq.com/s/Ch7taYpD-dnNL2FLOuxgGA
https://blog.csdn.net/qiulin_wu/article/details/134180011
https://blog.csdn.net/resphina/article/details/132507212
https://www.jb51.net/python/302044jai.htm
相关文章:

python 使用curl_cffi 绕过jax3指纹-Cloudflare 5s盾
现在越来越多的网站已经能够通过JA3或者其他指纹信息,来识别你是不是爬虫了。传统的方式比如换UA,加代理是没有任何意义了,所以这个时候我们就需要使用到curl_cffi 了。 1.TLS 指纹是啥? 在绝大多数的网站都已经使用了 HTTPS&am…...
Python3学习笔记39-passlib
passlib处理密码哈希的python包,支持很多哈希算法和工具 bcrypt 安装 pip install passlib[bcrypt] 会安装passlib包和bcrypt两个包 密码哈希与校验 from passlib.context import CryptContext# 创建CryptContext对象,指定加密算法 pwd_context CryptContext…...

Matlab 机器人工具箱 动力学
文章目录 R.dynR.fdynR.accelR.rneR.gravloadR.inertiaR.coriolisR.payload官网:Robotics Toolbox - Peter Corke R.dyn 查看动力学参数 mdl_puma560; p560.dyn;%查看puma560机械臂所有连杆的动力学参数 p560.dyn(2);%查看puma560机械臂第二连杆的动力学参数 p560.links(2)…...
Android ShellUtils手机管理器
1. Android ShellUtils手机管理器 Android Shell工具类,可用于检查系统root权限,并在shell或root用户下执行shell命令。如: checkRootPermission() 检查root权限 。execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg)…...

《梦幻西游》本人收集的34个单机版游戏,有详细的视频架设教程,值得收藏
梦幻西游这款游戏,很多人玩,喜欢研究的赶快下载吧。精心收集的34个版本。不容易啊。里面有详细的视频架设教程,可以外网呢。 《梦幻西游》本人收集的34个单机版游戏,有详细的视频架设教程,值得收藏 下载地址࿱…...

吴恩达机器学习全课程笔记第六篇
目录 前言 P96-P100 使用多个决策树 随机森林算法 XGBoost 什么时候使用决策树 P101-P107 聚类 K-means 初始化K-means 选择聚类的个数 P108-P113 异常检测算法 开发和评估异常检测系统 异常检测vs监督学习 选择要使用的特征 前言 这是吴恩达机器学习笔记的第…...

ue4.27 发现 getRandomReachedLocation 返回 false
把这个玩意儿删掉,重启工程,即可 如果还不行 保证运动物体在 volum 内部,也就是绿色范围内确保 project setting 里面的 navigation system 中 auto create navigation data 是打开的(看到过博客说关掉,不知道为啥) 如果还不行&…...

【C++ AVL树】
文章目录 AVL树AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转右单旋左单旋左右双旋右左双旋 代码实现 总结 AVL树 AVL树的概念 二叉搜索树在顺序有序或接近有序的情况下,而插入搜索树将退化为单叉树,此时查找的时间复杂度为O(n),效率低…...

记录一次架构优化处理性能从3千->3万
0.背景 优化Kafka消费入Es,适配600台设备上报数据,吞吐量到达2万每秒 1.环境配置 2.压测工具 3.未优化之前的消费逻辑 4.优化之后的消费流程 5.多线程多ESclient 6.修改ES配置,增加kafka分区,增加线程,提升吞吐量 7.…...
c++二进制位运算使用方法
文章主要内容: C 中的位运算符主要用于对整数类型的数据进行位操作,包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<&#…...
TypeScript之JSON点语法调用
场景 当我们想要通过将JSON中的属性名赋值给一个变量,并且通过点语法实现字段调用.常规的String变量保存会出现下述问题,就可以通过String[][]实现动态调用字段. let parentJSON{"name":"liupeng"}let a:String;Object.keys(parentJSON).forEach(key >…...

手撕Java集合之简易版Deque(LinkedList)
在目前,许多互联网公司的面试已经要求能手撕集合源码,集合源码本身算是源码里比较简单的一部分,但是要在面试极短的10来分钟内快速写出一个简易版的源码还是比较麻烦的,很容易出现各种小问题。所以在平时就要注重这方面的联系。 以…...
MySQL知识点归纳总结(二)
10、MVCC实现原理? 事务ID(Transaction ID):每个事务在执行时都会被分配一个唯一的事务ID,用于标识该事务的开始时间顺序。事务ID是一个递增的整数,随着每个新事务的开始而递增。 Undo日志(Un…...

vue:实现顶部消息横向滚动通知
前言 系统顶部展示一个横向滚动的消息通知,就是消息内容从右往左一直滚动。 效果如下: 代码 使用 <template><div class"notic-bar"><img :src"notic" class"notice-img" /><div class"noti…...
[笔记] wsl 禁用配置 win系统环境变量+代理
wsl 配置禁用 win系统环境变量 进入 wsl 的 /etc/wsl.conf 目录,增加以下配置: [interop] enabledfalse appendWindowsPathfalse然后退出wsl,并且执行关闭正在运行的 wsl,执行命令 wsl --shutdown 最后重新进入wsl 即可。 参考…...

Mysql标量子查询
目录 子查询标量子查询数据准备 子查询 SQL语句中嵌套select语句,称为嵌套查询,又称子查询。 SELECT * FROM t1 WHERE column1 ( SELECT column1 FROM t2 ... );子查询外部的语句可以是insert / update / delete / select 的任何一个&…...

深入了解Java虚拟机(JVM)
Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释执行Java字节码,并在各种平台上执行。JVM的设计使得Java具有跨平台性,开发人员只需编写一次代码,就可以在任何支持Java的系统上运行。我们刚开始学习Ja…...

Image Fusion via Vision-Language Model【文献阅读】
阅读目录 文献阅读AbstractIntroduction3. Method3.1. Problem Overview3.2. Fusion via Vision-Language Model 4. Vision-Language Fusion Datasets5. Experiment5.1Infrared and Visible Image Fusion 6. Conclusion个人总结 文献阅读 原文下载:https://arxiv.or…...

探索Manticore Search:开源全文搜索引擎的强大功能
在当今信息爆炸的时代,数据的快速检索变得至关重要。无论是在电子商务网站、新闻门户还是企业内部文档,高效的搜索引擎都是确保用户满意度和工作效率的关键因素之一。而在搜索引擎领域,Manticore Search 作为一款开源的全文搜索引擎ÿ…...
AI 笔记助手,你的思路整理助手
大家好,今天给大家介绍一款非常实用的 AI 笔记助手——AI Note。这款助手就像是一个贴心的小助手,能帮助我们整理笔记,提高学习和工作效率。 🤖 AI Note 可以智能总结笔记内容,准确标记重点,让我们更快地获…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...