Python反爬虫设计
2020-07-29胡立
胡立
随着大数据时代的来临,无论是个人还是企业,对于数据的需求都越来越大。这种需求催生了如今异常热门的数据产业,也催生了日益完善的网络数据采集技术。这种需求扩大的同时也让网络爬虫日益猖獗,甚至影响到了网站和APP的正常运行,高频的网络爬虫行为无异于分布式拒绝服务(DDoS)攻击。
为什么要反爬虫
在设计反爬虫系统之前,我们先来看看爬虫会给网站带来什么问题?
本质上来说,互联网上可以供人们浏览、查看和使用的网站及其网站上的数据,都是公开和允许获取的,所以并不存在所谓的非法授权访问问题。
爬虫程序访问网页和人访问网页没有本质区别,都是由客户端向网站服务器发起HTTP请求,网站服务器接收到请求之后将内容响应返回给客户端。只要是发起请求,网站服务器必然要进行响应,那必然要消耗服务器的资源。
网站的访问者与网站之间是互惠互利的关系,网站为访问者提供了自己所需要的必要信息和服务,而访问者也为网站带来了流量、访客和活跃度。所以网站的所有者愿意消耗服务器的带宽、磁盘和内存,为访问者提供服务。
而爬虫程序呢?无异于“吃白食”,成倍地消耗网站服务器资源、占用服务器带宽,却不会为网站带来一丝的利益,甚至还会有损于网站本身。
识别爬虫
既然讨厌爬虫,就要将爬虫拒之于网站之外,但是要拒绝爬虫的访问,首先当然要识别出网络访问者中的爬虫程序,那么如何识别呢?
1. HTTP请求头
这算是最基础的网络爬虫识别,正常的网络访问者都是通过浏览器对网站进行访问的。而浏览器都会带上自己的请求头以表明自己的基础信息。而这也是最容易被爬虫程序突破的识别手段,因为HTTP请求头谁都可以进行修改和伪造。
2. Cookie值
Cookie通常用来标识网站访问者的身份,就像一张临时凭证,凭借这个凭证与网站服务器进行身份校对,由于Cookie是保存在客户端的数据,因此也可以被修改和伪造。
3.访问频率
如果一个访问者,每隔1 s请求访问一次网站的某个页面,或者一秒钟请求了几百次这个页面。这个访问者就很可能是爬虫程序,试问有谁能如此快速频繁地点击鼠标访问一个页面?
通过访问频率识别爬虫程序是可行的,但是爬虫程序也能通过使用大量的代理IP来实现一个IP地址只访问一次的效果,还可以通过随机的请求时间间隔规避识别。
4.鼠标行为轨迹
正常人类访问者浏览网页势必不会像机器一样,机械地移动和点击鼠标。而鼠标的移动和点击,是可以通过JS脚本捕获的,所以可以通过判断访问者的鼠标行为轨迹来判断访问者是否为爬虫程序。
5. token值
现在很多网站都是前后端分离开发的,数据通过后端接口返回给前端,前端拿到数据再结合页面进行渲染,所以很多爬虫程序都直接找数据接口,而不是请求页面。token用在验证这些后端数据接口上,一般通过网页上的某个密钥加上时间和某些数据组合加密而成。
但遗憾的是,上述任何一种识别爬虫的手段,都有可能被爬虫绕过和突破。
拒绝爬虫
就像没有一劳永逸的网站安全防护一样,10年前把3389端口一关,就能防止服务器成为肉鸡,如今各种防火墙、安全措施都加上了,还有可能因为某个0Day漏洞被勒索。
爬虫与反爬虫之间,也永远都在斗争和升级,所不同的是,网络攻防是放开手脚的无限制级格斗,而反爬虫则是带着拳套和头盔的拳击比赛。
网站为了运营,势必要对外开放内容,而开放的内容就像是飘忽在非洲大草原的腐肉,吸引着鬣狗的到来,在开放内容和避免沦为爬虫的数据矿池之间平衡,是一个难事。
1.内容上限制内容的開放
开放的内容是获取用户、流量的基础。但是内容的开放并不是无限制的,非注册用户可以看到一篇内容、两篇内容,但是不能无限制地看到内容。这个限制,可以是要求登录、扫码验证或者接入谷歌验证码之类的点击验证机制。
现在越来越多的网站采用了有限内容开放的机制,比如微博、知乎和淘宝等,游客可以看到1~2页的内容,但是如果还想继续,请先登录。
2.行为上记录用户操作
需要访问者进行登录并不能解决问题,因为模拟登录一直是网络爬虫程序的一个热门发展分支,无论是图片验证码、拼图、滑块还是点选汉字,都会被突破。甚至于短信验证码都可以通过编写APP与爬虫程序和网站之间进行通信。
所以记录用户行为必不可少,用户的一切操作和访问行为都需要记录在案,这是分析和处理爬虫的基础。
3.控制上严厉打击高频行为
从实际来看,也有很多爬虫程序的运行并非是为了往死里薅网站的数据和内容,其仅是为了方便进行手工收集和整理工作,这种类型的爬虫行为一般会比人工浏览的频次要高,但是又明显低于鬣狗般的高频爬虫,对这种类型的爬虫行为可以忽略。
但是对于影响网站服务器运行的高频爬虫行为,必须采取措施,结合用户和IP信息,对相关用户或IP进行处理。
4.协议里申明权利
网站的所有者必须在网站协议或用户协议中申明,允许正常的浏览、访问和数据获取,对于异常、高频和威胁网站服务器稳定的行为,将保留进一步处理的权利。
没有一个城池是固若金汤的,也没有一个措施可以阻挡所有疯狂的爬虫。面对爬虫的行为,利用各种技术建立一个行之有效的识别、分级和处理机制,才能同时兼顾网站的开放和稳定。