爬虫之反爬虫策略总结

前介 爬虫的意义和危害
【爬虫之反爬虫策略总结】爬虫的意义在于通过技术手段大批量的获取网站信息的一种方式,这种大批量的信息采集往往会对目标网站的服务器主机造成超出其负载的请求,从而造成网站不能针对目标用户进行服务,降低了网站用户对于网站服务的满意度。
反爬的意义
反爬虫就是为了防止爬虫在大批量的采集网站信息的过程对服务器造成超负载,将爬虫行为和用户行为进行分离,从而杜绝爬虫行为妨碍到用户的体验,从而提高用户使用网站服务的满意度。
常见反爬 通过请求头的信息过滤爬虫(Headers)
这类反爬虫策略是检查请求头内部的Headers,爬虫默认的Headers和浏览器的Headers有很大差异。有时网站也会对Referer进行检查,在浏览器内部这些都会自动添加到请求头中。爬虫解决这些反爬的策略就是将Headers修改为浏览器的User-Agent,如果有检查防盗链的话就将Referer的值修改为目标网站域名
基于用户行为的反爬
正常的用户在浏览和点击网页时会有一定的时间间隔,如果同一个IP在短时间内对同一个页面进行多次访问或者进行多次操作,那么这就超出正常用户行为了,网站会阻断该IP的请求。这种问题使用代理IP就可以解决,如果需要在短时间内访问同一个网页的话,使用代理IP在服务器端会显示多个IP访问同一页面,这样就不会被封禁IP了。
或者模仿用户行为,将多次请求中间的时间间隔变大,模仿真正的用户访问网页的行为。
动态页面的反爬虫
有的时候请求的网页中并没有数据,所有没有办法直接从请求的网页中抽取数据,因为数据是使用JavaScript动态渲染上去的,这里的JS渲染使用的是Ajax(网页局部刷新技术),在Ajax中会对数据的API发起请求,然后将返回的真实数据通过DOM技术加载到网页里,这种技术的缺点是在网速较慢的时候,数据的渲染会有比较明显的延迟。解决这类反爬也很简单,只需要找到Ajax发起请求的API的地址,对这个地址再次发起请求,就可以得到想要的数据了。
一般的Ajax的API都是符合Restful规范返回的都是Json数据,这样我们处理的时候就会十分愉悦,但是有的神经病API返回的是JS文件,在文件内部通过判断之后进行网页的数据渲染,这一类数据的提取没有别的简单的方式,只需要手工去除不是Json数据的地方就可以了。
最头痛的是如果Ajax传输的参数是加密参数的话,很难通过模拟请求获取API的数据,只能通过PhantomJS模拟用户点击执行js脚本。
登陆时的验证码问题
一般的图片验证码,可以使用OCR和PIL库进行处理,但是OCR在处理图片验证码时的问题在于,他可以很好的识别英文和数字验证码,对于中文的验证码的识别率十分的低,而且在识别数字的1,和英文的i和I(大写i)以及l(小写L)或者数字0和英文的o和O时有着很明显的缺陷,相连的r和i会被识别为n,f有时会被认作p,不过这些相似的数字和英文对于正常的人来说也有比较低的识别率,一般正常的网站都会刻意避开这些十分相似的数字和英文,所有OCR在处理图片验证码时还时十分有用的。
对于要以顺序点击的验证码来说有两种处理方案,一是手工登陆,劫持Cookie到爬虫中,让爬虫避开登陆时的验证码,另一种方案是,使用CNN(卷积神经网络)或者DNN(深度神经网络)识别出点击顺序,然后计算出点击坐标之后使用PhantomJS模拟点击,(这种方法耗费时间太久,成本太高)。

    推荐阅读