IP代理软件,http代理,API提取-黑洞HTTP

黑洞HTTP

您的位置: 首页 > 新闻资讯 > 国内代理 > 正文

如何设计一个优秀的代理IP池?

发布时间:2019年04月17日 来源:互联网

  如何设计一个优秀的代理IP池?搬运一下自己的回答,以推广刚完成的一个代理池项目。


  花了大概两个多月的时间集中实现了一个分布式的代理IP池,目标是为大型分布式爬虫提供高可用低延迟的代理,它是开源免费的。

如何设计一个优秀的代理IP池?

  Kaito的答案给了我很大的启发。在haipproxy实现的前期,很大部分功能就是根据他的回答一步步实现的。站在巨人的肩膀上,也有一些自己的想法。比如代理IP来源,除了百度和谷歌之外,另外两个很重要的来源是同类项目的参考和代理IP站点的友链,它们也是一个很重要的来源。haipproxy算上墙内墙外的代理IP源,累积数量有30+。


  当IP源多了,如何落实到编码上来呢?如果设计得不好,那么光是代理IP抓取就要写很多代码,完全变成了体力活儿。haipproxy实现代理IP抓取的思路是:将页面结构类似的网站抽象出共性,然后编写规则以复用代码。因为很多网站还是用的 table 这种形式布局,所以代码复用会很容易。然后针对动态抓取的网站,采用 scrapy-splash进行渲染,再抽象出共性以复用代码。


  在代理抓取代码完了之后,由于IP源网站会每隔一段时间更新代理,因此我们需要定时抓取。定时任务也有一定的讲究,一般不同网站的IP源更新间隔不同,因此最好的方式是让定时任务和对应网站的更新间隔保持一致,这样的好处有:(1)不会漏掉每次更新的代理源 (2)不会因为频繁访问网站对其正常运行造成太大的压力 (3)当服务器资源有限的时候,也不会出现任务大量堆积的情况。


  通过上述过程,我们已经可以在30分钟以内采集到成千上上万的代理IP了。但是我们都知道,免费的代理IP可用性很低。如何在资源高度不可用的情况下获取到质量还算不错的代理IP本身就是一件很有挑战和意思的事情。haipproxy的做法和Kaito提到的做法类似,它会对Redis中的代理IP进行定时校验,校验的维度有三个:(1)是否匿名(2)稳定性(3)响应速度。是否匿名可以通过访问一个自己搭建的Web验证服务器来实现,为了减轻校验压力,haipproxy在解析代理网站页面的时候,就会丢弃掉大部分透明IP。为了确保真实IP的匿名性,做了是否匿名的再校验。稳定性可以通过一定的算法计算得到,由于篇幅原因,这里不写细节了,有兴趣的可以查看这篇文章。响应速度也是可以通过编写一个profilemiddleware中间件来获取到。


  到上一步,我们完成了一个代理IP从被抓取到入库的首次校验。部分朋友应该也知道,同一个代理IP对应不同网站,它的代理效果可能完全不同。因此,有必要维护特定站点的校验器。那么校验器的细节应该怎么实现呢?大致思路有:(1)如果通过代理IP返回的是非Timeout的错误,那么十有**该代理服务器的相关端口被关了,这时候应该直接舍弃掉该代理,而不能再去校验它。如果是Timeout错误,那么对其进行减分等下一轮定时任务再对其进行校验(2)校验的网站应该是特定站点的一个稳定的页面。通过返回的内容来判断该IP是否可用。比如知乎、微博这类 站点,如果该代理IP本来就被它屏蔽了,但是网站仍然会响应200状态码。同样地,我们需要每次校验都记录或者更新对应代理的响应速度和最近校验时间。


  通过上一步,我们已经完成了特定的校验器了。这时候我们只需要编写特定开发语言的客户端代码来获取代理IP了。Kaito所提的squid来做二级代理这个方法是有启发性和可行性的,haipproxy对其进行了实现。但是深入使用下来,发现了几个问题:(1)squid可能成为请求瓶颈(2)squid对代理IP的具体使用情况并不会有感知和回馈。因此,haipproxy目前实现了基于Python的代理调用客户端py_cli。客户端采用了一些策略来保证代理IP的高可用和低延迟,具体做法如下:


  根据配置从存储代理分数、代理速度和最近验证时间的队列中选出满足配置参数需求的代理再对其求交集,这样可以对上述的各个标准做合理的保证。在上述挑选方式选出来的代理数量不足的时候,会放宽挑选要求,对速度和最近验证时间求交集,然后和成功率做并集。如果代理数量还不足,它还会放低要求,对满足最近验证时间和成功率的集合做并集。


  在爬虫客户端调用py_cli的时候,代理客户端会首先调用refresh()方法,如果代理客户端实例的可用代理量不够,那么就会通过上一步的算法对IP池进行扩充,如果数量足够,那么就会根据代理的调度策略选取合适的IP进行使用。


  对代理客户端实例中的代理池的代理IP调用同样也需要策略。haipproxy目前实现了两种代理调度策略。(1)轮询策略。代理池是一个队列结构,每次从队首拿一个IP进行使用,如果该IP请求成功,则放到队尾,如果不成功,则需要调用代理客户端的proxy_feedback()方法将结果进行反馈。这种策略的好处是IP负载比较均衡。但是缺点在于,IP质量参差不齐,有的响应时间很快,有的响应时间很慢,并且高质量的免费代理IP的生命周期可能很短,这样就无法充分利用。(2)贪婪策略。使用此种策略的时候,需要爬虫端对每次请求的响应时间进行记录,每次使用后调用`proxy_feedback()`方法以决定该代理IP是否继续下一次请求的时候被使用。如果使用某个代理IP的响应时间低于某个设置值,那么就会一直使用它,直到不能用就从代理池中删除。如果时间高于了该值,那么它会把该IP放入队尾。概括起来,该策略就是低质量IP轮询,高质量IP一直使用。


  以上便是从高度不可用的资源中实现一个高可用的代理IP池的思路。


  此外,为了爬虫的效率和定时器的高可用,haipproxy基于scrapy和redis实现了分布式爬虫和定时任务调度器。


  说了这么多,那么该代理池的效果如何呢?下面是3月3日以知乎为目标站点,单机抓取的测试结果


  可以看到单机条件下,采用并发抓取可以达到1w/hour的请求量。


  项目和测试代码地址


  SpiderClub/haipproxy?github.com


  其中还有很多东西可以挖掘,比如流控、按城市筛选(在爬虫登录状态下有用)、高可用策略的继续优化等。所以希望有志同道合的朋友加入进来一起优化,一个人比较孤单。也希望看了这个回答或者使用了这个项目觉得有帮助的同学,能给个star鼓励一下。


相关文章内容简介

1 如何设计一个优秀的代理IP池?

  如何设计一个优秀的代理IP池?搬运一下自己的回答,以推广刚完成的一个代理池项目。  花了大概两个多月的时间集中实现了一个分布式的代理IP池,目标是为大型分布式爬虫提供高可用低延迟的代理,它是开源免费的。  Kaito的答案给了我很大的启发。在haipproxy实现的前期,很大部分功能就是根据他的回答一步步实现的。站在巨人的肩膀上,也有一些自己的想法。比如代理IP来源,除了百度和谷歌之外,另外两个很重要的来源是同类项目的参考和代理IP站点的友链,它们也是一个很重要的来源。haipproxy算上墙内墙外的代理IP源,累积数量有30+。  当IP源多了,如何落实到编码上来呢?如果设计得不好,那么光是代理IP抓取就要写很多代码,完全变成了体力活儿。haipproxy实现代理IP抓取的思路是:将页面结构类似的网站抽象出共性,然后编写规则以复用代码。因为很多网站还是用的 table 这种形式布局, [阅读全文]

热门标签

最新标签

推荐阅读

  1. 19

    2019-04

    IP代理帮助你提高网站关键词排名

    网站的排名发生变动是很常见的,但如果是忽然之间大幅度降低,那肯定是出现问题了,关键词的排名怎么会降低?假如关键词排名下降如何处理?如何恢复关键词排名呢?针对部分人提出的这

  2. 01

    2019-03

    爬虫遇到IP限制和访问时间间隔限制,如何处理?

    爬虫在爬取数据时,我们时不时会遇到反爬虫的问题,例如时间的限制、IP限制、验证码限制等等,都可能会导致爬虫无法采集数据,那么就会出现像代理IP、时间限制调整这样的方法去接触反

  3. 12

    2019-06

    国内代理ip哪家比较好用?

     如果需要大量的中国的代理ip,哪家是不错的呢?价格如何?质量如何?数量如何呢?多人都需要使用国内代理ip的,如果能找个不错的商家,这样用起来也是不错的。

  4. 26

    2019-02

    如何选择爬虫代理?

    在数据化的时代,数据采集十分重要,企业和个人慢慢注重爬虫采集技术。而爬虫采集过程就要选择代理IP,那么选择什么样的爬虫代理至关重要。要想找到适合的代理IP,首先要了解什么是代

  5. 12

    2018-09

    代理IP是什么?,代理IP有什么作用?

    如果你是一名互联网工作者,那么你一定遇到过ip被封禁的问题,作为从事网络推广工作的小编来说,需要在各大平台去发帖,一个不小心ip地址就被屏蔽 ,那么遇到这种情况该如何解决呢?

  6. 16

    2019-04

    使用代理服务器确保数据功能的安全性?

    加密。这到底是什么意思?你被隐藏了。使用代理服务器确保数据功能的安全性虚拟专用网络是一种独特的系统,可以在从1个位置传输数据时对其进行分发和加密。通过代理连接到网络,您可