美文网首页python
修改 Python 的 JA3 , 突破反爬虫指纹

修改 Python 的 JA3 , 突破反爬虫指纹

作者: ___n | 来源:发表于2021-10-28 09:14 被阅读0次

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_context

ORIGIN_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'] = context
        return super(DESAdapter, self).init_poolmanager(*args, **kwargs)

    def proxy_manager_for(self, *args, **kwargs):
        context = create_urllib3_context(ciphers=self.CIPHERS)
        kwargs['ssl_context'] = context
        return 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已经改变了

相关文章

  • 修改 Python 的 JA3 , 突破反爬虫指纹

    requests 是基于 urllib3 实现的,要修改 JA3 相关的底层参数,就要修改 urllib3 里面的...

  • Python构建代理池

    用 Python 爬取网站内容的时候,容易受到反爬虫机制的限制,而突破反爬虫机制的一个重要措施就是使用IP代理。我...

  • 爬虫入门基础

    Day01 一、爬虫介绍 什么是爬虫 Python爬虫的优势 Python爬虫需要掌握什么 爬虫与反爬虫与反反爬虫...

  • 01-认识爬虫

    一、爬虫介绍 什么是爬虫 Python爬虫的优势 Python爬虫需要掌握什么 爬虫与反爬虫与反反爬虫三角之争 网...

  • Python代理IP爬虫的简单使用

    前言 Python爬虫要经历爬虫、爬虫被限制、爬虫反限制的过程。当然后续还要网页爬虫限制优化,爬虫再反限制的一系列...

  • 爬虫不尽兴?那再来点反爬虫吧!

    爬虫与反爬虫,这相爱相杀的一对,在现在你会爬虫是不够的,你还得会反爬虫。 为 Python 平反 首先是爬虫,爬虫...

  • 爬虫?反爬虫!

    爬虫与反爬虫,这相爱相杀的一对,在现在你会爬虫是不够的,你还得会反爬虫。 为 Python 平反 首先是爬虫,爬虫...

  • 爬虫、反爬虫与突破反爬虫

    【爬虫】批量获取网站数据 【反爬虫】防止爬虫批量获取网站数据。反爬需要人力和机器成本。反爬可能将普通用户识别为爬虫...

  • 利用selenium cookies实现淘宝免密登录

    关键词:selenium,python,淘宝,反爬虫,cookies 一、阿里这种公司“反爬虫技术”业界一流,如下...

  • 抖音爬虫教程,python爬虫采集反爬策略

    抖音爬虫教程,python爬虫采集反爬策略一、爬虫与反爬简介爬虫就是我们利用某种程序代替人工批量读取、获取网站上的...

网友评论

    本文标题:修改 Python 的 JA3 , 突破反爬虫指纹

    本文链接:https://www.haomeiwen.com/subject/txnmaltx.html