欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python模擬TLS指紋實(shí)現(xiàn)反爬取

 更新時(shí)間:2023年10月18日 15:01:38   作者:古明地覺的編程教室  
這篇文章主要為大家詳細(xì)介紹了如何利用python模擬TLS指紋實(shí)現(xiàn)反爬取,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,有需要的小伙伴可以了解一下

相信大家在做爬蟲的時(shí)候,都有過被反爬的經(jīng)歷,一旦網(wǎng)站識(shí)別是爬蟲,就會(huì)拒絕請(qǐng)求。反爬機(jī)制有很多,最常見的便是通過請(qǐng)求頭里的 User-Agent,舉個(gè)例子。

import requests
import httpx

response = requests.get("http://www.baidu.com")
print(response.request.headers["User-Agent"])
"""
python-requests/2.28.0
"""

response = httpx.get("http://www.baidu.com")
print(response.request.headers["User-Agent"])
"""
python-httpx/0.23.3
"""

如果 User-Agent 不符合瀏覽器的格式,那么一定不是瀏覽器發(fā)出的,于是網(wǎng)站便可認(rèn)定這屬于爬蟲。當(dāng)然通過 User-Agent 識(shí)別屬于最低級(jí)的方式,因?yàn)榕老x可以偽造自己的 User-Agent。

import requests
import httpx

response = requests.get("http://www.baidu.com",
                        headers={"User-Agent": "Chrome User-Agent"})
print(response.request.headers["User-Agent"])
"""
Chrome User-Agent
"""

response = httpx.get("http://www.baidu.com",
                     headers={"User-Agent": "IE User-Agent"})
print(response.request.headers["User-Agent"])
"""
IE User-Agent
"""

除了 User-Agent 之外,還可以通過請(qǐng)求頭中的 Refer 字段判斷是否為爬蟲。比如你在 A 頁面點(diǎn)擊某個(gè)標(biāo)簽跳轉(zhuǎn)到 B 頁面,那么 Refer 就是 A 頁面的地址。如果你直接訪問的 B 頁面,那么 Refer 就是空。

如果 B 頁面必須通過點(diǎn)擊 A 頁面的標(biāo)簽才能跳轉(zhuǎn),那么網(wǎng)站便可以通過 Refer 來判斷是否為爬蟲。

當(dāng)然啦,反爬機(jī)制還有很多,不同網(wǎng)站使用的策略不一樣。但現(xiàn)在大部分的網(wǎng)站都使用了 HTTPS,在建立 HTTPS 連接的時(shí)候要先進(jìn)行 TLS 握手,在握手的過程中會(huì)協(xié)商加密算法、交換密鑰和驗(yàn)證雙方的身份。

而將 TLS 握手產(chǎn)生的信息收集起來,并使用 JA3 算法生成一個(gè)哈希值,便得到了 TLS 指紋,基于該指紋可以標(biāo)識(shí)、分類和跟蹤使用特定 TLS 配置的客戶端。

因此通過 JA3 哈希生成指紋便可以確定哪些是惡意流量,從而將其拒絕掉。換句話說,通過 TLS 指紋可以識(shí)別哪些是瀏覽器發(fā)出的正常請(qǐng)求,哪些是爬蟲。

那么 TLS 指紋如何查看呢?可以通過以下幾個(gè)網(wǎng)站。

https://tls.browserleaks.com/json

https://tls.peet.ws/

這是我基于瀏覽器訪問的,它的字段都不是空,我們使用 Python 訪問一下。

import requests
import httpx

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"

response = requests.get("https://tls.browserleaks.com/json",
                        headers={"User-Agent": user_agent})
print(response.json())
"""
{'ja3_hash': '8d9f7747675e24454cd9b7ed35c58707', 
 'ja3_text': '771,4866-4867-4865-49196-49200-49195...', 
 'ja3n_hash': 'a790a1e311289ac1543f411f6ffceddf', 
 'ja3n_text': '771,4866-4867-4865-49196-49200-49195...', 
 'akamai_hash': '', 
 'akamai_text': ''}
"""

response = httpx.get("https://tls.browserleaks.com/json",
                     headers={"User-Agent": user_agent})
print(response.json())
"""
{'ja3_hash': '76f01df912881a05228c70b7f61bcbaa', 
 'ja3_text': '771,4866-4867-4865-49196-49200-49195...', 
 'ja3n_hash': '80a9bea1db8ce3a18047816ba1ee07e5', 
 'ja3n_text': '771,4866-4867-4865-49196-49200-49195...', 
 'akamai_hash': '', 
 'akamai_text': ''}
"""

如果使用爬蟲,那么多次請(qǐng)求時(shí)的 ja3_hash 是不變的,并且 akamai_hash 和 akamai_text 均是空,基于該特征很容易識(shí)別是不是爬蟲。即使我們更換代理,設(shè)置請(qǐng)求頭,也無法改變這一點(diǎn)。

于是為了完美模擬瀏覽器,國(guó)外大佬開發(fā)出了 curl-impersonate,將 curl 底層依賴的庫全部換成了瀏覽器使用的庫,并且版本也是一致的,這樣生成的指紋就和瀏覽器完全一樣了。

而 curl_cffi 正是 curl-impersonate 的 Python binding,我們直接使用 pip 安裝即可。

# 和 requests 接口是一致的
from curl_cffi import requests

# 但是多了一個(gè) impersonate 參數(shù),用于指定模擬哪個(gè)瀏覽器
response = requests.get("https://tls.browserleaks.com/json",
                        impersonate="chrome101")

print(response.json())
"""
{'ja3_hash': 'cd08e31494f9531f560d64c695473da9', 
 'ja3_text': '771,4865-4866-4867-49195-49199-49196...', 
 'ja3n_hash': 'aa56c057ad164ec4fdcb7a5a283be9fc', 
 'ja3n_text': '771,4865-4866-4867-49195-49199-49196...', 
 'akamai_hash': '8a32ff5cb625ed4ae2d092e76beb6d99', 
 'akamai_text': '1:65536;3:1000;4:6291456;6:262144|15663105||m,a,s,p'}
"""

# 當(dāng)然也可以先創(chuàng)建 session
session = requests.Session()
# 然后基于 session 發(fā)請(qǐng)求

總共支持如下版本的瀏覽器:

我們選擇 chrome110 即可,然后 curl_cffi 還支持異步發(fā)請(qǐng)求,可以和 asyncio 輕松集成。

import asyncio
from curl_cffi import requests

async def send_req():
    async with requests.AsyncSession() as session:
        response = await session.get(
            "https://tls.browserleaks.com/json",
            impersonate="chrome101"
        )
    print(response.json())
    
asyncio.run(send_req())
"""
{'ja3_hash': 'cd08e31494f9531f560d64c695473da9', 
 'ja3_text': '771,4865-4866-4867-49195-49199-49196...', 
 'ja3n_hash': 'aa56c057ad164ec4fdcb7a5a283be9fc', 
 'ja3n_text': '771,4865-4866-4867-49195-49199-49196...', 
 'akamai_hash': '8a32ff5cb625ed4ae2d092e76beb6d99', 
 'akamai_text': '1:65536;3:1000;4:6291456;6:262144|15663105||m,a,s,p'}
"""

由于指紋特征很難更改,因此通過指紋可以防御一大批爬蟲,而通過 curl_cffi 模擬指紋則可以繞過這道防線。

到此這篇關(guān)于python模擬TLS指紋實(shí)現(xiàn)反爬取的文章就介紹到這了,更多相關(guān)python模擬TLS指紋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何利用opencv對(duì)拍攝圖片進(jìn)行文字識(shí)別

    如何利用opencv對(duì)拍攝圖片進(jìn)行文字識(shí)別

    在有些工程中有時(shí)候我們需要對(duì)圖片文字識(shí)別,下面這篇文章主要給大家介紹了關(guān)于如何利用opencv對(duì)拍攝圖片進(jìn)行文字識(shí)別的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Pycharm2022最新版無法換源解決方法

    Pycharm2022最新版無法換源解決方法

    本文主要介紹了Pycharm2022最新版無法換源解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 關(guān)于sklearn包導(dǎo)入錯(cuò)誤:ImportError:?cannot?import?name Type解決方案

    關(guān)于sklearn包導(dǎo)入錯(cuò)誤:ImportError:?cannot?import?name Type解

    這篇文章主要介紹了關(guān)于sklearn包導(dǎo)入錯(cuò)誤:ImportError:?cannot?import?name‘Type‘解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python 疊加等邊三角形的繪制的實(shí)現(xiàn)

    python 疊加等邊三角形的繪制的實(shí)現(xiàn)

    這篇文章主要介紹了python 疊加等邊三角形的繪制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python smtplib發(fā)送帶附件郵件小程序

    python smtplib發(fā)送帶附件郵件小程序

    這篇文章主要為大家詳細(xì)介紹了python smtplib發(fā)送帶附件郵件小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 使用Python Flask實(shí)現(xiàn)簡(jiǎn)易文件上傳功能

    使用Python Flask實(shí)現(xiàn)簡(jiǎn)易文件上傳功能

    在平時(shí)工作中,文件上傳是一項(xiàng)常見的需求,例如將應(yīng)用異常時(shí)通過腳本生成的dump文件收集起來進(jìn)行分析,但實(shí)現(xiàn)起來卻可能相當(dāng)復(fù)雜,在本文中,我們將探討如何使用Flask實(shí)現(xiàn)文件上傳功能,編寫Dockerfile將應(yīng)用程序通過docker部署,需要的朋友可以參考下
    2024-05-05
  • python多進(jìn)程下實(shí)現(xiàn)日志記錄按時(shí)間分割

    python多進(jìn)程下實(shí)現(xiàn)日志記錄按時(shí)間分割

    這篇文章主要為大家詳細(xì)介紹了python多進(jìn)程下實(shí)現(xiàn)日志記錄按時(shí)間分割,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Python基于Opencv識(shí)別兩張相似圖片

    Python基于Opencv識(shí)別兩張相似圖片

    這篇文章主要介紹了Python基于Opencv識(shí)別兩張相似圖片的步驟,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • 代碼分析Python地圖坐標(biāo)轉(zhuǎn)換

    代碼分析Python地圖坐標(biāo)轉(zhuǎn)換

    這篇文章主要介紹了Python地圖坐標(biāo)轉(zhuǎn)換的相關(guān)知識(shí)點(diǎn)以及分享了相關(guān)的代碼實(shí)例,對(duì)此有興趣的朋友學(xué)習(xí)下。
    2018-02-02
  • Python pygame實(shí)現(xiàn)圖像基本變換的示例詳解

    Python pygame實(shí)現(xiàn)圖像基本變換的示例詳解

    pygame的transform中封裝了一些基礎(chǔ)的圖像處理函數(shù),這篇文章主要為大家介紹了pygame實(shí)現(xiàn)圖像的基本變換,例如縮放、旋轉(zhuǎn)、鏡像等,感興趣的小伙伴可以了解一下
    2023-11-11

最新評(píng)論