反爬与反反爬策略
学习目录:
一、常见反爬策略
二、反反爬策略
学习内容:
" 爬虫与反爬虫永远是相生相克的:当爬虫知道了反爬策略就可以制定反-反爬+策略,同样地,网站知道了爬虫的反-反爬策略就可以制定反-反-反爬策略。
正可谓是道高一尺魔高一丈,两者之间的斗争是永远不会结束的。"
反爬虫,是指对扫描器中的网络爬虫环节进行反制,通过一些反制策略来阻碍或干扰爬虫的正常爬行,从而间接地起到防御目的。
比如当我们在某一网站浏览过快时,这种快速浏览的行为很接近爬虫,系统往往就会要求输入验证码。
在爬虫诞生之初,一些搜索引擎从业者和网站站长经过商讨定下了一项“君子协议”——robots.txt,即网站有权规定网站中哪些部分是否可以被爬虫抓取,这样既可以保护隐私和敏感信息,又可以使网站被搜索引擎收录、增加流量。
然而总会有人在利益诱惑下铤而走险,违反爬虫的君子协议,这时就需要改用技术手段来阻拦爬虫的入侵。
即便如此,我们也没有方法可以禁止爬虫在网站中的出入,如果网站可以供人访问,就也一定可以能被爬虫访问,如果选择从底层完全阻止爬虫抓取,会有很大可能让网站无法被搜索引擎收录,因此只能通过加大爬虫的访问难度来进行阻止。
根据先前对爬虫工作机制和原理的学习,我们知道爬虫程序的访问速率和目的与正常用户是不同的,甚至可以说是有很大的区别:大部分爬虫会毫无节制地对目标应用进行爬取,这种由爬虫发出的网络请求被称为“垃圾流量”,甚至有说法称互联网上50%的流量都来自爬虫。
因此开发者为了保证服务器的正常运转或降低服务器的压力与运营成本,不得不使出各种各样的技术手段来限制爬虫获取数据和对服务器资源的访问。
因为爬虫和反爬虫都是对综合技术的应用,与爬虫工程师所用的工具和开发语言有关,甚至与爬虫工程师的个人能力也有一定关联,所以反爬虫涉及到的技术范围其实也很广。
限制爬虫程序访问服务器资源和获取数据的行为可以统称为反爬虫。限制手段包括但不限于请求限制、拒绝响应、客户端身份验证、文本混淆和使用动态渲染技术等。
这些限制根据出发点又可以分为主动型反爬虫和被动型反爬虫。
开发者有意识地使用技术手段区分正常用户和爬虫,并限制爬虫对网站的访问行为,如验证请求头信息、限制访问频率、使用验证码等。
为了提升用户体验或节省资源,用一些技术间接提高爬虫访问难度的行为,比如数据分段加载、点击切换标签页、鼠标悬停预览数据等.
除此之外,对于反爬虫,还可以从特点上进行更细致的划分,如信息校验型反爬虫、动态渲染型反爬虫、文本混淆型反爬虫、特征识别型反爬虫等。
爬虫的反制策略有很多,总体可归为基于IP的反爬虫和基于爬行的反爬虫两大类。
对于基于IP的反爬虫,主要思路就是通过人为或部分策略来识别出爬虫的IP并进行屏蔽、阻止、封禁等操作。
对基于爬行的反爬虫,其思路主要是在爬虫的爬行中设置爬行障碍,让其陷入死循环;或者用一些无意义的URL来填充其爬行队列,从而阻止其对正常URL进行后续的漏洞审计。
网站运维人员在对日志进行分析时有时会发现同一时间段内某一个或某几个IP访问量特别大,**由于爬虫是通过程序来自动化爬取页面信息的,因此其单位时间的请求量较大,且相邻请求时间间隔较为固定,**这时就基本可以判断此类行为系爬虫所为,此时即可在服务器上对异常IP进行封锁。
User-Agent是请求头域之一,服务器从User-Agent对应的值中识别客户端的使用信息。
User-Agent的角色就是客户端的身份标识。很多的爬虫请求头就是默认的一些很明显的爬虫头python-requests/2.18.4,诸如此类,当发现携带有这类headers的数据包,直接拒绝访问,返回403错误。
除了User-Agent之外,可利用的头域还有Host和Referer。这种验证请求头信息中特定头域的方式既可以有效地屏蔽长期无人维护的爬虫程序,也可以将一些爬虫初学者发出的网络请求拒之门外。
Cookie反爬虫指的是服务器通过校验请求头中的Cookie值来区分正常用户和爬虫程序的手段,服务器对每一个访问网页的人都会给其一个Cookie,有的扫描爬虫单纯为了爬取链接,并不会对Cookie进行处理和响应。
当某个Cookie访问超过某一个阀值时,就对其进行封禁,过一段时间再放出来。
也可以把Cookie和JavaScript结合起来实现反爬虫从而提高爬虫难度,这种手段被广泛应用在Web应用中。
由 JavaScript 改变 HTML DOM 导致页面内容发生变化的现象称为动态渲染。
由于编程语言没有像浏览器一样内置JavaScript解释器和渲染引擎,所以动态渲染是天然的反爬虫手段。
网页开发者将重要信息放在网页中但不写入html标签中,而浏览器会自动渲染
当某一用户访问次数过多后,就自动让请求跳转到一个验证码页面,只有在输入正确的验证码之后才能继续访问网站。
访问网页的时候服务器将网页框架返回给客户端,在与客户端交互的过程中通过异步ajax技术传输数据包到客户端,呈现在网页上,爬虫直接抓取的话信息为空。
图片伪装指的是将带有文字的图片与正常文字混合在一起,以达到“鱼目混珠”的效果。
这种混淆方式并不会影响用户阅读,但是可以让爬虫程序无法获得“所见”的文字内容。
这种方法是利用 CSS 样式将乱序的文字排版为人类正常阅读顺序的行为。
如果不细心观察,爬虫工程师很容易被爬取结果糊弄。这种混淆方法和图片伪装一样,并不会影响用户阅读。
例如:
HTML 文本中的文字:我的学号是 1308205,我在北京大学读书。
浏览器显示的文字:我的学号是 1380205,我在北京大学读书。
爬虫提取到的学号是 1308205,但用户在浏览器中看到的却是 1380205。
SVG 是用于描述二维矢量图形的一种图形格式。它基于 XML 描述图形,对图形进行放大或缩小操作都不会影响图形质量。
由于 SVG 中的图形代表的也是一个个文字,所以在使用时必须在后端或前端将真实的文字与对应的 SVG 图形进行映射和替换。
通过用矢量图形代替具体文字,不会影响用户正常阅读,但爬虫程序却无法像读取文字那样获得 SVG 图形中的内容。
除此之外还有Referer字段反爬、延时操作、网页iframe框架嵌套、csrf防护、限制每日下载量、DDOS防护、字体反爬虫等方式,感兴趣的小伙伴们可以自行查阅相关资料了解。
虽然爬虫措施有很多,但爬虫高手依旧可以绕过反爬虫机制,每一种方法都不是绝对安全的。因此对于有版权的内容和隐私数据,决不能为了“展现技术”而去肆意爬取。
- 策略1:设置下载延迟,比如数字设置为5秒,越大越安全
- 策略2:禁止Cookie,某些网站会通过Cookie识别用户身份,禁用后使得服务器无法识别爬虫轨迹
- 策略3:使用user agent池。也就是每次发送的时候随机从池中选择不一样的浏览器头信息,防止暴露爬虫身份
- 策略4:使用IP池,这个需要大量的IP资源,可以通过抓取网上免费公开的IP建成自有的IP代理池。
- 策略5:分布式爬取,这个是针对大型爬虫系统的,实现一个分布式的爬虫,主要为以下几个步骤: 1、基本的http抓取工具,如scrapy; 2、避免重复抓取网页,如Bloom Filter; 3、维护一个所有集群机器能够有效分享的分布式队列; 4、将分布式队列和Scrapy的结合; 5、后续处理,网页析取(如python-goose),存储(如Mongodb)。
- 策略6:模拟登录—浏览器登录的爬取 设置一个cookie处理对象,它负责将cookie添加到http请求中,并能从http响应中得到cookie,向网站登录页面发送一个请求Request, 包括登录url,POST请求的数据,Http header利用urllib2.urlopen发送请求,接收WEB服务器的Response。