数据我爬定了,限流也挡不住,我说的
万事万物都存在对立面,有正就反,有对亦有错,有阳也有阴,有好也有坏,正是因为这样的“对立”才能够对事情的本身达到一种均衡和制衡,否则结果导向只有一方只会让事情变得极端。
废话不多说,爬虫也是一样,爬虫是什么呢?鉴于本公众号的读者可能未必都是技术开发人员,所以在这里简单的阐述一下爬虫是什么?
爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。(好了不去往下深究,知道干啥的就行了)
说白了,爬虫是一个能够爬去网站上可见数据的程序而已。说到这里,可能有人会想到下面这个场景:
爬虫这个职业算是疯狂的在法律边缘试探吧,但是只要遵循业界的robots协议,管好自己的程序,什么能爬,什么不能爬,心里有一条界限,通常情况下还是允许爬的。
举个例子,你每天用的百度,你以为都是小编每天夜里不睡觉,不辞辛苦给你手动编辑好的吗?相信你也曾经参与过某东,某猫,或者某米的秒杀活动吧,不知道你的手速如何?即便是用上你单身20年的手速,但是到了抢的那一刻也只是一瞬间的事情,你该不会天真的以为,能够抢到秒杀产品的人都是靠手速的吧?那就错了,答案当然还是:爬虫,除了这些基操,还可以用于刷票(当然不提倡大家这么干,我们要积极倡导公平,公正,公开)。
说到这里,你可能会说,这不公平,有种拼手速,官方怎么也不管管他们?
然而事实并非如此,官方和爬虫之间的较量就好比之前博弈,官方不是不想管,而是管不住,其中一个最大的难点就是,到底谁是爬虫谁是人?这句话怎么理解呢,因为爬虫程序在像人一样访问一个网站时,它首先会进行伪装,例如,增加一些浏览器的请求头,常见的有user-agent等,让官方无法识别出这是一个人还是一个程序。
与此同时,爬虫不单仅仅伪造承认,一个爬虫程序可能势单力薄,于是又有了分布式爬虫,多搞几个同样的爬虫程序一起参与秒杀,这也就是你再怎么拼手速也拼不过它的原因了。
既然官方无法识别出来对方是一个人还是程序,而且分布式爬虫(或者人多了)都会对官方对服务端造成一定的压力,更有甚者,严重的直接导致服务端宕机,例如很早之前的12306,其实爬虫也会内卷,张三知道了李四用的爬虫,于是张三通过某种途径也搞到了爬虫,王五也用了爬虫,于是大家都最后用了爬虫,而且是分布式的那种哦,结果不言而喻,最惨官方诞生。
于是乎,作为官方的运维人员或开发人员对于爬虫深恶痛绝,想尽各种办法,既然无法区分人还是虫?那么就统一处理,于是,开始了以下操作,在网页的交互层面,添加各种各样的验证码,添加身份认证,添加短信验证码等等操作,这些限制都是在网页的交互层面作出的处理,虽然在一定的程度上限制了爬虫,但是依旧挡不住突破这些限制的虫子,更何况,现在验证码中的图片识别技术,携带cookie,携带token等信息认证技术都不是难点。验证码能做到的也就仅仅是在“抢”的一瞬间,让大家在操作时间上出现差异,从而减轻服务器端在一瞬间的请求并发。
简简单单的一个验证码,让官方服务端减轻了不少压力,但是这虽然从官方的角度算是解决了爬虫带来的压力问题,却依然没有提供出一个可以公平竞争的场景。毕竟当我们在验证码上滑动方块时,而爬虫在一瞬间已经通过计算方块的缺口进行滑动补全了。
于是,官方为了解决这个问题,又开始在请求接口上做限制,要知道,我们人的反应速度和点击速度,实际上并没有特别快,哪怕就是滑动验证码也至少得0点几秒吧,针对爬虫来说,在0点几秒内可能已经干了很多事情,所以官方针对爬虫在请求接口上进行了限制,例如,针对同一个ip过来的请求,不管你是爬虫还是人,1秒内我只让你请求5次,超过5次,直接给你一个提示,请求频繁访问!甚至直接把你ip拉进黑名单,超过5次者,10天之内不允许访问。这虽然在做法上是一棍子打死的做法,但是仔细想想,无论是人还是爬虫反正都被拉入了黑名单,但至少,人抢不到,你的爬虫也别想抢到。
可能有人此时已经想到BB了这么多,你到底想表达的个what?接下来要说的就是针对爬虫老兄,对不住了!我是限流算法这一文章给出的回应,数据我爬定了,限流也挡不住,我说的。
记得之前看到的一个老师讲到的爬虫的课程首页几个宣传字,爬虫的终极奥义:所见即所得。意味着,只要你在网页上能够看到的,那么都可以爬取下来。
破解限流算法也不是不行,限流算法的根本是对客户端(人)的频繁请求作出的限制,那么我们只需要知道服务端是怎么来认定一个客户端端唯一身份的呢?一般的来讲都是靠IP(不用登陆的那种),所以,有了这个依据,那就简单了,我们只需要爬取的时候发现被限制了,更换不同的IP不就好了吗?这也就是本文的重点--爬虫之IP代理。
IP代理,在爬虫技术中最为常见,且使用的非常频繁。接下来我们用之前做过的项目为例,找了一个还不错的代理项目,IP代理有钱的可以直接买一些网站的,毕竟花钱买的质量还是有保障的,比如可以买到一些高匿名的,稳定的IP,但是今天我们要讲的是:我 没 钱,难道就不配使用IP代理吗?开始正文.......
代码大致流程是:通过爬取66ip代理网站,云代理网站,快代理网站,西刺代理网站等几个网站IP,来构建我们的IP代理池,其中通过爬取到的IP来代理访问百度地址用于检测IP代理的有效性,针对有效的IP,我们通过以打分的方式来标注出它的可用程度,其中无效的IP或者分数小于设置的最小分数直接舍弃掉,符合的IP保存到redis中存储下来,方便以后通过这些IP来代理访问网站。
代码结构如下:
代码结构讲解:
-
api.py:使用了flask来提供随机获取代理的接口,以及统计代理总数的接口
-
crawler.py:爬取IP代理网站的代码逻辑
-
db.py:操作redis的逻辑
-
error.py:如果redis代理池没有可用IP后的异常处理
-
getter.py:存放开始爬取代理的逻辑入口以及判断IP代理池是否已经达到了上限
-
scheduler.py:整体调度逻辑,将api,crawler,tester等串联起来
-
tester.py:测试IP代理的有效性
-
utils.py:存放了一些工具方法
-
proxy_pool_run.py:程序主入口
-
settings.py:设置一些参数,例如代理分数的最大值,最小值,初始值,以及redis存储的最大数量等等
以上就是整体的代码流程和介绍,不知道是不是对付限流算法算绰绰有余了呢?
需要的可以评论留言邮箱!