1. 程式人生 > >代理池的維護(一)

代理池的維護(一)

不同 resp pass print exc 移除 exce Coding flask

介紹代理池的維護

一、準備工作

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

代理池的維護(一)