ProxyManager.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. -------------------------------------------------
  5. File Name: ProxyManager.py
  6. Description :
  7. Author : JHao
  8. date: 2016/12/3
  9. -------------------------------------------------
  10. Change Activity:
  11. 2016/12/3:
  12. -------------------------------------------------
  13. """
  14. __author__ = 'JHao'
  15. import random
  16. from Util import EnvUtil
  17. from DB.DbClient import DbClient
  18. from Config.ConfigGetter import config
  19. from Util.LogHandler import LogHandler
  20. from Util.utilFunction import verifyProxyFormat
  21. from ProxyGetter.getFreeProxy import GetFreeProxy
  22. class ProxyManager(object):
  23. """
  24. ProxyManager
  25. """
  26. def __init__(self):
  27. self.db = DbClient()
  28. self.raw_proxy_queue = 'raw_proxy'
  29. self.log = LogHandler('proxy_manager')
  30. self.useful_proxy_queue = 'useful_proxy'
  31. def refresh(self):
  32. """
  33. fetch proxy into Db by ProxyGetter/getFreeProxy.py
  34. :return:
  35. """
  36. self.db.changeTable(self.raw_proxy_queue)
  37. for proxyGetter in config.proxy_getter_functions:
  38. # fetch
  39. try:
  40. self.log.info("{func}: fetch proxy start".format(func=proxyGetter))
  41. for proxy in getattr(GetFreeProxy, proxyGetter.strip())():
  42. # 直接存储代理, 不用在代码中排重, hash 结构本身具有排重功能
  43. proxy = proxy.strip()
  44. if proxy and verifyProxyFormat(proxy):
  45. self.log.info('{func}: fetch proxy {proxy}'.format(func=proxyGetter, proxy=proxy))
  46. self.db.put(proxy)
  47. else:
  48. self.log.error('{func}: fetch proxy {proxy} error'.format(func=proxyGetter, proxy=proxy))
  49. except Exception as e:
  50. self.log.error("{func}: fetch proxy fail".format(func=proxyGetter))
  51. continue
  52. def get(self):
  53. """
  54. return a useful proxy
  55. :return:
  56. """
  57. self.db.changeTable(self.useful_proxy_queue)
  58. item_dict = self.db.getAll()
  59. if item_dict:
  60. if EnvUtil.PY3:
  61. return random.choice(list(item_dict.keys()))
  62. else:
  63. return random.choice(item_dict.keys())
  64. return None
  65. # return self.db.pop()
  66. def delete(self, proxy):
  67. """
  68. delete proxy from pool
  69. :param proxy:
  70. :return:
  71. """
  72. self.db.changeTable(self.useful_proxy_queue)
  73. self.db.delete(proxy)
  74. def getAll(self):
  75. """
  76. get all proxy from pool as list
  77. :return:
  78. """
  79. self.db.changeTable(self.useful_proxy_queue)
  80. item_dict = self.db.getAll()
  81. if EnvUtil.PY3:
  82. return list(item_dict.keys()) if item_dict else list()
  83. return item_dict.keys() if item_dict else list()
  84. def getNumber(self):
  85. self.db.changeTable(self.raw_proxy_queue)
  86. total_raw_proxy = self.db.getNumber()
  87. self.db.changeTable(self.useful_proxy_queue)
  88. total_useful_queue = self.db.getNumber()
  89. return {'raw_proxy': total_raw_proxy, 'useful_proxy': total_useful_queue}
  90. if __name__ == '__main__':
  91. pp = ProxyManager()
  92. pp.refresh()