1. 程式人生 > >「Python3爬蟲」貓眼電影爬蟲(破解字符集反爬)!

「Python3爬蟲」貓眼電影爬蟲(破解字符集反爬)!

一、頁面分析

首先開啟 貓眼電影 ,然後點選一個正在熱播的電影(比如: 毒液 )。開啟開發者工具,點選左上角的箭頭,然後用滑鼠點選網頁上的票價,可以看到原始碼中顯示的不是數字,而是某些根本看不懂的字元,這是因為使用了font-face定義字符集,並通過unicode去對映展示,所以我們在網頁上看到的是數字,但是在原始碼中看到的卻是別的字元。

「Python3爬蟲」貓眼電影爬蟲(破解字符集反爬)!

 

「Python3爬蟲」貓眼電影爬蟲(破解字符集反爬)!

 

碰到這些根本看不懂的字元怎麼辦呢?不慌,右鍵選擇檢視網頁原始碼,然後找到相應的位置(如下圖)。那麼是不是“”映射出來就是28呢?

「Python3爬蟲」貓眼電影爬蟲(破解字符集反爬)!

 

通過檢視原始碼,可以找到如下內容, 而當我們訪問這裡面的連結的時候,就可以下載相應的字型檔案,關於font-face可以點選 這裡 查看了解:

「Python3爬蟲」貓眼電影爬蟲(破解字符集反爬)!

 

當我下載好字型檔案後,滿心歡喜的雙擊想要點開的時候,卻發現無法開啟(T_T)。查閱資料之後知道了一個叫做FontCreator的軟體,用這個軟體可以開啟我們下載的字型檔案,沒有安裝這個軟體的可以進入官網 https://www.high-logic.com/ 下載安裝,如果下載得很慢的可以用百度雲下載 (連結:https://pan.baidu.com/s/1ImxwPhKdzZo2g4bIjiGCZw ,提取碼:m0yf )。下載好之後開啟軟體,看到如下介面,選擇Use Evaluation Version,這個軟體我們可以免費使用三十天。

 

「Python3爬蟲」貓眼電影爬蟲(破解字符集反爬)!

 

 

開啟軟體後,再開啟我們下載的字型檔案,可以看到數字2和8分別對應的是uniE83B和uniE375,和前面看到的編碼是一致的。

「Python3爬蟲」貓眼電影爬蟲(破解字符集反爬)!

 

那麼我們下載好字符集之後,只要將其中的字元編碼和數字對應的資訊提取出來,再把網頁原始碼中的字元編碼替換掉,就能得到我們想要的資料了。這裡要用到一個三方庫fontTools,利用fontTools可以獲取每一個字元物件,這個物件你可以簡單的理解為儲存著這個字元的形狀資訊,而且編碼可以作為這個物件的id,具有一一對應的關係。不過這裡還有一個問題,就是網頁每次使用的字符集是隨機變化的,我們也就無法使用一個固定的字符集去做到反爬。

解決思路如下:先儲存一個字型檔案(比如base.woff),然後解析其數字和編碼的對應關係,然後爬取的時候把新的字型檔案下載下來(比如online.woff),網頁中的一個數字的編碼(比如ABCD),我們先通過編碼ABCD找到這個字元在online.woff中的物件,並且把它和base.woff中的物件逐個對比,直到找到相同的物件,然後獲取這個物件在base.woff中的編碼,再通過編碼確認是哪個數字。

二、主要程式碼

解析下載的字型檔案,由於字型檔案中有多餘的字元,需要捨棄掉。

 1 # 解析字型庫
 2 def parse_ttf(font_name):
 3 """
 4 :param font_name: 字型檔名
 5 :return: 字元-數字字典
 6 """
 7 base_nums = ['3', '0', '1', '6', '4', '2', '5', '8', '9', '7']
 8 base_fonts = ['uniEB84', 'uniF8CA', 'uniEB66', 'uniE9DB', 'uniE03C',
 9 'uniF778', 'uniE590', 'uniED12', 'uniEA5E', 'uniE172']
10 font1 = TTFont('base.woff') # 本地儲存的字型檔案
11 font2 = TTFont(font_name) # 網上下載的字型檔案
12 
13 uni_list = font2.getGlyphNames()[1:-1] # 去掉頭尾的多餘字元
14 temp = {}
15 # 解析字型庫
16 for i in range(10):
17 uni2 = font2['glyf'][uni_list[i]]
18 for j in range(10):
19 uni1 = font1['glyf'][base_fonts[j]]
20 if uni2 == uni1:
21 temp["" + uni_list[i][3:].lower() + ";"] = base_nums[j]
22 return temp

解析網頁原始碼,把其中的編碼替換成數字,這裡選擇把網頁原始碼儲存下來,這樣的話編碼就不會改變,也就能正確的解析。

進群:960410445  即可獲取大禮包教程一份!

 1 # 解析網頁得到數字資訊
 2 def get_nums(font_dict):
 3 """
 4 :param font_dict: 字元-數字字典
 5 :return: 由評分、評分人數、票房和票價組成的列表
 6 """
 7 num_list = []
 8 with open('html', 'r', encoding='utf-8') as f:
 9 for line in f.readlines():
10 lst = re.findall('(.*?)<', line)
11 if lst:
12 num = lst[0]
13 for i in font_dict.keys():
14 if i in num:
15 num = num.replace(i, font_dict[i])
16 num_list.append(num)
17 return num_list

三、執行結果

「Python3爬蟲」貓眼電影爬蟲(破解字符集反爬)!