说起网络上这个网络蜘蛛最让程序员头疼的就是反爬机制,爬虫其实就是模拟浏览器获取数据,反爬虫机制就是过滤这些不正常的访问及数据获取,对于一些古老的应用没有反爬虫机制这样一来程序员爬虫就是海阔任鱼跃,但是对于一些应用广泛的应用会更新加上一些反爬虫机制,那么接下来让我们了解一下常见的反爬虫机制及应对策略。
IP限制反爬虫机制
有一些网站会根据电脑的IP地址访问的频率,次数进行反爬,这么一来你用单一的IP地址访问频率过高,一般网站考虑到访问量,服务器会在短暂的时间内禁止这个IP访问。即使这样也难不倒聪明的程序员,
程序员的应对措施:构造自己的IP 代理池,然后每次访问时随机选择代理(但一些IP 地址不是非常稳定,需要经常检查更新)。
Headers反爬虫机制
这个反爬虫机制是从用户headers进行反爬虫,headers是一种区分浏览器行为和机器行为中最简单的方法,大多数网站都是应用headers来反爬的,还有一些网站会对上级链接进行检测来实现反爬虫机制。
程序员的应对措施:通过审查或者开发者工具获取相应的headers然后把相应的headers传输给python的request,在pycharm中提供的随机请求头,一般可用(from fake_useragent import UserAgent)模拟“User-Agent”数据,进一步模拟浏览器,这样就能很好地绕过。
UA反爬虫机制
UA反爬虫机制是用户访问网站的时候浏览器会对用户的行为进行记录标识,类似与IP反爬虫机制。
程序员的应对措施:构造自己的UA 池,每次python 做requests 访问时随机挂上UA 标识,更好地模拟浏览器行为。当然如果反爬对时间还有限制的话,可以在requests 设置timeout(最好是随机休眠,这样会更安全稳定,time.sleep())。
验证码反爬虫或者模拟登陆
验证码:这个办法也是相当古老并且相当的有效果,如果一个爬虫要解释一个验证码中的内容,这在以前通过简单的图像识别是可以完成的,但是就现在来讲,验证码的干扰线,噪点都很多,甚至还出现了人类都难以认识的验证码,这样进一步形成机器攻击登陆的反爬机制。
程序员的应对措施:截图,二值化、中值滤波去噪、分割、紧缩重排(让高
矮统一)、字库特征匹配识别。(python 的PIL 库或者其他)模拟登陆(例如知乎等):用好python requests 中的session。
Ajax动态加载
网页的不希望被爬虫拿到的数据使用Ajax 动态加载,这样就为爬虫造成了绝大的麻烦,如果一个爬虫不具备js 引擎,或者具备js 引擎,但是没有处理js 返回的方案,或者是具备了js 引擎,但是没办法让站点显示启用脚本设置。基于这些情况,ajax 动态加载反制爬虫还是相当有效的。
Ajax 动态加载的工作原理是:从网页的url 加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载出更多的内容,并把这些内容传输到网页中。这就是为什么有些网页直接爬它的
URL 时却没有数据的原因.
程序员的应对措施:若使用审查元素分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET 链接寻找Type 为text/html 的,点击,查看get 参数或者复制RequestURL),循环过程。如果“请求”之前有页面,依据上一步的网址进行分析推导第1 页。以此类推,抓取抓Ajax 地址的数据。对返回的json 使用requests 中的json 进行解析,使用eval()转成字典处理fiddler 可以格式化输出json 数据。
cookie限制反爬虫机制
一次打开网页会生成一个随机cookie,如果再次打开网页这个cookie 不存在,那么再次设置,第三次打开仍然不存在,这就非常有可能是爬虫在工作了。通常记录的用户行为的就是会话cookie,会话cookie和session的配合在服务端和用户端清晰的记录保存着用户的行为,这么一来类似识别电脑I更加精细的记录用户信息来构造反爬虫机制。
程序员的应对措施:在headers 挂上相应的cookie 或者根据其方法进行构造(例如从中选取几个字母进行构造)。如果过于复杂,可以考虑使用selenium 模块(可以完全模拟浏览器行为)