代理池的维护(一)

介绍代理池的维护

一、准备工作

安装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)

猜你喜欢

转载自www.cnblogs.com/yzet/p/9452422.html