目录
说在前面
反爬虫技术概览
验证UA头(User-Agent)
使用js(Ajax)
限制同IP(UA、Session)多次访问 站
加密、额外携带验证码、cookie验证
文字额外编码/使用图片替代特殊文字
说在前面
有光就有暗。互联 上关于信息安全的战争从来没有停过,爬虫技术在给使用者带来方便的同时也可能会拖慢服务器的响应速度或者损害服务端的信息安全。打个比方,主人( 站)邀请你去喝喜酒(访问),你却从后门(爬虫)进来,主人没收到你给的随礼(付费内容等),迎宾( 站流量)也没统计到你进了主人府上。爬虫不比真正的用户访问,所以即使被爬取的 页是公开挂在互联 上的也不是你理直气壮说爬就爬的理由。
所以,许多 站为了防止恶意爬虫,也为了保护自己的数据,采用了一些反爬虫的手段。本节我们首先介绍一些常用的反爬虫手段,并分析如何绕过这些障碍。
重申一点,Do not be evil。
反爬虫技术概览
验证UA头(User-Agent)
User–Agent(用户代理),简称UA,服务器通过其识别客户端使用的操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。总而言之UA是让服务器区分用户的操作系统等,方便针对性地提供服务。
验证User-Agent属于最简单方便的反爬手段之一(有些 站还会验证Referer),很多 站会要求发送的请求里的UA在一个相对正常的范围内(什么是相对正常以用fiddler看看你的电脑发出去的请求头部)。而很多爬虫模块例如Urllib直接向浏览器发送请求的请求头UA通常会注明为“Python-Urllib”,这相当于直接告诉了服务器你是爬虫;有些爬虫也可能直接不在Header里注明UA。这两种请求都会被服务器识别出是爬虫从而拒绝服务等。
与此相对的,要通过服务器的UA头检查自然是要编造一个相对正常的UA头,也可以用你自己电脑的UA头。如果你要爬取手机 页的话,直接设置一个手机的UA头也是个不错的选择。
使用js(Ajax)
其实我认为ajax与其他js要分开来讲。
ajax等动态加载 页的技术本质上是为了节约服务器的带宽同时方便浏览 站的用户,大多数时候 站使用ajax只是为了美观和方便,并不是为了反爬。但是ajax技术确实会对获取数据的爬虫造成阻碍。
至于其他js,被用来反爬的技术主要是验证码。现在的验证码从识别数字到点击验证,难度从高到低应有尽有,确实较难破解,而且有些验证码需要浏览器执行相应的动作比如点击等,对爬虫而言是不小的挑战。
至于以上两种的解决方法,ajax可以通过模仿浏览器行为(selenium或者PhantomJS)解决,验证码就要分情况而论了。最简单的数字字母验证码可以通过OCR或者AI解决,更深度的目前我们不讨论。
限制同IP(UA、Session)多次访问 站
很多恶性爬虫(比如12305的抢票软件)会在很短的时间内多次访问 站以尽快获取更新的数据,所以大多数 站会限制同一IP在指定时间内访问 站的次数,或者直接把访问过于频繁的IP拉黑,让其无法访问 站。有些 站也会验证同一UA和Session的访问次数,解决方案是一样的。
对于这种方法我们可以使用IP代理池,每次使用不同的IP访问 站,不过获取大量IP也需要耗费一定金钱。
加密、额外携带验证码、cookie验证
文字额外编码/使用图片替代特殊文字
其实就是字体反爬技术,利用一个自定义的字体和编码,在前端额外渲染编码,使得爬虫只能获取到编码前的信息。字体文件和编码映射可以随机生成,所以每次爬取到的内容也不固定,单单分析一次字体文件是不够的。由于自定义的字体文件需要额外加载,这种方式一般只用在几个关键字上(比如是、不等,好像绿江用过/p>
使用字体反爬技术的 页中会用到@font-face这个css类。
由于这些反爬措施都建立在“爬虫是绕过 页直接向 站提交信息”的基础上,所以使用selenium或者直接分析原页面都是很好的解决方案。说到底反爬技术就是在不干扰到正常用户的情况下增加;爬虫获取到信息的成本,成本过高即使能够绕过也不划算了。
文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树 络爬虫urllib211392 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!