TheRedistutorial'sproxyIPpooldesignmethod

TheRedistutorial'sproxyIPpooldesignmethod
前言

众所周知,代理IP是经常被用来作为反爬虫的手段由于其简单、便宜,但稳定性一直谴责。优质IP代理筛选并不简单,即使支付代理IP源购买,卖方不能保证100%的可用性;其他代理可以预测IP网络的生命周期,可以一次可以用,下一秒的生活。由于这些原因,有使用代理IP的爬虫程序,许多不稳定因素,消除代理IP的影响,常用的方法是建立一个代理IP地址池。每一个请求都到池中取一个IP。使用后,它还确保池中的IP是可用的。本文将讨论如何使用redis建立代理IP库自动更新优化

整个过程
如上所示,左边是一个封闭的循环,形成了整个过程,从爬虫到独占的方法,让代理IP爬行完成IP的返回,这个过程不是很严格。如果爬虫程序被异常中断,IP将不会被返回,这将导致IP无法循环,但是,由于代理IP本身的特性,数量很大,回收的价值不很大,所以这是让它的情况

它还提到,IP是一个独特的方式获得的,如果是爬两个不相关的网站,一个IP就可以,但现在需要两。为了最大限度地利用资源,渠道总代理IP库和IP库进行介绍。两个网站作为两渠道,独立无关;总池是要拯救所有的IP,每个信道是共享的。如果只有一个IP 1.1.1.1在总池,爬一个网站会把它从总池从通道的IP地址池,然后从通道IP池履带带1.1.1.1使用,然后1.1.1.1仍在总池,但通道IP池不包括1.1.1.1;B网站也爬同一过程得到1.1.1.1,只是让自己去通道池,下面是池和通道池的详细信息。

总代理IP池
总池由所有可用的IP共享,但只有IP存储池并不能实现自动选择啊,这是通常倾向于延迟低速IP更容易被屏蔽,所以我们希望IP池是按升序排序的数据延迟,随着redis的帮助集的结构可以通过积分实现IP成员表示,延迟。

延迟使用Zadd添加新的IP或更新IP:
> > 200 1.1.1.1:8080 Zadd proxy_global_ips 100 2.2.2.2:80 300 3.3.3.3:8888
(整数)3
使用zrange获得IP,你可以指定的东西,你得到的数,如两:
> > zrange proxy_global_ips 01积分
1)2.2.2.2:80
2)100 。
3)1.1.1.1:8080
4)200 。
通道的IP地址池
通道的IP池是用来最大限度地提高IP在总池和使用分离的其他通道的IP地址池,因为一个IP太多次的使用有很大的概率被目标网站屏蔽,所以还需要优先考虑,应优先选用更少的IP,同样也是有序集合的使用,分IP说使用,数量的成员说,这是不同的从总池显然是关键是没有固定名称的通道、组合,从而保证通道之间的隔离,如信道ABC重点:proxy_channel_abc_ips。

由于在信道池IP是以独占方式,我们需要一个zpop方法。本身不怎么使用,但它是通过从一个原子操作删除lua模拟IP好,然后删除它。
>评价地方EL = redis.call('zrange键{ 1 },0, 0,'withscores ');redis.call('zrem键{ 1 },埃尔{ 1 });返回;1
在通道IP池中添加IP:
> > Zadd proxy_channel_abc_ips增加0 1.1.1.1:8080
这是不同于一般的游泳池是一个增加的选项,这是一个新的特点是使用3.0.2版本支持,指定在Zadd成员冲突的方法,并表明它是冲突后的累计得分的方式,为什么要使用此选项,在下面的过程看:

在信道池只有1.1.1.1,使用数为10;总池还有1.1.1.1,是第一位的。
线程取出1.1.1.1
线程B从通道池以IP,不拿,补充IP从总池的通道池:Zadd proxy_channel_abc_ips 0 1.1.1.1;删除1.1.1.1
线程返回1.1.1.1:Zadd proxy_channel_abc_ips 11 1.1.1.1
线程B返回1.1.1.1:Zadd proxy_channel_abc_ips 1 1.1.1.1
第五步之后,IP 1.1.1.1计数被重置为1,不是12我们的预期。通过增加选项来避免这样的尴尬,这只能保证最终的计算是正确的,会有一些意想不到的情况,如:

有1.1.1.1通道中的游泳池,10,和2.2.2.2,和使用的是2号;总池1.1.1.1,它是第一个。
线程取出1.1.1.1
线程B拿出2.2.2.2
线程C以IP从信道池,不把它补充IP从总池的通道池:Zadd proxy_channel_abc_ips 0 1.1.1.1;删除1.1.1.1
线程C返回1.1.1.1:Zadd proxy_channel_abc_ips增加1 1.1.1.1
线程B返回2.2.2.2:Zadd proxy_channel_abc_ips增加3 2.2.2.2
螺纹D以IP从池和1.1.1.1分配少于次数。这不是我们所期望的。1.1.1.1实际上已经使用了12次。我们宁愿2.2.2.2被删除。
如果您想避免这个问题,一个简单而粗略的方法是增加信道池的容量,使IP数长于并发线程的数量。

更新
与IP有关的两个属性:延迟(爬上页面的时间)和它们使用的次数。这是关于它们如何自动选择的,以及它们是如何更新的。时间延迟和使用的更新需要爬虫程序的协调。使用的时间和增量应记录在程序中。当我们返回IP时,我们应该把最新的值带到总池和通道池中。每当我们返回IP时,我们需要带来最新的使用时间,然后将IP延迟更新到总池。如果返回IP失败,就必须从池中删除IP,并确保IP不会再次使用。对于当前的信道池,不需要返回它。其他信道池不处理任何事情,因为IP不在当前信道上,通常是因为它被屏蔽了,其他信道仍然可以使用,即使不能使用,也会在IP返回时在其他信道上被删除。

这两个属性可以更新使用,在IP获取、使用hashs节省IP对应的采集时间及使用频率;从hashs出时间延迟的回报,使用频率和去除加1,然后更新通道的总池和游泳池,这也可以避免上述IP不符合预期的问题。

总结

有更新方法在Redis的弊端。延迟将包括获取和返回的传输时间。如果爬虫程序多次获取一个IP,这将导致更少的时间来使用。当然,这可以通过在程序中更新IP的属性调用redis多次求解,从而增加整个过程的复杂性和需要权衡自己。

个人仍然倾向于在记录程序和最终被更新到Redis方案,逻辑不够严谨,但问题不会导致严重的后果。程序的健壮性是不允许出现错误,但错误的出现有很好的容错性。

以上就是本文的全部内容。希望本文的内容能给大家的学习工作带来一定的帮助。如果有任何疑问,你可以留言。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部