<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本次要採集的目標站點是查策,該測試站點如下所示。
目標站點網址如下
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)
此時也發現了資料差異,介面返回和頁面展現,差異如下所示。
此時字型反爬邏輯已經發現,但是字型檔案還存在如下邏輯:
解決第一個問題,確定目標字型檔案,該操作很簡單,只需要通過檔案替換規則比對即可,例如下圖中響應中的 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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45