常见反爬⾍策略及应对措施
⼀般⽹站从三个⽅⾯反爬⾍:请求⽹站访问时的请求头Headers,⽤户⾏为,⽬标⽹站的⽬录和数据加载⽅式。前两个⽅⾯反爬⾍策略中最为常见的,⽽第三个则是应⽤ajax(异步加载)的⽅式加载页⾯⽬录或者内容,增⼤爬⾍在对⽬标⽹站形成访问之后获取数据的难度。
但是仅仅检验⼀下请求头或者做⼏个ip限制显然⽆法达到⽹站运营者对anti-spam的要求,所以更进⼀步的反制措施也不少。最主要的⼤概有:Cookie限制,验证码反爬⾍,以及Noscript。
1.1 通过Headers反爬⾍
从⽤户请求的Headers反爬⾍是最常见的反爬⾍策略。由于正常⽤户访问⽹站时是通过浏览器访问的,所以⽬标⽹站通常会在收到请求时校验Headers中的User-Agent字段,如果不是携带正常的User-Agent信息的请求便⽆法通过请求。还有⼀部分⽹站为了防盗链,还会校验请求Headers中的Referer字段。 如果遇到了这类反爬⾍机制,可以直接在⾃⼰写的爬⾍中添加Headers,将浏览器的User-Agent复制到爬⾍的Headers中;另外通过对请求的抓包分析,将Referer值修改为⽬标⽹站域名,就能很好的绕过。
1.2 基于⽤户⾏为反爬⾍
还有⼀些⽹站会通过⽤户的⾏为来检测⽹站的访问者是否是爬⾍,对访问频率进⾏限制,例如同⼀IP短时
间内多次访问同⼀页⾯,或者同⼀账户短时间内多次进⾏相同操作。 ⼤多数⽹站都是前⼀种情况,对于这种情况有两种策略:
1)使⽤代理ip。例如可以专门写⼀个在⽹上抓取可⽤代理ip的脚本,然后将抓取到的代理ip维护到代理池中供爬⾍使⽤,当然,实际上抓取的ip不论是免费的还是付费的,通常的使⽤效果都极为⼀般,如果需要抓取⾼价值数据的话也可以考虑购买宽带adsl拨号的VPS,如果ip 被⽬标⽹站被封掉,重新拨号即可。
2)降低请求频率。例如每个⼀个时间段请求⼀次或者请求若⼲次之后sleep⼀段时间。由于⽹站获取到的ip是⼀个区域⽹的ip,该ip被区域内的所有⼈共享,因此这个间隔时间并不需要特别长
对于第⼆种情况,可以在每次请求后随机间隔⼏秒再进⾏下⼀次请求。对于有逻辑漏洞的⽹站,可以通过请求⼏次,退出登录,重新登录,继续请求来绕过同⼀账号短时间内不能多次进⾏相同请求的限制,如果能有多个账户,切换使⽤,效果更佳。
1.3 动态页⾯的反爬⾍
上述的⼏种情况⼤多都是出现在静态页⾯,但是对于动态⽹页,我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript⽣成的。⾸先⽤Firebug或者HttpFox对⽹络请求进⾏分析。如果能够到ajax请
求,也能分析出具体的参数和响应的具体含义,我们就能采⽤上⾯的⽅法,直接利⽤requests或者urllib2模拟ajax请求,对响应的json进⾏分析得到需要的数据。
能够直接模拟ajax请求获取数据固然是极好的,但是有些⽹站把ajax请求的所有参数全部加密了。我们根本没办法构造⾃⼰所需要的数据的请求。还有⼀些严防死守的⽹站,除了加密ajax参数,它还把⼀些基本的功能都封装了,全部都是在调⽤⾃⼰的接⼝,⽽接⼝参数都是加密的。
遇到这样的⽹站,我们就不能⽤上⾯的⽅法了,通过selenium+phantomJS框架,调⽤浏览器内核,并利⽤phantomJS执⾏js来模拟⼈为操作以及触发页⾯中的js脚本。从填写表单到点击按钮再到滚动页⾯,全部都可以模拟,不考虑具体的请求和响应过程,只是完完整整的把⼈浏览页⾯获取数据的过程模拟⼀遍。⽤这套框架⼏乎能绕过⼤多数的反爬⾍,因为它不是在伪装成浏览器来获取数据(上述的通过添加
Headers⼀定程度上就是为了伪装成浏览器),它本⾝就是浏览器,phantomJS就是⼀个没有界⾯的浏览器,只是操控这个浏览器的不是⼈。
1.4 Cookie限制(登陆限制)
和Headers校验的反爬⾍机制类似,当⽤户向⽬标⽹站发送请求时,会再请求数据中携带Cookie,⽹站
通过校验请求信息是否存在Cookie,以及校验Cookie的值来判定发起访问请求的到底是真实的⽤户还是爬⾍,第⼀次打开⽹页会⽣成⼀个随机cookie,如果再次打开⽹页这个Cookie不存在,那么再次设置,第三次打开仍然不存在,这就⾮常有可能是爬⾍在⼯作了。
⽽Cookie校验和Headers的区别在于,⽤户发送的Headers的内容形式是固定的可以被轻易伪造的,Cookie则不然。原因是由于,我们在分析浏览器请求⽹站访问的过程中所分析得到的Cookie往往都是经过相关的js等过程已经改变了domain的Cookie,假如直接⼿动修改爬⾍携带的Cookie去访问对应的⽹页,由于携带的Cookie已经是访问之后的domain⽽不是访问之前的domain,所以是⽆法成功模拟整个流程的,这种情况必然导致爬⾍访问页⾯失败。 分析Cookie,可能会携带⼤量的随机哈希字符串,或者不同时间戳组合的字符串,并且会根据每次访问更新domain的值。对这种限制,⾸先要在对⽬标⽹站抓包分析时,必须先清空浏览器的Cookie,然后在初次访问时,观察浏览器在完成访问的过程中的请求细节(通常会在这⼀过程中发⽣若⼲次301/302转跳,每次转跳⽹站返回不同的Cookie给浏览器然后在最后⼀次转跳中请求成功)。在抓包完成对请求细节的分析之后,再在爬⾍上模拟这⼀转跳过程,然后截取Cookie作为爬⾍⾃⾝携带的Cookie,这样就能够绕过Cookie的限制完成对⽬标⽹站的访问了。
1.5 验证码限制
这种验证码可以通过OCR技术进⾏简单的图像识别破解,但是现在来说,验证码的⼲扰线,噪点已经多
selenium获取cookie到⾁眼都⽆法轻易识别的地步。所以⽬前⽽⾔,由于OCR技术发展不⼒,验证码技术反⽽成为了许多⽹站最有效的⼿段之⼀。
验证码除了识别难题之外,还有另外⼀个值得注意的问题。现在有许多⽹站都在使⽤第三⽅验证码服务。当⽤户打开⽬标⽹站的登录页⾯时,登录页⾯显⽰的验证码是从第三⽅(⽐如阿⾥云)提供的链接加载的,这时候我们在模拟登录的时候,需要多⼀步从⽹页提供的第三⽅链接抓取验证码的步骤,⽽这⼀步常常暗含着陷阱。以阿⾥云提供的验证码服务为例,登录页⾯的源代码会显⽰阿⾥云提供的第三⽅链接,但是当匹配出这个链接进⾏验证码抓取的时候我们会发现验证码是⽆效的。当仔细分析抓包的请求数据之后,发现正常浏览器在请求验证码时,会多带⼀个ts参数,⽽这个参数是由当前时间戳产⽣的,但是并不是完全的时间戳,⽽是时间戳四舍五⼊保留九位数字之后的字符串,对待这种第三⽅服务只能是细⼼加运⽓,三分天注定七分不信命来猜⼀发了。还有另外⼀种特殊的第三⽅验证码,所谓的拖动验证,只能说,互联⽹创业有三种模式2b,2c,2vc。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论