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

一、前言

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

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

代码运行结果如下:

四、总结

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

 

转载于:https://www.cnblogs.com/Lethons/p/9096314.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于使用 Python 爬取虎扑帖子标题并生成词云图的简单示例。首先,你需要安装以下库: - requests:用于发送 HTTP 请求和获取响应内容 - BeautifulSoup4:用于解析 HTML 页面 - jieba:用于中文分词 - wordcloud:用于生成词云图 安装完毕后,你可以按照以下步骤进行操作: 1. 导入所需库 ``` import requests from bs4 import BeautifulSoup import jieba from wordcloud import WordCloud ``` 2. 发送 HTTP 请求并获取响应内容 ``` url = 'https://bbs.hupu.com/40084625.html' response = requests.get(url) html = response.content.decode('utf-8') ``` 这里以虎扑 NBA 板块的一个帖子为例,使用 requests 库发送 GET 请求并获取响应内容,将响应内容使用 utf-8 编码转换为字符串。 3. 解析 HTML 页面并获取帖子标题 ``` soup = BeautifulSoup(html, 'html.parser') title = soup.title.string ``` 使用 BeautifulSoup4 库解析 HTML 页面,并获取页面中的标题。 4. 对标题进行中文分词 ``` words = ' '.join(jieba.cut(title)) ``` 使用 jieba 库对标题进行中文分词,结果以空格连接。 5. 生成词云图 ``` wordcloud = WordCloud(font_path='SimHei.ttf').generate(words) wordcloud.to_file('wordcloud.png') ``` 使用 wordcloud 库生成词云图,指定字体为微软雅黑,并保存为 PNG 格式的图片。 完整代码如下: ``` import requests from bs4 import BeautifulSoup import jieba from wordcloud import WordCloud url = 'https://bbs.hupu.com/40084625.html' response = requests.get(url) html = response.content.decode('utf-8') soup = BeautifulSoup(html, 'html.parser') title = soup.title.string words = ' '.join(jieba.cut(title)) wordcloud = WordCloud(font_path='SimHei.ttf').generate(words) wordcloud.to_file('wordcloud.png') ``` 希望这个简单的示例能够帮助你理解如何使用 Python 爬取虎扑帖子标题并生成词云图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值