这是「进击的Coder」的第 466 篇技术分享

作者:kingname

来源:未闻 Code

阅读本文大概需要 6 分钟。

在前几天的文章《为什么随机 IP、随机 UA 也逃不掉被反爬虫的命运》里面,我介绍了 JA3 指纹算法。这个算法可以在你改掉 IP 和 UA 的情况下依然识别到你。

今天,我们来介绍如何在 Python 里面,使用 requests 请求网站的时候,修改 JA3指纹。

requests 是基于 urllib3 实现的。要修改 JA3 相关的底层参数,所以我们今天要修改 urllib3 里面的东西。

我们知道 JA3 指纹里面,很大的一块就是 Cipher Suits,也就是加密算法。而 requests 里面默认的加密算法如下:

ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:!eNULL:!MD5

冒号分割了不同的加密算法。这些加密算法每一种顺序其实就对应了一个 JA3 指纹字符串,只要我们修改这个顺序,就能得到不同的JA3字符串。

在 requests 里面,要修改 Cipher Suits 中的加密算法,需要修改 urllib3 里面的 ssl  上下文,并实现一个新的 HTTP 适配器 (HTTPAdapter)。在这个适配器里面,我们在每次请求的时候,随机更换加密算法。但需要注意的是!aNULL:!eNULL:!MD5就不用修改了,让他们保持在最后。

涉及到的代码如下:

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_contextORIGIN_CIPHERS = ('ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES')class DESAdapter(HTTPAdapter):def __init__(self, *args, **kwargs):"""A TransportAdapter that re-enables 3DES support in Requests."""CIPHERS = ORIGIN_CIPHERS.split(':')random.shuffle(CIPHERS)CIPHERS = ':'.join(CIPHERS)self.CIPHERS = CIPHERS + ':!aNULL:!eNULL:!MD5'super().__init__(*args, **kwargs)def init_poolmanager(self, *args, **kwargs):context = create_urllib3_context(ciphers=self.CIPHERS)kwargs['ssl_context'] = contextreturn super(DESAdapter, self).init_poolmanager(*args, **kwargs)def proxy_manager_for(self, *args, **kwargs):context = create_urllib3_context(ciphers=self.CIPHERS)kwargs['ssl_context'] = contextreturn super(DESAdapter, self).proxy_manager_for(*args, **kwargs)

在一般情况下,当我们实现一个子类的时候,__init__的第一行应该是super().__init__(*args, **kwargs),但是由于init_poolmanagerproxy_manager_for是复写了父类的两个方法,这两个方法是在执行super().__init__(*args, **kwargs)的时候就执行的。所以,我们随机设置 Cipher Suits 的时候,需要放在super().__init__(*args, **kwargs)的前面。

有了适配器以后,我们使用 requests 时,初始化一个 Session,然后把这个适配器绑定到特定的网站上:

import requests
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67'}
s = requests.Session()
s.headers.update(headers)for _ in range(5):s.mount('https://ja3er.com', DESAdapter())resp = s.get('https://ja3er.com/json').json()print(resp)

其中,s.mount的第一个参数表示这个适配器只在https://ja3er.com开头的网址中生效。

运行效果如下图所示:

可以看到,ja3_hash已经改变了,说明我们请求时的 JA3 指纹已经发生了改变。

End

「进击的Coder」专属学习群已正式成立,搜索「CQCcqc4」添加崔庆才的个人微信或者扫描下方二维码拉您入群交流学习。

看完记得关注@进击的Coder

及时收看更多好文

↓↓↓

崔庆才的「进击的Coder」知识星球已正式成立,感兴趣的可以查看《我创办了一个知识星球》了解更多内容,欢迎您的加入:

好文和朋友一起看~

Python 如何突破反爬虫指纹 JA3相关推荐

  1. Python requests 如何突破反爬虫指纹 JA3算法

    这是「进击的Coder」的第 466 篇技术分享 作者:kingname 来源:未闻 Code " 阅读本文大概需要 6 分钟. " 在前几天的文章<为什么随机 IP.随机 ...

  2. “你有张良计,我有过墙梯” 几行Python代码突破反爬虫机制!

    Time will tell. 1.什么是爬虫和反爬虫 爬虫是使用任何技术手段批量获取网站信息的一种方式,反爬虫是使用任何技术手段阻止别人批量获取自己网站信息的一种方式. 2.User-Agent介绍 ...

  3. python爬虫反爬机制_Python Scrapy突破反爬虫机制(项目实践)

    对于 BOSS 直聘这种网站,当程序请求网页后,服务器响应内容包含了整个页面的 HTML 源代码,这样就可以使用爬虫来爬取数据.但有些网站做了一些"反爬虫"处理,其网页内容不是静态 ...

  4. python pptp proxy_Python爬虫使用代理IP突破反爬虫限制

    说起Python爬虫的发展史,那简直是与反爬虫相爱相杀的血泪史.在互联网中,有网络爬虫的地方,绝对少不了反爬虫的身影.网站反爬虫的拦截前提是要正确区分人类访问用户和网络机器人,当发现可疑目标时,通过限 ...

  5. python反爬虫策略_突破反爬虫策略

    ### 1.什么是爬虫和反爬虫 * **爬虫**是使用任何技术手段批量获取网站信息的一种方式,**反爬虫**是使用任何技术手段阻止别人批量获取自己网站信息的一种方式: ### 2.User-Agent ...

  6. Scrapy突破反爬虫的限制

    7-1 爬虫和反爬的对抗过程以及策略 基本概念 爬虫:自动获取网站数据的程序,关键是批量的获取 反爬虫:使用技术手段防止爬虫程序的方法 误伤:反爬技术将普通用户识别为爬虫,如果误伤过高,效果再好也不能 ...

  7. 深入细枝末节,Python的字体反爬虫到底怎么一回事

    内容选自 即将出版 的<Python3 反爬虫原理与绕过实战>,本次公开书稿范围为第 6 章--文本混淆反爬虫.本篇为第 6 章中的第 4 小节,其余小节将 逐步放送 . 字体反爬虫开篇概 ...

  8. python破解网易反爬虫机制

    用python3 urllib破解有道翻译反爬虫机制 前言 最近在学习python 爬虫方面的知识,网上有一博客专栏专门写爬虫方面的,看到用urllib请求有道翻译接口获取翻译结果.发现接口变化很大, ...

  9. python遇到天猫反爬虫_selenium 淘宝登入反爬虫解决方案(亲测有效)

    前言 目前在对淘宝进行数据爬取的时候都会碰到,登入时的滑块问题,无论是手动还是脚本都不成功.这里的很重要一个原因是很多的网站都对selenium做了反爬虫机制.接下来是笔者参考网上的网友们的方法亲自测 ...

最新文章

  1. linux操作系统之线程
  2. binary search(二分法)
  3. 云图说|初识云数据库GaussDB(for Cassandra)
  4. 安卓 notification2
  5. 如何利用VUE动态添加class样式
  6. java 中的随机数
  7. Java基础93 JDBC连接MySQL数据库
  8. EasyUI:datagrid分页显示+嵌入select下拉选项框
  9. jdbc mysql url写法_Springboot项目连接MySql写了一个bug你也可能遇到
  10. 闩锁效应Latch-up effect---Phsical cell---Welltap---SOI
  11. Chrome 下载文件出现已禁止
  12. 关于一些初级ACM竞赛题目的分析和题解(三)。
  13. 1080 端口被占用
  14. 原 《老路用得上的商学课》86-90学习笔记
  15. Arduino 实现PWM输出背后的相关知识
  16. 玩cf一直连接服务器失败怎么办啊,cf连接服务器失败怎么办?
  17. Codefroces 760 B. Frodo and pillows
  18. html表单颜色背景图片大全,css背景颜色、背景图片,以及列表的多种样式
  19. ​NeurIPS 2022 | IPMT:用于小样本语义分割的中间原型挖掘Transformer
  20. endnote中CWYW无文件_文献管理工具(三):EndNote 操作指南(免费在线版)

热门文章

  1. 如何判断用户是用Modem还是经过路由器上网呢
  2. 点晴oa办公系统 18.0119B
  3. 共享打印机提示“0x00000709”错误的解决方法
  4. The method xxx of type xxx must override a superclass method
  5. 合并 Excel 的多张工作表Sheet报错:无法在此处粘贴此内容
  6. TSINGSEE青犀视频监控技术在城市轨道交通中的应用
  7. 根据当前请求的特征,判断该请求是否来自手机终端
  8. C++:实现量化年环比通胀上限和下限息票测试实例
  9. 游戏数值知识点———养成感(二)
  10. python实现连连看辅助--图像识别延伸(百度AI)