ProxyManager.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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 Util.GetConfig import GetConfig
  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.config = GetConfig()
  29. self.raw_proxy_queue = 'raw_proxy'
  30. self.log = LogHandler('proxy_manager')
  31. self.useful_proxy_queue = 'useful_proxy'
  32. def refresh(self):
  33. """
  34. fetch proxy into Db by ProxyGetter
  35. :return:
  36. """
  37. for proxyGetter in self.config.proxy_getter_functions:
  38. # fetch
  39. proxy_set = set()
  40. try:
  41. self.log.info("{func}: fetch proxy start".format(func=proxyGetter))
  42. proxy_iter = [_ for _ in getattr(GetFreeProxy, proxyGetter.strip())()]
  43. except Exception as e:
  44. self.log.error("{func}: fetch proxy fail".format(func=proxyGetter))
  45. continue
  46. for proxy in proxy_iter:
  47. proxy = proxy.strip()
  48. if proxy and verifyProxyFormat(proxy):
  49. self.log.info('{func}: fetch proxy {proxy}'.format(func=proxyGetter, proxy=proxy))
  50. proxy_set.add(proxy)
  51. else:
  52. self.log.error('{func}: fetch proxy {proxy} error'.format(func=proxyGetter, proxy=proxy))
  53. # store
  54. for proxy in proxy_set:
  55. self.db.changeTable(self.useful_proxy_queue)
  56. if self.db.exists(proxy):
  57. continue
  58. self.db.changeTable(self.raw_proxy_queue)
  59. self.db.put(proxy)
  60. def get(self):
  61. """
  62. return a useful proxy
  63. :return:
  64. """
  65. self.db.changeTable(self.useful_proxy_queue)
  66. item_dict = self.db.getAll()
  67. if item_dict:
  68. if EnvUtil.PY3:
  69. return random.choice(list(item_dict.keys()))
  70. else:
  71. return random.choice(item_dict.keys())
  72. return None
  73. # return self.db.pop()
  74. def delete(self, proxy):
  75. """
  76. delete proxy from pool
  77. :param proxy:
  78. :return:
  79. """
  80. self.db.changeTable(self.useful_proxy_queue)
  81. self.db.delete(proxy)
  82. def getAll(self):
  83. """
  84. get all proxy from pool as list
  85. :return:
  86. """
  87. self.db.changeTable(self.useful_proxy_queue)
  88. item_dict = self.db.getAll()
  89. if EnvUtil.PY3:
  90. return list(item_dict.keys()) if item_dict else list()
  91. return item_dict.keys() if item_dict else list()
  92. def getNumber(self):
  93. self.db.changeTable(self.raw_proxy_queue)
  94. total_raw_proxy = self.db.getNumber()
  95. self.db.changeTable(self.useful_proxy_queue)
  96. total_useful_queue = self.db.getNumber()
  97. return {'raw_proxy': total_raw_proxy, 'useful_proxy': total_useful_queue}
  98. if __name__ == '__main__':
  99. pp = ProxyManager()
  100. pp.refresh()