最近练习爬虫的时候, 被朋友推荐一个网站, 说是反爬很有意思, 也就尝试了一下。经过分析, 发现它的反爬策略还是蛮不错的, 不光进行了字体反爬, 在使用相同ip进行大量访问时也封禁你的ip。
ip被封的问题可以通过代理ip的方式解决, 找一些免费ip或者花点小钱就可以了, 这次我要讲的重点是它使用css进行的字体加密
解密字体加密原理
找到要爬取的网页
随便打开一家店铺,
打开后我们可以发现这个页面的评论只有有限的几条, 这肯定不是我们想要的, 点击更多点评
发现有分页信息, 这个就是我们要爬取的网页了(ps: 今日头条的每个页面的反爬是不相同的, 登陆和未登录也有一定的区别, 爬取时应当注意)
分析反爬策略
这条评论的一些字被<svgmtsi>标签替换了, 如上图中的评论中的老字就被<svgmtsi class="review"></svgmtsi>替换了
找到<svgmtsi>标签中继承的类在哪里
对于<svgmtsi class="review"></svgmtsi>标签中的class=""这种格式我们肯定不会陌生, 这种格式一般情况都是css继承类的语法, 存放在.css文件中或style标签内, 这里我们直接使用Google浏览器的搜索功能
搜索结果可能有很多, 但是我们只考虑css文件就可以了, 也就是第一个.css文件, 打开后
这密密麻麻写在一行里这谁能分析的出来, 我们点击文件左下角的{}来进行格式化
在这个看似用一种格式的类塞满的文件中, 并非全部都是这种类加坐标的格式, 其中偷偷塞着三个.svg文件, 而秘密就藏在这里!
要不是无意间发现, 不知道还要浪费多少时间来找到这个css文件中类的对应文件, 随便打开一个.svg文件
找到css文件所映射字体文件
发现css文件中类所对应的字就藏在这里, 但是这种格式我们可没有办法分析, 右键打开源代码,
答案逐渐明朗了起来!
得到方案
首先将三个关键文件进行下载, 将数据提取出来, 可以看到css文件里有每个类的x, y坐标, 我们只要根据坐标去找到所对应的文字, 问题就迎刃而解了
从字体文件中可以很简单的提取出y坐标, 那x坐标呢,
这里我们看到font-size: 14px, 这句话的意思为设置字体大小为14个像素点, 于是我们就得到了字体大小, 如看将第一个字的x坐标看作为0, 那么第二个字的x的坐标就是14 , 以此类推, 我们就获得到了所有字体坐标, 这样经过对照后就可以得到一个映射关系表, 根据这个表来替换从网页获取到的数据, 我们就得到了一个完整的评论.
细节:
- 当然是不可以直接拿上面文件中写的
x,y值来判断
这里可以发现, 字体文件是进行了一定的偏移的, 计算x,y值时要考虑这个因素. - 虽然这些对照文件是动态的, 但是短期内访问是不会发生变化的, 而且文件名也是不会发生变化的, 我们可以把当前的映射关系进行保存, 如果访问发现是之前的
css文件, 这时候就可以直接使用之前的映射来进行解析. - 对于进行
x,y值进行对照, 我们几乎无法得到完美的100%正确的坐标, 得到的数据一定是有一定的偏差的, 这时候可以通过定义一个偏差值来扩大匹配范围, 从而得到映射关系
这样看, 是不是思路都通了, ❀❀❀怎么样, 很简单吧❀❀❀
代码实现放在下篇来讲解, 点击下面的连接????????????