前言:
权重代理池是之前工作为采集亚马逊而开发,这个模块以后应该用不上了,但也是花了一些心力开发的,故写下这篇博客,一来纪念,二来分享,栽树方便于后人
应用场景:
将大量代理IP(10到80个)分发到多线程(100到500),尽可能保证IP被均匀分布,并且能及时清理无用代理IP,因为线程数大于ip数,故不能用队列。
要求环境:
本地或内网Redis、Python
设计逻辑:
分两个模块:定时模块与接口模块
1、接口模块:
获取接口(get_proxy):调用接口从redis数据中获取一个ip,获取时会加锁(故需要本地或内网Redis)防止一个ip同时被多个线程获取,ip被获取后该ip权重值加一。ip获取为概率获取,非随机获取,权重值越低被获取概率越大(参考y=1/x反比例函数图)
异常接口(send_error):接收一个异常IP和异常类型(需从程序中主动调用该接口,如请求无响应、出现robot界面时),程序会根据异常类型增加该IP权重值(默认为“other”,即增加50权重值)
2、定时模块:
定时拉取代理ip,存入redis,并清除权重超过阈值和超时的ip,一个代理池会存两张表:权重表(proxy_pool_001)和时间表(proxy_pool_act_001),由“redis有序集合”实现自动排序。为防止新ip因权重过低被大量获取,故新ip初始权重为redis中权重最低ip的权重,下限200(可自行调整)。
运行截图:
代码部分
(整理好的简单可以跑的的demo,如需应用到线上环境自行阅读修改代码):
定时模块
import time
import redis
import requests
import traceback
from loguru import logger
poxys_dic = [
{"name": "代理池01",
"url": "xxxxxxxxxxxxxxxxxx",
"pool_name": "proxy_pool_001",
"pool_act_name": "proxy_pool_act_001"},
{"name": "代理池02",
"url": "