搭建免费高匿代理IP池# -*- encoding: utf-8 -*- """ @File : store_IP.py @Contact : t.ianxi@foxmail.com @License : // Copyright (C) 2018 Milo Yip<dell> @Modify Time @Author @Version @Desciption ------------ ------- -------- ----------- 2022/8/18 22:54 MuKe~ 1.0 None """ import redis from random import choice # ========================================================= 配置信息 ===================================================== MAX_SCORE = 100 # 权重(最高分数) MIN_SCORE = 0 # 权重(最低分数) INITIAL_SCORE = 10 # 权重(初始分数) REDIS_HOST = 'localhost' # Redis数据库地址 REDIS_PORT = 6379 # Redis数据库端口 REDIS_PASSWORD = "admin" # Redis数据库密码 REDIS_KEY = 'proxies' # Redis数据库key(相当于集合或表) # ========================================================= 初始化 ==================================================== class RedisClient(object): # 定义一个类 def __init__(self,host=REDIS_HOST,port=REDIS_PORT,password=REDIS_PASSWORD): # 定义一个初始化 """ 初始化 :param host: Redis 地址 :param port: Redis 端口 :param password: Redis 密码 """ # 实例化redis库的StrictRedis方法传入地址、端口、密码、连接redis存的数据是字符串格式 文章参考https://blog.csdn.net/weixin_30520015/article/details/95749694 self.db = redis.StrictRedis(host=host,port=port,password=password,decode_responses=True) print("[INFO] 正在访问Redis数据库") # ========================================================= 添加代理ip =================================================== def add(self,proxy,score=INITIAL_SCORE): # 定义添加函数 """ 添加代理、设置分数为最高 :param proxy: 代理 :param score: 分数 :return: 添加结果 """ # 调用db对象的zscore()方法参数:key名称、字符串内容 判断如果不存在则执行写入 if not self.db.zscore(REDIS_KEY,proxy): print(f"[INFO] 写入数据库{proxy}") # 返回 调用db对象的zscore()方法参数:key名称、写入的内容 注意:(坑)写入时要以字典方法写入字符串、{代理ip:初始化分数} return self.db.zadd(REDIS_KEY,{proxy:score}) # ========================================================= 获取随机代理ip =============================================== def random(self): # 定义随机函数 """ 随机获取有效代理,首先尝试获取最高分数代理,如果最高分数不存在,则按照排名获取,否则异常 :return: 随机代理 """ # 调用db对象的zrangebyscore()方法查询符合分数范围的值(代理ip) 参数:key、最大分数(100)、最大分数(100) result = self.db.zrangebyscore(REDIS_KEY,MAX_SCORE,MAX_SCORE) if len(result): # 统计返回值数量 条件不为空执行 return choice(result) # 返回Redis数据库符合最大值100条件的代理ip else: # 不满足最大值100条件 条件为空执行 # 调用db对象的zrevrange()方法 一次从最高值查询到最低 参数:key、最小值、最大分数 result = self.db.zrevrange(REDIS_KEY,0,100) if len(result): # 统计返回值数量 条件不为空执行 return choice(result) else: raise PoolEmptyError # 如果没有则返回异常 raise函数条件异常 # =========================================================== 打分机制 =================================================== def decrease(self,proxy): # 检测函数 参数:代理ip """ 代理值减一分,分数小于最小值,则代理删除 :param proxy: 代理 :return: 修改后的代理分数 """ score = self.db.zscore(REDIS_KEY,proxy) # 调用db对象的zscore()方法获取代理ip 参数:key、代理ip if score and score > MIN_SCORE: # 判断 获取到的值(权重分数) 大于 最低分数,则执行 print('[INFO] 代理',proxy,'当前分数',score,'减1') return self.db.zincrby(REDIS_KEY,-1,proxy) # 返回 调用db对象的zincrby()方法 写入修改后的值 注意:(坑)参数key、运算符、代理ip(键) else: # 判断 获取到的值(权重分数) 小于 最低分数,则执行 print('[INFO] 代理',proxy,'当前分数',score,'移除') return self.db.zrem(REDIS_KEY,proxy) # 调用db对象的zrem()方法删除数据 参数key、代理ip(键) # ============================================================ 验证 ===================================================== def exists(self,proxy): # 定义查询函数 """ 判断是否存在 :param proxy:代理 :return: 是否存在 """ # 向函数外部返回 Redis数据库获取到的值 调用db对象的zscore()方法获取值 若不等于空则,为Tuer/Fake not转换真假 return not self.db.zscore(REDIS_KEY,proxy) == None # ========================================================= 修改最权重(大分数) ============================================ def max(self,proxy): # 定义最大函数 参数:代理ip """ 将代理设置为MAX_SCORE :param proxy: 代理 :return: 设置结果 """ print('[INFO] 代理',proxy,'可用,设置为',MAX_SCORE) # 返回 调用db对象的zscore()方法参数:key名称、写入的内容 注意:(坑)写入时要以字典方法写入字符串、{代理ip:初始化分数} return self.db.zadd(REDIS_KEY,{proxy:MAX_SCORE}) # ========================================================= 获取数据库代理ip总数量 ========================================= def count(self): # 定义统计函数 """ 获取数量 :return: 数量 """ return self.db.zcard(REDIS_KEY) # 调用db对象的zcard()方法查询key(集合或表)中共有多少数据条 # ========================================================= 获取数据库全部代理ip ========================================== def all(self): # 定义查询全部代理ip函数 """ 获取全部代理 :return:全部代理列表 """ return self.db.zrangebyscore(REDIS_KEY,MIN_SCORE,MAX_SCORE) # 返回 调用db对象的zrangebyscore()方法查询'proxies' 键中从最小权重到最大权重的代理ip
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。