最近一直在用django写一个个人音乐在线播放平台。
其中在网页数据保护方面,我采取了很多种的反爬虫措施,所以在本篇文章中,我从源码和实际操作上给大家分析下我所使用的反爬虫及其对应的破解技巧。
首先我们声明的是,爬虫和反爬虫没有高低之分,虽然总有一种方法能突破你的安全保护。
爬虫就像是一个钉子,反爬则是一扇铁窗。钉子坚持不懈,总能搞破窗。但是窗户是不能只针对于一点全力打造的。从此,修修补补,一般双方不下班不休。
下面我把反爬和反反爬分开来写。这样爱好不同的人可以各取所需。
1、我在django-views中设置了登录身份验证,设置了装饰器,通过META.get获取请求头,限制请求头和访问间隔。
!记得上面是一个装饰器。
mete.get可以获取请求头部的信息。如果没有请求头User-Agent的话,就只能请求到我的csdn博客链接。在最下面记录了上一次到这一次访问的ip时间,如果频率小于2秒就会跳转到错误页面。
2、设置了cookie和登录成功后的session,并通过url编码方式隐藏cookie
cookie和session是网站的必须品,但是有的爬虫会通过cookie直接省去登录来访问你的主页从而提取数据。
因为url编码方式不支持中文,所以我们可以设置为中文及外文的cookie。
大致如下:
3、设置了自动刷新login页面,30秒计时。
为了防止selenuim和无界面浏览器的侵袭,只能尽量的牺牲一点用户体验,我们把浏览器刷新时间控制在30秒左右,运行缓慢的无界面浏览器就会很难受了。
这里我用JS来实现的。
4、上面设置了30秒的时间是不够的,所以我在登录界面设置了验证码,这样也能隔绝一大部分的爬虫初学者。
这个写起来特别简单,只需要在原click方法上给url+上一个?就可以重复请求。(如果两次请求url相同是不能刷新图片的)
下面是验证码生成的代码:
(本篇代码为了方便讲解,我都写在视图中,有不懂请留言)
5、因为只是这样我感觉力度还是不够,有耐心的selenuim还是可以很快破解的。所以我从属性上来限制一下PhantomJS和selenuim。
这个限制是用js来写的。
…我刚突然发现我把这页的JS混淆压缩加密了,不过可以拿去直接用。
首先上文中的方框是selenuim不能是别的字符集,会影响他的读取操作,有限制作用,如果添加的够多的话,可能会把他搞崩溃。
第一个if的作用是,如果访问的驱动是webdriver的话,就把页面跳转到别的地方。后面的两个作用是:通过判断访问来源的长度和语言来判断是不是无界面浏览器。最后面那个是通过对图片的识别方式来判断是不是无界面浏览器。
因为无界面浏览器在访问图片的时候,他的访问得到的图片宽高都是0;并且无界面浏览器的语言默认为空,长度默认为0.
9、比较难受人的一种css方法,通过字符集映射来改变页面信息和源码信息的不同。
利用前端字体文件(.ttf)混淆文本来阻止爬虫爬取网站数据.这个我不详细介绍了,举几个列子,大家可以网上搜索下具体操作。
- 1 FONT-FACE拼凑式
- 2 BACKGROUND拼凑式
- 3 字符穿插式
- 4 伪元素隐藏式
- 5 元素定位覆盖式
- 6 IFRAME异步加载式
- 7 字符分割式
- 8 字符集替换式
还有点什么反爬方式,我忘记了。。先不写了。
下面我们来逐条破解上面的反爬措施。