字体反爬破解学习--爬取实习僧

时间:2022-09-18 16:10:31

一、前言

  这几天搜索一些反爬虫资料时又发现了一种字体反爬的方式。所谓字体反爬,就是一些关键数据你在网页上观看时他是正常的,而当你在使用浏览器的网页检查时却显示的是一个个的方块,这样我们就无法从网页中将数据正确的爬取下来。下面我们我们就来学习如何去破解字体反爬。

参考文章: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)

代码运行结果如下:

字体反爬破解学习--爬取实习僧

四、总结

  经过本次的学习我们可以得知:网站人员可以通过更改某些关键字符的编码来方式来进行反爬,我们也可以使用本次的方法来进行反爬。但是,我们也可以得知,如果只是数字,我们还可以通过对应来使他们正常显示,但当关键词多了的时候,这种方法就很难办了,如上图中的职位中的关键字。好在本网站职位详情页中还是汉字还是正常显示的。但是假设详情页中也改变呢了?这也是一个值得思考的问题。