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. 17

    2019-04

    自媒体行业中是否需要代理ip

    如今越来越多的人开始使用微博、今日头条等等各种自媒体平台,因此很多公司很多人都看到了这之中的商机和机会,并且借助自媒体平台来发展自己的生意,也因为自媒体的蓬勃发展,现在也

  2. 27

    2019-02

    使用代理IP的好处有哪些?

    为什么要使用代理IP,代理IP又有什么好处?对很多小伙伴来说很陌生,那我就跟大家分享一下。

  3. 28

    2019-02

    爬虫所需要的代理IP究竟是什么?

    在爬取某些网站时,我们经常会设置代理 IP 来避免爬虫程序被封。我们获取代理 IP 地址方式通常提取国内的知名 IP 代理商(如西刺代理,快代理,无忧代理等)的免费代理。这些代理商一般都

  4. 27

    2019-02

    如何合理的控制爬虫采集速度

    随大数据时代,行业以及个人都越来越需要数据的帮助。在这样的大背景下,数据采集成为了重中之重,也成为了技术主流,但是大量的采集会受到限制,其中最常被限制的是IP,该如何解决代

  5. 06

    2019-05

    什么是IP以及它与代理有什么关系?

     Internet协议(IP)是将数据从Internet上的一台计算机发送到另一台计算机的方法或协议。Internet上的每台计算机(称为主机)至少有一个IP地址,可以从Internet上的所有其他计算机中唯一标识它。

  6. 19

    2019-04

    代理IP告诉你IP地址保密的重要性

    代理IP告诉你IP地址保密的重要性!简单的理解一下IP地址:IP地址就等于你家的地址,必要时相关部门根据IP地址就可以找到你,这是最简单的理解。专业性的解释,简单一些的说,IP协议中还有