首頁 > 軟體

python超詳細實現字型反爬流程

2022-05-19 13:00:46

查策實戰場景

本次要採集的目標站點是查策,該測試站點如下所示。

目標站點網址如下

www.chacewang.com/chanye/news?newstype=sbtz

該站點的新聞資訊類資訊很容易採集,通過開發者工具檢視了一下,並不存在加密反爬。

但字型反爬還是存在的,案例尋找過程非常簡單,只需要開發者工具切換到網路,字型檢視,然後預覽一下字型檔案即可。

可以看到僅數位進行了順序變換。

接下來就是實戰解碼的過程,可以通過 FontCreator 檢視一下該字型內容。

字型實戰解碼

隨機下載一個字型檔案開啟之後發現出事情了,字型檔案內容如下所示。

其中除了簡易的數位外,還存在大量的中文字元,也就是存在一種可能性,網頁中的部分中文字元也被替換掉了。

我們拿一個【類】字做一下測試。

結果在頁面中檢索了一下,發現並沒有發生變化,而且通過計算樣式檢視,得到的字型是平方和微軟雅黑?

可能網站升級之後,字型反爬只保留了數位部分。

既然這樣,那整體的難度就降低了~

我們隨機存取一個頁面,獲取其網頁原始碼內容。

存取公告類資訊,需要提前登入,註冊一個賬號即可

import requests
headers = {
    "content-type": "application/json",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 你的 UA 資訊",
    "Referer": "https://www.chacewang.com/chanye/news?newstype=sbtz",
    "cookie": "cityinfo={%22citycode%22:%22RegisterArea_HBDQ_Hebei_ShiJiaZhuangShi%22%2C%22cityname%22:%22%E7%9F%B3%E5%AE%B6%E5%BA%84%22}; 你的 COOKIES 資訊"
}
res = requests.get('https://www.chacewang.com/news/detail?guid=KZwvLqpBVgE5AXB67k4XQY734MnG6ayo', headers=headers)
print(res.text)

結果執行程式碼之後,返回了一堆亂碼。

橡皮擦原以為還有什麼加密邏輯存在,結果發現多慮了,只是一個非同步載入,真正的資料介面在下面。

web.chace-ai.com/api/gov/news/getDetailById/?id=KZwvLqpBVgE5AXB67k4XQY734MnG6ayo

介面一換,資料就可以獲取到了。

import requests
headers = {
    "content-type": "application/json",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36",
    "Referer": "https://www.chacewang.com/chanye/news?newstype=sbtz",
    "authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1Ni 這個值每次登入都會切換"
}
res = requests.get('https://web.chace-ai.com/api/gov/news/getDetailById/?id=KZwvLqpBVgE5AXB67k4XQY734MnG6ayo', headers=headers)
print(res.text)

此時也發現了資料差異,介面返回和頁面展現,差異如下所示。

此時字型反爬邏輯已經發現,但是字型檔案還存在如下邏輯:

  • 每次請求有 2 個字型檔案,確定哪一個影響;
  • 字型檔案每次重新整理都會產生變化;
  • 字型檔名每次重新整理都會產生變化。

解決第一個問題,確定目標字型檔案,該操作很簡單,只需要通過檔案替換規則比對即可,例如下圖中響應中的 0 被替換為 2。

解決第三個問題,如何獲取字型檔名。

在網路檢視頁面,喚醒搜尋方塊,搜尋字型檔名,發現其在 2 個請求中出現。第一個是字型檔案,第二個是我們上文請求的資料介面。

檢索之後發現字型檔名在介面返回的 news_set 引數中,並且是部分字串,稍後我們擷取字串即可。

字型反爬編碼時間

下面我們編寫獲取字型檔案的程式碼,如下所示,下述程式碼注意自行獲取一下 UA 值和 authorization 值。

import requests
headers = {
    "content-type": "application/json",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ",
    "Referer": "https://www.chacewang.com/chanye/news?newstype=sbtz",
    "authorization": "Bearer "
}
res = requests.get('https://web.chace-ai.com/api/gov/news/getDetailById/?id=KZwvLqpBVgE5AXB67k4XQY734MnG6ayo', headers=headers)
# 獲取字型檔名
font_name = res.json()['data']['news_set'][:16]
res = requests.get(f'https://web.chace-ai.com/media/fonts/{font_name}.woff', headers=headers)
# 儲存字型檔案
file_woff =f'./fonts/{font_name}.woff'
with open(file_woff, 'wb') as f:
    f.write(res.content)

後續邏輯就變得簡單了,本文僅展示字型呈現部分邏輯,其安裝 fontTools 模組,並使用下述命令列匯入相關功能。

from fontTools.ttLib import TTFont

字型檔案讀取程式碼如下所示。

# 讀取檔案
with open(file_woff, 'rb') as font_file:
    font = TTFont(io.BytesIO(font_file.read()))  # 轉換成字型物件
print(font)
# 獲取 cmap
font_obj = font['cmap']
# 獲取 cmap table
font_tables = font['cmap'].tables
uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder()
print(uni_list[2:12])

查策,查策,就這麼簡單的解決了站點

到此這篇關於python超詳細實現字型反爬流程的文章就介紹到這了,更多相關python字型反爬內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com