一、前言
这几天搜索一些反爬虫资料时又发现了一种字体反爬的方式。所谓字体反爬,就是一些关键数据你在网页上观看时他是正常的,而当你在使用浏览器的网页检查时却显示的是一个个的方块,这样我们就无法从网页中将数据正确的爬取下来。下面我们我们就来学习如何去破解字体反爬。
参考文章: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)
代码运行结果如下:
四、总结
经过本次的学习我们可以得知:网站人员可以通过更改某些关键字符的编码来方式来进行反爬,我们也可以使用本次的方法来进行反爬。但是,我们也可以得知,如果只是数字,我们还可以通过对应来使他们正常显示,但当关键词多了的时候,这种方法就很难办了,如上图中的职位中的关键字。好在本网站职位详情页中还是汉字还是正常显示的。但是假设详情页中也改变呢了?这也是一个值得思考的问题。