探讨如何高效复用IP代理 无合适标签 原创

clark1203 10月前 1724

举个例子:

早上9点,我的10个爬虫同时启动作业,他们都需要代理。


其中爬虫中,我都从代理服务商,取了一个5分钟的IP代理,去相关网站爬取,但是在第3分钟,IP被ban;

这时候代码就需要干2件事情:

1、判断被ban的条件,发出被ban的信号

2、向代理服务商发出请求,更换IP


那么问题来了:

虽然代理IP 111.111.111.111 在网站A被ban,但是他可以在网站B使用,应该考虑复用的问题。


初步想法:

存入Redis的数据:

{
   "ip": "122.4.42.131",
   "port": 4242,
   "expire_time": "2020-03-22 16:16:16",
   "city": "山东省济南市",
   "isp": "电信"
   "ban": ["taobao.com", "baidu.com"] # IP被ban的域名列表
}


所有爬虫初始化的时候,从发送需要`并发值` `检测网址`到代理IP池 API,代理池 根据 `并发值` 向 代理服务商请求 同等数量的IP代理,使用 `检测网址`作为目标网站,进行检测(比如统一请求baidu.com,如果IP访问通,则此时此IP已经计费),如果不可以访问,则在

"ban": ["baidu.com"] # IP被ban的域名列表

添加被ban的域名。


爬虫A 开始第一个请求,从代理池拉取IP,使用 Redis pop,排除被ban的IP;

如果第一个请求,判断出IP被ban,修改json数据,再存入代理池供其他爬虫取用。如果没有被ban,则继续使用



现状:

目前市面上的代理池,大多解决的是免费代理聚合,免费使用的问题,并没有关心这个场景的应用。

如果,像阿布云代理这样的隧道代理,可以循环取用, 变更ip,不用担心代理消耗的问题,但是,包月场景,在高并发的情况下,显得有些贵。



欢迎大家讨论~

最新回复 (7)
  • buging 1月前
    2 8

    你这需求我一年前就实现了。
    要做的东西挺多的。
    首先吧功能拆开,需要做两个模块
    1.获取ip模块。(总调度模块,IP的分发和新ip的请求都走这一个模块)
            一个部署在服务器的长任务,接管所有代理ip获取信息,统计某一个域名下的请求。
            根据某一域名的ip需求获取新的代理ip,新的代理ip拿到后先放入总池,
            接收到域名的ip请求时,根据总ip池减去域名的被封ip池,得到可用的ip
    2.跟着爬虫文件走的ip请求模块
            向总调度模块请求IP,请求的时候把爬虫的域名带上。(其余参数根据需求自行设计,例如一次获取ip的数量, ip的有效时长等等)
            爬虫检测到ip被封,把ip的值传给总调度模块
            
    数据库使用redis
    1. 总ip池
    2. 每个域名的的被封ip池(有多少个域名就有多少个独立的被封池)

    (这里有个技巧,为了省去清理过期ip的逻辑,在获取新ip的时候,把一个ip设置为一个键,ip的过期时间设置为redis的key过期时间,利用redis的key过期自动清除机制实现自动清理过期ip。这样占用更多的redis key,但效率非常可观)


    基于上面的框架可以加很多功能,例如设置某一域名的单日最大使用ip数量,统计单一域名下的被封频率,某一域名对ip的使用效率,域名的费用消耗。。。等等。   

    核心就是所有的获取新IP请求都交给总调度模块处理

  • 123 4月前
    1 7
    我说一下我在用的ip池设计
    1.一个总池,这个是不断向ip代理商拉取新ip
    2.按网站划分使用的私有池,拉取总池所有ip,私有池定时更新ip可用状态,每次虫子根据id获取可用ip,并释放原先ip,一个ip只能提供一个id使用
  • 0 6
    其实就是一个性价比的问题,应该根据采集的数据量和费用作为选择一句,这种太指标化的考虑,反而让研发投入太多精力做无用功了,网站的策略会根据时间和爬虫的采集情况调整的。
  • clark1203 10月前
    0 5
    sfhfpc 我的想法是这样的: 1、得确切地知道目标网站的限速阈值 2、每次使用代理时都记录 ip 和目标网站,且每次都判断单 ip 是否达到阈值 3、啥网站都一样,只要有了阈值和事前判断,就不会出现 ip ...
    你说的,我归纳为“如何知道被ban”这个问题了,每个网站都不一样(403,假数据,没数据等等)
  • clark1203 10月前
    1 4
    总结一下,就是一个代理IP的复用:
    场景:在A网站被封,可以在他过期前,可以被另外一个爬虫进程使用,去访问B网站,充分利用资源。

    这里面有2个常见问题,可以写成一个装饰器 或者 配置中心 之类的东西:
    1、如何知道被ban:每个网站的特征是不一样的,可以存储这种规则到 代理或者配置中心
    2、一个IP的复用策略设计:数据库,取用方式等等
  • sfhfpc 10月前
    0 3
    我的想法是这样的:
    1、得确切地知道目标网站的限速阈值
    2、每次使用代理时都记录 ip 和目标网站,且每次都判断单 ip 是否达到阈值
    3、啥网站都一样,只要有了阈值和事前判断,就不会出现 ip 浪费的情况
    4、至于 ip 如何节省,得根据具体业务和需求进行规划
  • clark1203 10月前
    0 2
    论坛尽然不能二次编辑。
    第二句话,写的不通顺,我改一下:
    “我从代理服务商,取了一个时效为5分钟的IP代理,去相关网站爬取,但是在第3分钟,IP被ban”
返回