保姆级教学,起点中文网字体反爬。
我們發現86.81被亂碼取代了。雖然不知道為什么會顯示亂碼,但是說明這個內容是有價值的,我們嘗試破解,并將86.81等等數字正常顯示在控制臺上。
打開網頁的源代碼,找到86.81的源代碼,我們發現“萬字”前面有5串的數字,而86.81剛好時5個字符,我們猜測86.81被這5串數字取代了,說明源碼可能是這些數字。
那么思路就清晰了,我們只需要將這些源碼破解了,并將破解的源碼替換未破解的源碼,那么就可能實現目的。
我們刷新一下網頁。突然發現那5串數字改變了,說明字體會刷新:
我們發現這個數字指向一個class,,一個類。它的名稱為hcMFhsGt。在右邊的樣式欄中,我們看到有個font-family,這個是他的字體。
我們能看到定義的字體文件:
分析獲得信息:
加密內容:𘛩𘛯𘛮𘛩𘛫
字體文件名稱:class=“piQOMNSL”
字體文件:piQOMN.woff
要求映射為正常內容:86.81
首先把解密前網頁下載下來,并保存:
下載完成后左邊項目欄還會增加一個html文件,這個就是解密前的網頁源代碼。
為了防止文件破損,用代碼將woff字體文件下載:
打開下載的字體文件:
發現更加詳細的信息無法獲取。
使用fontTools工具查看:
查看下載的font文件:
我們發現id跟name完全對不上,那么我們暫時忽略id。我們再觀察name發現,name后面對應的跟我們用網站解析出來的字體一一對應。
不過信息依舊不足,我們繼續查看:
我們看到cmap的區域有了我們想要的信息。Name沒有發生改變,但是前面id變成了code。
觀察發現code為0x開頭說明是16進制的數。此時前面一片開闊。
我們將這些16進制的數轉換為10進制查看一下:
"0x186e6" =100070
"0x186e8"=100072
"0x186e9"=100073
"0x186ea" =100074
然后:
100070對應name“nine”
100072對應mame“zero”
我們發現轉義到10進制后的數字非常眼熟,查看一下未解密的網頁源代碼,這不就是86.81加密的內容嗎!
加密內容:𘛩𘛯𘛮𘛩𘛫
那么驗證一下:
Name=“eight”="0x186e9"=100073
Name=“six”=“0x186ef”=100079
Name=“period”=“0x186ee”=100078
說明這就是86.81加密方式,那么接下來只需要將16進制的數轉化并替換即可。
將解析到的字體,從字典中從英文替換為數字:
將網頁中的加密內容替換為破解的數字
?
然后我們發現解密后的網頁源代碼中加密的內容已經解密了:
我們再看看網頁中的:
發現已經解密完成了。
那么就可以爬取想要的信息了。
import re import requests from fontTools.ttLib import TTFont#先把網頁下載下來 response = requests.get('https://book.qidian.com/info/1001535146/') html = response.text #'w'只寫,不存在則創建 with open('解密前.html',mode='w',encoding='utf-8') as f:f.write(html)#代碼下載字體文件 with open('解密前.html',mode='r',encoding='utf-8') as f:html = f.read()#正則匹配需要下載的字體文件下載地址 font_url=re.findall("\('eot'\); src: url\('(.*?)'\) format\('woff'\)",html)[0]#目的是獲取字體文件鏈接 print(font_url)#下載 font_response = requests.get(font_url) font_path = font_url.split('/')[-1]#用split將/之間分隔開,取最后一個元素將字體文件鏈接中的’piQOMNSL.woff‘提取出來給font_path命名 with open(font_path,mode='wb') as f:#二進制f.write(font_response.content)#用fonttools查看字體源碼 # font_path = 'piQOMNSL.woff' fi = TTFont(font_path)#打開當前目錄的font_path文件,也就是”piQOMNSL.woff“ fi.saveXML('font.xml')#另存為font.xml#解析到字體,并將英文替換為數字 font_map = fi['cmap'].getBestCmap()d = {'one':'1','two':'2','three':'3','four':'4','five':'5','six':'6','seven':'7','eight':'8','nine':'9','zero':'0','period':'.'}print('font_map',font_map) print('d',d)#將字典的值從英文轉換為數字 for key in font_map.keys():# key:100070# font_map[key]: 'key'# d[font_map[key]]: '5'font_map[key]=d[font_map[key]] print(font_map)#font_map字典,將網頁中的加密內容替換為破解的數字 for key,value in font_map.items():print(key,value)html = html.replace('&#'+ str(key)+';',str(value))with open('解密后.html',mode='w',encoding='utf_8') as f:f.write(html)總結
以上是生活随笔為你收集整理的保姆级教学,起点中文网字体反爬。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sap crystal reports(
- 下一篇: Greenplum实战--standby