反爬原理
利用字體文件,對顯示的字體進行修改,使得頁面中為標準字體而html代碼中的字體為亂碼形態(tài)。
破解原理
找到字體文件,找到字體文件中,每個字對應的字典,然后對HTML代碼中的亂碼進行替換。
目標網(wǎng)站
https://book.qidian.com/info/1021578238@Anzw
爬取思路
1、找到目標網(wǎng)站的請求方式
2、確定爬取文件
3、找到加密字體
4、爬取數(shù)據(jù)
爬取步驟
1、通過f12開發(fā)者工具找到請求頁面,查看頁面信息,確定請求為GET請求

2、找到要爬取的數(shù)據(jù),發(fā)現(xiàn)是一堆亂碼,無法正確讀出數(shù)字
3、根據(jù)span標簽的class屬性到css中找到定義的css,從中可以找到字體文件名

4、按CTRL + shift +f 進行全局搜索文件名(本次文件名為ttDVCePS)文件名可能隨時變動的

5、點擊搜索到的結(jié)果可以進入到html詳情頁面

6、在詳情頁中再次搜索文件名,找到文件位置,向后在次找到(.ttf)字體文件的文件的url,下載字體文件。字體加密所對用的字典都在這個文件中。


7、python 可以利用TTFont打開字體文件,然后對字體文件進行操作,操作如下:
7.1、安裝TTFont
pip install fontTools
7.2 導入TTFont模塊
from fontTools.ttLib import TTFont
7.3 把 .ttf文件修改格式保存為xml文件
TTFont('文件名')用來打開.ttf文件,其中saveXML()用來保存為xml格式的文件
a = TTFont('RyCKowTQ.ttf')
a.saveXML('a.xml')
8、打開.xml文件,(瀏覽器、sublime、pycharm都可以打開)找到文字,id為正常文字,name為加密后的值,選一個name在文件中進行搜索

9、搜索到網(wǎng)頁中顯示的字體,code就是網(wǎng)頁中對應的值。所有對應都在<cmap></cmap>中

10、利用Python提取cmap中對應的字典
aa['cmap'].getBestCmap()

11、根據(jù)得到的字典對頁面加密字體進行替換
12、注意。如果頁面字體文件每次請求都不一樣。需要在請求頁面時采用session進行請求,在用session對字體文件進行下載。下載的文件可以不用保存到本地,使用io.BytesIO保存到內(nèi)存中即可。
如果字體文件不變,則可以把字體字典直接保存下來。
#coding:utf-8
import sys
import requests,io
from fontTools.ttLib import TTFont
seeion = requests.session()
url = 'https://qidian.gtimg.com/qd_anti_spider/CultUYUT.ttf'
a = seeion.get(url)
aa = TTFont(io.BytesIO(a.content))
a = TTFont('RyCKowTQ.ttf')
a.saveXML('a.xml')
bb = aa['cmap'].getBestCmap()
print(bb)
