保姆级教学,起点中文网字体反爬。
我們發(fā)現(xiàn)86.81被亂碼取代了。雖然不知道為什么會(huì)顯示亂碼,但是說明這個(gè)內(nèi)容是有價(jià)值的,我們嘗試破解,并將86.81等等數(shù)字正常顯示在控制臺(tái)上。
打開網(wǎng)頁的源代碼,找到86.81的源代碼,我們發(fā)現(xiàn)“萬字”前面有5串的數(shù)字,而86.81剛好時(shí)5個(gè)字符,我們猜測(cè)86.81被這5串?dāng)?shù)字取代了,說明源碼可能是這些數(shù)字。
那么思路就清晰了,我們只需要將這些源碼破解了,并將破解的源碼替換未破解的源碼,那么就可能實(shí)現(xiàn)目的。
我們刷新一下網(wǎng)頁。突然發(fā)現(xiàn)那5串?dāng)?shù)字改變了,說明字體會(huì)刷新:
我們發(fā)現(xiàn)這個(gè)數(shù)字指向一個(gè)class,,一個(gè)類。它的名稱為hcMFhsGt。在右邊的樣式欄中,我們看到有個(gè)font-family,這個(gè)是他的字體。
我們能看到定義的字體文件:
分析獲得信息:
加密內(nèi)容:𘛩𘛯𘛮𘛩𘛫
字體文件名稱:class=“piQOMNSL”
字體文件:piQOMN.woff
要求映射為正常內(nèi)容:86.81
首先把解密前網(wǎng)頁下載下來,并保存:
下載完成后左邊項(xiàng)目欄還會(huì)增加一個(gè)html文件,這個(gè)就是解密前的網(wǎng)頁源代碼。
為了防止文件破損,用代碼將woff字體文件下載:
打開下載的字體文件:
發(fā)現(xiàn)更加詳細(xì)的信息無法獲取。
使用fontTools工具查看:
查看下載的font文件:
我們發(fā)現(xiàn)id跟name完全對(duì)不上,那么我們暫時(shí)忽略id。我們?cè)儆^察name發(fā)現(xiàn),name后面對(duì)應(yīng)的跟我們用網(wǎng)站解析出來的字體一一對(duì)應(yīng)。
不過信息依舊不足,我們繼續(xù)查看:
我們看到cmap的區(qū)域有了我們想要的信息。Name沒有發(fā)生改變,但是前面id變成了code。
觀察發(fā)現(xiàn)code為0x開頭說明是16進(jìn)制的數(shù)。此時(shí)前面一片開闊。
我們將這些16進(jìn)制的數(shù)轉(zhuǎn)換為10進(jìn)制查看一下:
"0x186e6" =100070
"0x186e8"=100072
"0x186e9"=100073
"0x186ea" =100074
然后:
100070對(duì)應(yīng)name“nine”
100072對(duì)應(yīng)mame“zero”
我們發(fā)現(xiàn)轉(zhuǎn)義到10進(jìn)制后的數(shù)字非常眼熟,查看一下未解密的網(wǎng)頁源代碼,這不就是86.81加密的內(nèi)容嗎!
加密內(nèi)容:𘛩𘛯𘛮𘛩𘛫
那么驗(yàn)證一下:
Name=“eight”="0x186e9"=100073
Name=“six”=“0x186ef”=100079
Name=“period”=“0x186ee”=100078
說明這就是86.81加密方式,那么接下來只需要將16進(jìn)制的數(shù)轉(zhuǎn)化并替換即可。
將解析到的字體,從字典中從英文替換為數(shù)字:
將網(wǎng)頁中的加密內(nèi)容替換為破解的數(shù)字
?
然后我們發(fā)現(xiàn)解密后的網(wǎng)頁源代碼中加密的內(nèi)容已經(jīng)解密了:
我們?cè)倏纯淳W(wǎng)頁中的:
發(fā)現(xiàn)已經(jīng)解密完成了。
那么就可以爬取想要的信息了。
import re import requests from fontTools.ttLib import TTFont#先把網(wǎng)頁下載下來 response = requests.get('https://book.qidian.com/info/1001535146/') html = response.text #'w'只寫,不存在則創(chuàng)建 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將/之間分隔開,取最后一個(gè)元素將字體文件鏈接中的’piQOMNSL.woff‘提取出來給font_path命名 with open(font_path,mode='wb') as f:#二進(jìn)制f.write(font_response.content)#用fonttools查看字體源碼 # font_path = 'piQOMNSL.woff' fi = TTFont(font_path)#打開當(dāng)前目錄的font_path文件,也就是”piQOMNSL.woff“ fi.saveXML('font.xml')#另存為font.xml#解析到字體,并將英文替換為數(shù)字 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)#將字典的值從英文轉(zhuǎn)換為數(shù)字 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字典,將網(wǎng)頁中的加密內(nèi)容替換為破解的數(shù)字 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)總結(jié)
以上是生活随笔為你收集整理的保姆级教学,起点中文网字体反爬。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sap crystal reports(
- 下一篇: Greenplum实战--standby