DannyWu Python网络爬虫教程之攻破字体反爬(超详细)

摘要

随着python的推广,学习python爬虫这个分支的人越来越多。站长为了保护自己的数据,就设计出各种各样的反爬策略,比较常见的有通过header验证来反爬,限制频繁请求的ip来反爬等,今天Danny就带大家处理字体反爬。

一、准备工作

1. 涉及到的python库有:pip install requests lxml fonttools bs4

2.查看字体软件font creator 点我下载

3.开发环境我用的是pycharm,也推荐小伙伴们使用pycharm

二、攻破字体反爬

首先我们打开chrome浏览器进入目标网站猫眼电影的首页,再点击鼠标右键选择审查元素或者直接按F12键进入浏览器开发者模式。如下图,从图中我们看出,实时票房的数字是被加密的。

DannyWu Python网络爬虫教程之攻破字体反爬(超详细)
猫眼首页的实时票房数字被加密

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

DannyWu Python网络爬虫教程之攻破字体反爬(超详细)
Danny猜测是一种特殊编码将字体加密

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

DannyWu Python网络爬虫教程之攻破字体反爬(超详细)
找到字体文件链接,并打开保存字体

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

DannyWu Python网络爬虫教程之攻破字体反爬(超详细)
用font creator打开保存的字体

但是好像我还是翻译不了类似这样的 . 字符代表什么数字 ,下面我们就用fonttools将字体文件解析为xml文件,我们再看看有什么机密,代码为:

from fontTools.ttLib import TTFont
    TTFont('font.woff').saveXML('font.xml')

这时候我们打开font.xml文件,和刚刚用font creator打开的字体对比一下,好像有些联系。是的,除了前两个好像没用之外,每一个GlyphID标签对应着一个数字,name属性值即是数字的编码。

DannyWu Python网络爬虫教程之攻破字体反爬(超详细)
对比之后,是不是发现了什么

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

DannyWu Python网络爬虫教程之攻破字体反爬(超详细)
是不是发现了什么呢,/:偷笑.jpg

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

DannyWu Python网络爬虫教程之攻破字体反爬(超详细)

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

DannyWu Python网络爬虫教程之攻破字体反爬(超详细)
数字对应的坐标字符串

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

DannyWu Python网络爬虫教程之攻破字体反爬(超详细)
扫码关注公众号 DannyWu 博客回复“字体反爬”获取代码
weinxin
我的微信
有问题微信找我
DannyWu

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: