代理池的維護(一)
阿新 • • 發佈:2018-08-10
不同 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)
代理池的維護(一)