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代理如何帮助Python爬虫抓取微博热门

    Python爬虫爬取新浪微博话题的相关数据

  2. 23

    2019-08

    代理IP是网红直播提高人气的秘诀吗?

    最近几年,各种各样的问答平台火爆发展,网红和直播行业更是一路飙升,各种小视频、游戏主播平台捧红了万千人心中的男神女神,除了之前的老牌平台斗鱼、YY,现在正在发展的还有熊猫、

  3. 12

    2019-06

    选择代理IP或者动态VPS时如何对比价格

    很多朋友在购物时都是以价格为主要因素,就拿代理IP或者动态VPS来说,有免费的就不用收费的,有便宜的就不用更贵的。这样虽然降低了成本,但同时也降低了效率,在如今这个时代,效率永

  4. 12

    2019-06

    如何选择稳定可靠的爬虫代理IP?

    由于开python培训有讲过爬虫的缘故,这个问题已经被ask无数次了,一般问的基友也都是爬虫防ban用的,总体来讲,质量好的都不便宜,便宜的质量都比较渣,一分钱一分货。

  5. 21

    2018-12

    如何用ip代理软件切换浏览器ip地址 ?

    ​作为从事网络推广工作的小编而言,由于日常工作原因,需要不断更换ip地址实现多个账号登录,身份刷新,所以ip代理软件,对小编而言显得尤为重要,用了很多款代理ip软件,使用代理ip软

  6. 12

    2018-09

    http代理怎么设置?http代理服务器设置

    ​http代理是一款网络安全工具,目前HTTP功能支持“直接连接”和通过”HTTP代理“形式的连接。选择其中的何种形式,要视用户所在的局域网(或其它上网环境)的具体情况。那么 http代理怎么