| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- """
- -------------------------------------------------
- File Name: ProxyManager.py
- Description :
- Author : JHao
- date: 2016/12/3
- -------------------------------------------------
- Change Activity:
- 2016/12/3:
- -------------------------------------------------
- """
- __author__ = 'JHao'
- import random
- from Util import EnvUtil
- from DB.DbClient import DbClient
- from Util.GetConfig import config
- from Util.LogHandler import LogHandler
- from Util.utilFunction import verifyProxyFormat
- from ProxyGetter.getFreeProxy import GetFreeProxy
- class ProxyManager(object):
- """
- ProxyManager
- """
- def __init__(self):
- self.db = DbClient()
- self.raw_proxy_queue = 'raw_proxy'
- self.log = LogHandler('proxy_manager')
- self.useful_proxy_queue = 'useful_proxy'
- def refresh(self):
- """
- fetch proxy into Db by ProxyGetter
- :return:
- """
- self.db.changeTable(self.raw_proxy_queue)
- for proxyGetter in config.proxy_getter_functions:
- # fetch
- try:
- self.log.info("{func}: fetch proxy start".format(func=proxyGetter))
- for proxy in getattr(GetFreeProxy, proxyGetter.strip())():
- # 挨个存储 proxy,优化raw 队列的 push 速度,进而加快 check proxy 的速度
- proxy = proxy.strip()
- if proxy and verifyProxyFormat(proxy):
- self.log.info('{func}: fetch proxy {proxy}'.format(func=proxyGetter, proxy=proxy))
- self.db.put(proxy)
- else:
- self.log.error('{func}: fetch proxy {proxy} error'.format(func=proxyGetter, proxy=proxy))
- except Exception as e:
- self.log.error("{func}: fetch proxy fail".format(func=proxyGetter))
- continue
- def get(self):
- """
- return a useful proxy
- :return:
- """
- self.db.changeTable(self.useful_proxy_queue)
- item_dict = self.db.getAll()
- if item_dict:
- if EnvUtil.PY3:
- return random.choice(list(item_dict.keys()))
- else:
- return random.choice(item_dict.keys())
- return None
- # return self.db.pop()
- def delete(self, proxy):
- """
- delete proxy from pool
- :param proxy:
- :return:
- """
- self.db.changeTable(self.useful_proxy_queue)
- self.db.delete(proxy)
- def getAll(self):
- """
- get all proxy from pool as list
- :return:
- """
- self.db.changeTable(self.useful_proxy_queue)
- item_dict = self.db.getAll()
- if EnvUtil.PY3:
- return list(item_dict.keys()) if item_dict else list()
- return item_dict.keys() if item_dict else list()
- def getNumber(self):
- self.db.changeTable(self.raw_proxy_queue)
- total_raw_proxy = self.db.getNumber()
- self.db.changeTable(self.useful_proxy_queue)
- total_useful_queue = self.db.getNumber()
- return {'raw_proxy': total_raw_proxy, 'useful_proxy': total_useful_queue}
- if __name__ == '__main__':
- pp = ProxyManager()
- pp.refresh()
|