介绍代理池的维护
一、准备工作
安装redis数据库并启动服务,另外还需安装atihttp,requests, redis-py,pyquery,flask
二、代理池的架构
分为4个模块:存储模块,获取模块,检测模块,借口模块、
1、存储模块:使用Redis的有序集合,用来做代理的去重和状态标识,同时也是中心模块和基础模块,将其他模块串联起来
2、获取模块:定时从代理网站获取代理,将获取的代理传递给存储模块,并保存到数据库
3、检测模块:定时通过存储模块获取所有代理,对代理进行检测,根据不同的检测结果对代理设置不同的标识
4、接口模块:通过Web API 提供接口服务,连接数据库通过Web形式返回可用的代理
下面是存储模块的代码
1 # -*- coding: utf-8 -*- 2 from random import choice 3 4 import redis 5 6 MAX_SCORE = 100 7 MIN_SCORE = 0 8 INITIAL_SCORE = 10 9 REDIS_HOST = ‘localhost‘ 10 REDIS_PORT = 6379 11 REDIS_PASSWORD = None 12 REDIS_KEY = ‘proxies‘ 13 14 15 class RedisClient(object): 16 def __init__(self, host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD): 17 """ 18 初始化 19 :param host:Redis地址 20 :param port: Redis端口 21 :param password: Redis密码 22 """ 23 self.db = redis.StrictRedis(host=host, port=port, password=password, decode_responses=True) 24 25 def add(self, proxy, score=INITIAL_SCORE): 26 """ 27 添加代理,设置分数为最高 28 :param proxy: 代理 29 :param score: 分数 30 :return: 添加结果 31 """ 32 if not self.db.zscore(REDIS_KEY, proxy): 33 return self.db.zadd(REDIS_KEY, score, proxy) 34 35 def random(self): 36 """ 37 随机获取有效代理,首先尝试获取最高分数代理,如果最高分数不存在,则按照排名获取,否则异常 38 :return: 随机代理 39 """ 40 result = self.db.zrangebyscore(REDIS_KEY, MAX_SCORE, MIN_SCORE) 41 if result: 42 return choice(result) 43 else: 44 result = self.db.zrevrange(REDIS_KEY, 0, 100) 45 if result: 46 return choice(result) 47 else: 48 raise Exception 49 50 def decrease(self, proxy): 51 """ 52 代理值减一分, 分数小于最小值,则代理删除 53 :param proxy:代理 54 :return: 修改后的代理分数 55 """ 56 score = self.db.zscore(REDIS_KEY, proxy) 57 if score and score > MIN_SCORE: 58 print(‘代理‘, proxy, ‘当前分数‘, score, ‘减1‘) 59 return self.db.zincrby(REDIS_KEY, proxy, -1) 60 else: 61 print(‘代理‘, proxy, ‘当前分数‘, score, ‘移除‘) 62 self.db.zrem(REDIS_KEY, proxy) 63 64 def exists(self, proxy): 65 """ 66 判断代理是否存在 67 :param proxy:代理 68 :return: 是否存在 69 """ 70 return not self.db.zscore(REDIS_KEY, proxy) == None 71 72 def max(self, proxy): 73 """ 74 将代理设置为MAX_SCORE 75 :param proxy: 代理 76 :return: 设置结果 77 """ 78 print(‘代理‘, proxy, ‘可用, 设置为‘, MAX_SCORE) 79 return self.db.zadd(REDIS_KEY, MAX_SCORE, proxy) 80 81 def count(self): 82 """ 83 获取数量 84 :return:数量 85 """ 86 return self.db.zcard(REDIS_KEY) 87 88 def all(self): 89 """ 90 获取全部代理 91 :return: 全部代理列表 92 """ 93 return self.db.zrangebyscore(REDIS_KEY, MIN_SCORE, MAX_SCORE)
原文地址:https://www.cnblogs.com/yzet/p/9452422.html
时间: 2024-11-06 07:19:15