瀏覽器指紋
反爬中會遇到瀏覽器指紋,它是不會隨着你更換 IP 或者 User-Agent 而改變的。並且他們的指紋每次請求也是固定的。只要網站發現某個擁有特定指紋的客戶端持續高頻率請求網站,它就可以把你封掉。例子如下:
https://ja3er.com/ # 可以看到ja3的指紋
https://ja3er.com/json # 請求這個直接返回本次請求的json
當在網頁打開的時候是這樣的
未修改requests加密的時候請求打開是這樣的
因為通過python,或者瀏覽器,或者其他解釋器 得到的結果都是不一樣的, 但是每個解釋器里面的請求是一樣的,所以,我們要修改 ja3_hash 的值,因為代碼修改是參考別人的,所以就直接粘出來好了,具體解釋去網上看看
新建一個Py文件,然后復制代碼
import random
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)
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'}
# 有了適配器以后,我們使用 requests 時,初始化一個 Session,然后把這個適配器綁定到特定的網站上:
s = requests.Session()
s.headers.update(headers)
for _ in range(2):
s.mount('https://ja3er.com', DESAdapter()) # s.mount的第一個參數表示這個適配器只在https://ja3er.com開頭的網址中生效
resp = s.get('https://ja3er.com/json').json()
print(resp)
執行py代碼,會看到ja3_hash已經被修改了
成功。這樣就可以繞過 ja3_hash 指紋檢測的網站了