演示环境
操作系统:windows10
python版本:python 3.7
代码编辑器:pycharm 2018.2
使用模块:requests,json,re,fontTools
什么是字体反爬?
首选我们先来看一下点评网的评论信息。
从这里可以看到,网页上显示的文字和源码中显示的文字有些出入,并不是一一对应,那继续查看sources中的代码。
可以看到,评论中的某些文字点评网做了特殊处理,这就是所谓的字体反爬。
抓取数据
前面的步骤,我们已经知道点评网对评论内容做了处理,至于是如何处理,这里我们先不管,还是先把数据拿到再说。要是数据都没有拿到,还怎么对数据进行处理呢?
首先使用谷歌的network,对所有请求进行抓包。然后随便搜索一个评论中的某些东西,找到返回的评论数据请求。这里我使用评论人的名字进行搜索,找到其中的请求。有没有觉得这个请求就是返回的评论数据呢。那来验证下。因为这里返回的是一个json数据,可以借助在线json数据查看工具,方便我们对内容进行查看。
将数据复制下来,然后在浏览器中输入网址json.cn
接着就能看到解析出来的json数据。
经过分析,我们知道所有的评论数据都在
['reviewAllDOList']
,这个集合里装了当前页面前10人的评论数据。这样就可以通过列表遍历的方式拿到相应的数据。
点击这个url的headers,找到请求的url,准备获取数据。
注意:
这个获取到的url只能使用一会儿,过一会就会变化。如果一直使用这个url请求,后面就会得不到数据。所以后续当请求不到数据的时候,就需要刷新网页,获取一个新的url。因为url中有个_token参数是每次变化的。
然后下面框中的内容也必须在请求头中添加上去,否则也还是得不到数据。
这里的重点是在字体反爬,所以其他的一些反爬在这里就不进行赘述了。
至此就找到请求的评论接口数据,直接请求这个url,就能得到我们想要的数据。
运行代码,查看数据,得到的数据果然就是经过处理的。
破解字体反爬
上面虽然拿到了数据,但是这些都是经过处理之后的数据,拿着完全不能用,所以还是得想办法将他给破解下。
首先我们分析网页得知,这些处理之后的数据class都为review,然后他的字体都是'PingFangSC-Regular-review'
猜想这就是点评网自己定义的字体。居然自定义了字体,那么网页中肯定需要加载字体文件,所以果断打开network对字体文件进行抓包。
搜索关键字'PingFangSC-Regular-review',就能找到相应的信息。
我们可以看到,点评网有许多个自定义的字体,这里只需要找自己想要的字体文件即可,即找字体文件的url。只是这些字体文件一般都是.woff或者.ttf结尾的,我们可以将下面的滚动条往右边拖动,就能找到一个.woff的url了。
发现这个url前面是以 // 开始的,那尝试直接在网址前面加https就行了,那么完整的url就是
https://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/c667da25.woff
然后在浏览器中输入这个网址,就可以下载一个后缀是.woff的字体文件。
为了方便查看字体文件的内容,我们还需要下载fontCreator这个软件。使用这个软件打开我们刚才下载的文件,就能够看到相应的值。fontCreator官网地址为
https://www.high-logic.com/font-editor/fontcreator
使用fontCreator打开这个woff文件,如下图所示。
我们得把这里面所有的文字按顺序都写出来,并用一个列表保存,空的数据使用''表示。
是的,你没有看错,将这些文字全部写下。
这些就是字体的形状,我们已经认识了这些字,但我们还得让程序也认识这些字,当然你也可以使用机器学习来识别这些文字,注意:一定要按顺序来,不能遗漏,不然的话对应关系会出错,替换出来的结果也就会出错。
我们把文字敲出来之后,然后需要得到字体形状对应的名字,对应代码字符串。这里需要使用
fontTools
这个第三方库来处理字体文件。
这里我还是很贴心的给大家画了一个图来解释其中的对应关系。
这样就得到了字体的对应关系,但是code是一个整数,而网页上显示的是
类似这样的数据,这需要几步转化下:
1、将code变成16进制
2、将最前面的0替换为&#
3、在最后面添加一个;
所以我们也把code按照这个规则进行转换,然后使用re模块。只要找到这样的一个code,就直接替换为文字。这样就能够拿到准确的数据了。
呼。。。我们终于破解了点评网的字体加密。
最后还有一点需要注意,因为这个程序我当天写好之后,能成功的替换相应的字符串,但是当我第二天运行程序的时候,缺不能替换了。
经过分析发现,原来是点评网每天(或许不是每天,每几个小时)应该都会变换字体文件,然后
code->name,name->形状
也就对应不上了,但是
形状->值
一定是对应上的,这个不会变化。
那么我们每次运行之前,就直接找到字体文件对应的url,然后先将这个文件下载保存到本地,再运行我们的爬虫即可。
注意:这个字体文件的url是会变化的,也就是点评网的服务器上每个字体应该存放了好几个不同的字体文件。所以我们每次运行都需要先去找到对应的字体文件的url。
这里说一下 urlretrieve 函数的用法吧。
urlretrieve:将网络上的文件下载下来,保存到本地。第一个参数为url,第二个参数为保存到本地文件的文件名。
使用这个函数我们可以很方便的下载网络上一些文件,图片等。
最后我们来看一波运行结果吧。
领取专属 10元无门槛券
私享最新 技术干货