
# -*- 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
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。