当前位置 博文首页 > 文章内容

    拨号vps中动态ip代理池设计与解决方案

    作者:糖丝橙 栏目:拨号vps 时间:2020-05-14 16:15:19

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    一、背景

         爬虫服务请求量大,为了应对反爬措施,增加爬虫的爬取效率和代理IP使用率,需要设计一个IP代理池,满足以下需求:

         1.定时任务获取第三方代理

         2.及时剔除IP代理池中失效的IP

         3.业务隔离IP

         4.若IP未失效,但对某个业务来说,IP被封,需要针对业务,隔离此IP

         5.均衡使用IP

         6.避免IP使用频率不均问题

    1.1 调用代理API

         调用混拨代理API,返回结果

    de69fefb4040b35df21370accb801d0c.png

    二、一些知识点

    2.1 代理IP是如何产生的?

         ASDL拨号,是一种上网方式,每拨一次号,就会产生一个新的IP。而第三方的IP厂商,通常会买很多拨号VPS服务器,定时拨号来产生新的IP,提供给需要代理的客户。

    三、需求1:及时剔除IP代理池中失效的IP

    3.1 超过有效时间,自动失效

         每个IP都有固定的有效时间(拨号时间)。IP失效的原理,IP通过ASDL拨号产生,当ASDL重新拨号,则旧IP失效,新IP产生。如3分钟拨一次号,或3-10分钟拨一次号,为了保证IP的使用率,通常以最长的失效时间(如有效期3-10分钟,选10分钟作为失效时间)。

         使用Redis存储Key-Value,失效时间为最长有效时间。Key为IP+端口。Value为任意固定值。

    3.2 检测失效

    检测时间点

         获取到IP时,放入代理池之前

         在代理池中

         通常IP的真正有效时间不是固定的,比如说的有效时间是3分钟,真实有效时间可能低于3分钟。这里就需要有一个机制来单独检测IP是否有效。

         通常的做法是,IP池中的每一个IP都要定时访问一个固定的测试链接,访问失效则从队列中剔除。

    如何选择固定的链接,有下列几种要求:

         1.测试链接的网站要尽可能地稳定

         2.返回的内容要尽可能的小

         3.网站最好不要有反爬措施

    测试链接

         测试链接的一个比较好的方案是,自己提供一个CDN链接,链接指向一个只有200字符串的txt文本。

         最好提供两个CDN链接,同时请求,只要有一个能请求通,就判断为IP有效。防止一处CDN挂掉,导致所有代理IP被判定为失效。

    3.3 伪代码

    获取代理时

    0a3c7535308ed52c32f2f35aa3bf97be.png

    IP代理池中检查

    6b11a770b46c2ed5b4450c694d68ff95.png

    四、需求2:业务隔离IP

    4.1 IP隔离判定

    错误记录队列

         这里IP调用服务就需要做成一个单独的服务,其他业务服务都调用该IP服务。每次调用的时候需要上报IP,IP可用或不可用,同时附带业务名(如business-1)。

         IP服务端维持一个队列记录,记录业务与IP的错误次数,Key为业务名-IP,Value为错误次数,设置一个标准值,若连续错误N次,则将此IP放到失效队列。

    失效队列

         失效队列中,使用set存储,name为业务名称,value为失效IP

    调用IP服务

         业务每次调用IP,首先获取失效队列中的IP列表,然后请求时附带IP列表作为参数,请求不包含失效IP的任意IP。

    五、均衡使用IP

         1.使用zset维持,使用时间戳作为score,zset会以score从小到大排列。

         2.当一个IP被使用,则设置score为当前时间戳,则IP会排到队尾。

         3.每次获取IP时,都从队头的前N个IP中,选择一个。


    文章来源:CSDN博客

    原文链接:https://blog.csdn.net/weixin_42142408/article/details/89348458

    如有侵权,请联系本人删除