一、爬虫识别方法
1、http日志和流量分析
对IP访问频率统计,设置一个阈值,如果单位时间内某个IP访问频率和流量超过特定阈值就可以界定为爬虫。
2、Headers参数检测
一般有User-Agent、Referer、Cookies等等,目标站点可以检测User-Agent或者Referer参数的值来判断是否为爬虫,Referer参数也可以防盗链。
User-Agent是检查用户所用客户端的种类和版本,Referer是检查此请求由哪里来,通常可以做图片的盗链判断。网站可能会检测Cookie中session_id的使用次数,如果超过限制,就触发反爬策略。
3、在网页源码内放置一个对浏览器不可见的链接
正常用户使用浏览器是看不到该链接的当然也不会去点击,如果检测到该链接被点击,来访IP就会被界定为爬虫。
二、常见反爬虫策略
当我们识别出爬虫之后,通常可以采取以下几种措施来实现反爬:
- 临时或永久封禁来访ip。实现难度:简单。破解难度:简单。
- 返回验证码进行行为阻止。实现难度:简单。破解难度:困难
- 采用ajax异步加载:如果只是爬虫仅为静态网页爬虫,则爬取内容为空。实现难度:中等。破解难度:中等。
- 爬虫陷阱:使爬取的内容变成其他和本网站无关的信息。实现难度:中等。破解难度:简单
- 加速乐cookies验证服务:在访问之前服务器会先判断客户端请求的cookies正不正确。如果不正确,则返回错误状态码。实现难度:需第三方支持。破解难度:困难
- javascript渲染:网页开发者将重要信息放在网页中但不写入html标签中,而浏览器会自动渲染script标签的js代码将信息展现在浏览器当中,而爬虫是不具备执行js代码的能力,所以无法将js事件产生的信息读取出来。实现难度:中等。破解难度:中等。
如果还有爬虫可以绕过这些反爬策略的话,网站一般就会放弃阻拦了,因为拦截成本太高得不偿失。此外,反爬策略太严格的话会影响正常用户的访问。简单来说,反爬措施越多,网站用户体验越差。
三、针对反爬策略攻击者可能会采取的措施
从攻击者的角度来考虑,针对上述涉及到的反爬措施
- 针对反爬策略--临时或永久封禁来访ip
可以设置等待时间(显式或隐式)和使用高匿代理IP来解决。
- 针对反爬策略--验证码
如果不是每次都弹验证码也可以使用高匿代理IP解决,如果感觉高匿代理不稳定或者收集起来不方便使用Tor网络也可以;
如果每次都弹验证码那就得涉及到验证码识别了,简单的验证码可以自己写代码处理,python有不少知名的图像处理(识别)库(如PIL/Pillow、Mahotas、Pymorph、pytesser、tesseract-ocr、openCV等)和算法(比如大名鼎鼎的KNN[K邻近算法]和SVM[支持向量机]),但复杂的验证码例如涉及逻辑判断和计算、字符粘连变形、前置噪音多色干扰、多语种字符混搭的大多也只能靠接入人工打码平台来对抗了。
人工识别:适合比较复杂的验证码,正确率高,但是成本也高。
机器识别:调用在线验证码识别软件接口识别验证码,正确率百分之九十以上。
- 针对反爬策略--ajax异步加载
①可以使用fiddler / wireshark抓包分析ajax请求的界面,再通过规律仿造服务器构造一个请求访问服务器得到返回的真实数据包;
②可以使用selenium+phantomjs解决,phantomjs是一个无头无界面浏览器,使用selenium可以驱动它模拟浏览器的一切操作,但缺点也很明显,爬取效率低。
- 针对反爬策略--爬虫陷阱
一般是比较简单的死循环陷阱,可以对爬虫将要爬取的链接进行判断,不重复爬取相同的页面。除此之外,对于特定的元素看清之后小心爬取,例如可使用scrapy的LinkExtractor设定unique参数为True即可或者直接设定爬虫的最大循环次数。
- 针对反爬策略--加速乐的服务
稍复杂,可将浏览器返回的js代码放在一个字符串中,然后利用nodejs对这段代码进行反压缩,然后对局部的信息进行解密,得到关键信息放入下一次访问请求的头部中。可参考:关于加速乐最新反爬虫机制。
- 针对反爬策略--javascript渲染
使用selenium+phantomjs解决。
四、方案选型
目前企业网站常见的反爬方式一般有两种
第一种为企业根据网站自身特性选择反爬措施并实现,此方式较为灵活,但需投入大量成本,实现门槛较高。一般为大型网站如淘宝,京东等采用。
第二种为采取第三方提供商集成的反爬服务,此方式拦截效果好,实现成本较低。目前国内的极验公司此服务较为专业 https://www.geetest.com/BotSonar