一、准备工作
1. 涉及到的python库有:pip install requests lxml fonttools bs4
2.查看字体软件font creator 点我下载
3.开发环境我用的是pycharm,也推荐小伙伴们使用pycharm
二、攻破字体反爬
首先我们打开chrome浏览器进入目标网站猫眼电影的首页,再点击鼠标右键选择审查元素或者直接按F12键进入浏览器开发者模式。如下图,从图中我们看出,实时票房的数字是被加密的。

这时候我们看一下页面的html代码,鼠标右键查看网页源代码,找到实时票房的数字的位置,我们看到这好像是一种特殊编码,将字体加密了。

既然是字体重新编码了,那我们就把字体文件下载下来,分析一下字体文件,我们可以在网页源代码头部的style标签下面找到字体文件链接,第一次分析我们就直接复制链接然后在浏览器打开它,将字体文件保存,至于为啥不写程序下载,我下面给大家讲:

其实,我是要将刚才保存的字体,通过接下来的分析制作一个字体坐标和数字对应的模板。我们用先前安装的font creator打开保存的字体文件,就可以看到真实的数字。

但是好像我还是翻译不了类似这样的 ;;;;.;; 字符代表什么数字 ,下面我们就用fonttools将字体文件解析为xml文件,我们再看看有什么机密,代码为:
from fontTools.ttLib import TTFont TTFont('font.woff').saveXML('font.xml')
这时候我们打开font.xml文件,和刚刚用font creator打开的字体对比一下,好像有些联系。是的,除了前两个好像没用之外,每一个GlyphID标签对应着一个数字,name属性值即是数字的编码。

为了让大家看得更直白些,我真的很努力了,所以记得支持我一下,哈哈,快(看)上(下)车(图):

但是这就OK了?no no no,因为你再刷新一下页面,再保存一下字体,照上面在操作一遍,你会发现这些字体的编码又变了,是不是觉得有点Hentai(变态)。别急,Danny接着带你分析,思考:是不是有什么参数能唯一的代表一个数字呢?答案是有的,继续看font.xml文件,找到TTGlyph标签,标签有五个属性,name属性不用我说了吧,就是对应着 GlyphID 里面的name,但是顺序并不一样的。另外四个属性分别为字体坐标的范围,通过这四个属性能唯一判断一个字体是什么。

那么我们就通过字体的坐标来构造一个坐标字符串(我是将xMin yMin xMax yMax合并为了一个字符串例如3对应的就是0-13511719)与数字对应的模板文件,我这里把它们保存为了csv文件,如下图,其实第二列没用,只看第一列和第三列的对应关系即可:

然后当你去爬取猫眼电影其他页面的数据时,将当前网页加密字体的编码和当前字体的xml文件里的字体坐标匹配,再将字体坐标与模板里的字体坐标匹配,来判断是哪一个数字,就大功告成了。我将项目代码放在github上,通过扫描下方二维码关注公众号回复“字体反爬”获取代码。Danny从构造到编写这篇文章也不容易,还请大家多多支持,不懂的地方欢迎来找我讨论。


31/10/2020 00:16 沙发
看不了代码
02/11/2020 17:14 1层
@小万 关注公众号获取