字體反爬破解學習--爬取實習僧


一、前言

  這幾天搜索一些反爬蟲資料時又發現了一種字體反爬的方式。所謂字體反爬,就是一些關鍵數據你在網頁上觀看時他是正常的,而當你在使用瀏覽器的網頁檢查時卻顯示的是一個個的方塊,這樣我們就無法從網頁中將數據正確的爬取下來。下面我們我們就來學習如何去破解字體反爬。

參考文章:1、爬蟲與反爬蟲 | 土法破解字符映射反爬策略及高頻詞可視化

     2、如何解決爬蟲過程中網頁中數字解析為方塊的問題?

二、分析網頁

  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)

代碼運行結果如下:

四、總結

  經過本次的學習我們可以得知:網站人員可以通過更改某些關鍵字符的編碼來方式來進行反爬,我們也可以使用本次的方法來進行反爬。但是,我們也可以得知,如果只是數字,我們還可以通過對應來使他們正常顯示,但當關鍵詞多了的時候,這種方法就很難辦了,如上圖中的職位中的關鍵字。好在本網站職位詳情頁中還是漢字還是正常顯示的。但是假設詳情頁中也改變呢了?這也是一個值得思考的問題。  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM