万事万物都存在对立面,有正就反,有对亦有错,有阳也有阴,有好也有坏,正是因为这样的“对立”才能够对事情的本身达到一种均衡和制衡,否则结果导向只有一方只会让事情变得极端。

废话不多说,爬虫也是一样,爬虫是什么呢?鉴于本公众号的读者可能未必都是技术开发人员,所以在这里简单的阐述一下爬虫是什么?

爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。(好了不去往下深究,知道干啥的就行了

说白了,爬虫是一个能够爬去网站上可见数据的程序而已。说到这里,可能有人会想到下面这个场景:

爬虫这个职业算是疯狂的在法律边缘试探吧,但是只要遵循业界的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存储的最大数量等等

以上就是整体的代码流程和介绍,不知道是不是对付限流算法算绰绰有余了呢?

需要的可以评论留言邮箱!

数据我爬定了,限流也挡不住,我说的相关推荐

  1. 可视化界面 Sentinel 流控卫兵 限流 熔断 系统保护

    Sentinel 流控卫兵 Sentinel分为两个部分: 核心库(Java客户端):客户端调用通用的应用 控制台(Dashboard):基于springboot开发的,打包后可以直接运行,不需要额外 ...

  2. 10张图带你彻底搞懂什么是限流、熔断、服务降级

    在分布式系统中,如果某个服务节点发生故障或者网络发生异常,都有可能导致调用方被阻塞等待,如果超时时间设置很长,调用方资源很可能被耗尽.这又导致了调用方的上游系统发生资源耗尽的情况,最终导致系统雪崩. ...

  3. 12张图带你彻底搞懂服务限流、熔断、降级、雪崩

    目录 一.服务雪崩 二.服务限流 1.限流指标 1)TPS 2)HPS 3)QPS 2.限流方法 1)流量计数器 2)滑动时间窗口 3)漏桶算法 4)令牌桶算法 5)分布式限流 6)hystrix限流 ...

  4. sentinel 限流熔断神器详细介绍

    一.限流熔断神器 sentinel 1.什么是 sentinel: 在基于 SpringCloud 构建的微服务体系中,服务间的调用链路会随着系统的演进变得越来越长,这无疑会增加了整个系统的不可靠因素 ...

  5. .Netcore 2.0 Ocelot Api网关教程(7)- 限流

    本文介绍Ocelot中的限流,限流允许Api网关控制一段时间内特定api的总访问次数. 限流的使用非常简单,只需要添加配置即可. 1.添加限流 修改 configuration.json 配置文件,对 ...

  6. 【开发经验】java代码中实现限流

    限流目的 限流的目的是防止恶意请求流量.恶意攻击.或者防止流量超过系统峰值. 流量达到峰值时,会有一个熔断策略,常见的熔断策略: 直接拒绝请求,跳转到一个"服务器出小差"页面 排队 ...

  7. 分布式系统限流策略(一)

    限流算法 令牌桶算法 漏桶算法 应用级限流 限制总并发数/连接/请求数 限制接口的总并发/请求数 限流接口每秒的请求数 平滑限流接口的请求数 平滑突发限流(SmoothBursty) 平滑预热限流(S ...

  8. 分布式系统限流策略/秒杀系统限流设计

    目录 概述 限流算法 令牌桶算法 漏桶算法 应用级限流 限制总并发数/连接/请求数 限制接口的总并发/请求数 限流接口每秒的请求数 平滑限流接口的请求数 平滑突发限流(SmoothBursty) 平滑 ...

  9. 限流与代理网关集成调研及应用

    目录 一.限流相关问题概述 为什么使用限流? 限流场景: 限流的处理方式: 限流架构 限流算法 固定窗口算法 滑动窗口算法 漏桶算法 令牌桶算法 限流开源项目 Guava 的 RateLimiter ...

最新文章

  1. tensorflow 转 numpy 转 tensorflow
  2. tensorflow与pytorch区别
  3. 目标检测别再刷榜了,让流感知来展示真正的技术!ECCV 2020 最佳论文提名
  4. 从字节码看 finally关键字、异常表
  5. dede服务器建站_新手搭建DeDecms织梦网站的详细操作流程
  6. OVER(PARTITION BY)函数介绍
  7. Kotlin技术 - 委托和代理
  8. JAVA计算机毕业设计教育培训机构信息管理系统Mybatis+系统+数据库+调试部署
  9. HTML元素 span,div,p,h,a盒子模型中padding属性的演示和理解
  10. html5火焰字体效果,CSS3文字特效属性text-shadow如何实现火焰文字的效果
  11. CraftManager for Mac(PS/sketch自动填充神器)特别版
  12. 用Chrome浏览器模拟手机,andriord,iphone,ipad访问网站
  13. Python两种方式求多个数的最大公因数(HCF)和最小公倍数(LCM)
  14. api有哪些 javasocket_简单hello/hi程序、分析及Java Socket API与Linux Socket API对比
  15. c语言实数加法程序,蓝桥杯 算法提高 实数相加(c语言版附注释)
  16. java 程序员 基石
  17. TOFEL托福经验贴
  18. HTML中的删除线:del和s的区别
  19. diskpart修改盘符
  20. java情剑天涯,征途的潇湘九夜改名叫什么了

热门文章

  1. IllegalArgumentException: wrong number of arguments
  2. Karma-Protractor 学习
  3. vue项目中如何设置ico图标
  4. 如何做好用户故事地图?
  5. 局域网通信软件 飞鸽传书
  6. Azure Synapse Analytics(Azure SQL DW) 性能优化指南(2)——使用具体化视图优化性能(上)
  7. 图像质量评价的方法和意义
  8. 达梦数据库常用函数——字符串函数
  9. Vuex前端saas人力资源中台管理项目第五天 权限管理和图表设计
  10. XSL的一些基础知识!