一、前言
這幾天搜索一些反爬蟲資料時又發現了一種字體反爬的方式。所謂字體反爬,就是一些關鍵數據你在網頁上觀看時他是正常的,而當你在使用瀏覽器的網頁檢查時卻顯示的是一個個的方塊,這樣我們就無法從網頁中將數據正確的爬取下來。下面我們我們就來學習如何去破解字體反爬。
參考文章:1、爬蟲與反爬蟲 | 土法破解字符映射反爬策略及高頻詞可視化
二、分析網頁
1、打開實習僧網站,搜索python崗位的工作,我們可以從下圖看到網頁上的數據都是正常顯示的;
但當我們打開瀏覽器上的檢查元素的時候,卻發現原本正常顯示的數字變成了一個個的方塊;
如果此時我們此時直接將數據爬取下來,所看到的數據肯定是慘不忍睹的。接下來我們就來破解這個反爬。
2、根據上面的參考文章,可以了解到這個方塊其實就是網站使用了自己的一套Unicode和數字的對應規則,因此我們在解析時需要替換相應的Unicode為數字。首先將方塊轉為Unicode,再將方塊的Unicode與網頁上看到的數字一一對應起來,如下;
1 replace_dict = { 2 '\ueda3': '0', 3 '\ue7d5': '1', 4 '\uef31': '2', 5 '\uec7d': '3', 6 '\ue73d': '4', 7 '\ue6d0': '5', 8 '\ueabe': '6', 9 '\uf375': '7', 10 '\ue4df': '8', 11 '\uf6dd': '9', 12 }
3、可是當我按照參考文章的步驟去做的時候卻發現,出現下圖的狀況;
可以看到數字已經全部正常爬取了,但是職位的一些關鍵字卻也是被網站更改了編碼。如果我們要將這些Unicode碼與漢字對應起來的話那就太麻煩了。但是,當我們打開職位的詳細信息后,可以看到;
在職位詳細頁面里漢字的關鍵字是正常顯示的,所以我們可以在主頁抓取每個職位的鏈接,在進入每個職位的詳情頁去抓取我們想要的信息,而且詳情頁里的信息更加的全面。(其實是我之前偷懶了,就沒來這個頁面爬。。。)
三、代碼
由於時間問題(其實就是因為懶。。。)我就沒有去寫抓取詳情頁的代碼了,只是在職位列表頁面抓取了一些簡單的信息,代碼如下;
1 import requests 2 from bs4 import BeautifulSoup 3 4 url = 'https://www.shixiseng.com/interns?k=Python&p=1' 5 headers = { 6 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0', 7 'Referer': 'https://www.shixiseng.com/', 8 } 9 replace_dict = { 10 '\ueda3': '0', 11 '\ue7d5': '1', 12 '\uef31': '2', 13 '\uec7d': '3', 14 '\ue73d': '4', 15 '\ue6d0': '5', 16 '\ueabe': '6', 17 '\uf375': '7', 18 '\ue4df': '8', 19 '\uf6dd': '9', 20 } 21 def spider(url): 22 response = requests.get(url, headers=headers) 23 soup = BeautifulSoup(response.content, 'html.parser', from_encoding="utf-8") 24 text = soup.prettify() 25 for key, value in replace_dict.items(): 26 text = text.replace(key, value) 27 soup = BeautifulSoup(text, 'html.parser') 28 positions = soup.find_all('a', class_='name') 29 detail = soup.find_all('div', class_='more') 30 for i in range(len(positions)): 31 spans = detail[i].find_all('span') 32 info = { 33 'position': positions[i].get_text().strip(), 34 'salary': spans[0].get_text().strip(), 35 'day': spans[1].get_text().strip(), 36 'time': spans[2].get_text().strip(), 37 } 38 print(info) 39 40 if __name__ == '__main__': 41 spider(url)
代碼運行結果如下:
四、總結
經過本次的學習我們可以得知:網站人員可以通過更改某些關鍵字符的編碼來方式來進行反爬,我們也可以使用本次的方法來進行反爬。但是,我們也可以得知,如果只是數字,我們還可以通過對應來使他們正常顯示,但當關鍵詞多了的時候,這種方法就很難辦了,如上圖中的職位中的關鍵字。好在本網站職位詳情頁中還是漢字還是正常顯示的。但是假設詳情頁中也改變呢了?這也是一個值得思考的問題。