ProxyManager.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 ProxyGetter.getFreeProxy import GetFreeProxy
  21. class ProxyManager(object):
  22. """
  23. ProxyManager
  24. """
  25. def __init__(self):
  26. self.db = DbClient()
  27. self.config = GetConfig()
  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
  34. :return:
  35. """
  36. for proxyGetter in self.config.proxy_getter_functions:
  37. proxy_set = set()
  38. # fetch raw proxy
  39. for proxy in getattr(GetFreeProxy, proxyGetter.strip())():
  40. if proxy:
  41. self.log.info('{func}: fetch proxy {proxy}'.format(func=proxyGetter, proxy=proxy))
  42. proxy_set.add(proxy.strip())
  43. # store raw proxy
  44. for proxy in proxy_set:
  45. self.db.changeTable(self.useful_proxy_queue)
  46. if self.db.exists(proxy):
  47. continue
  48. self.db.changeTable(self.raw_proxy_queue)
  49. self.db.put(proxy)
  50. def get(self):
  51. """
  52. return a useful proxy
  53. :return:
  54. """
  55. self.db.changeTable(self.useful_proxy_queue)
  56. item_dict = self.db.getAll()
  57. if item_dict:
  58. if EnvUtil.PY3:
  59. return random.choice(list(item_dict.keys()))
  60. else:
  61. return random.choice(item_dict.keys())
  62. return None
  63. # return self.db.pop()
  64. def delete(self, proxy):
  65. """
  66. delete proxy from pool
  67. :param proxy:
  68. :return:
  69. """
  70. self.db.changeTable(self.useful_proxy_queue)
  71. self.db.delete(proxy)
  72. def getAll(self):
  73. """
  74. get all proxy from pool as list
  75. :return:
  76. """
  77. self.db.changeTable(self.useful_proxy_queue)
  78. item_dict = self.db.getAll()
  79. if EnvUtil.PY3:
  80. return list(item_dict.keys()) if item_dict else list()
  81. return item_dict.keys() if item_dict else list()
  82. def getNumber(self):
  83. self.db.changeTable(self.raw_proxy_queue)
  84. total_raw_proxy = self.db.getNumber()
  85. self.db.changeTable(self.useful_proxy_queue)
  86. total_useful_queue = self.db.getNumber()
  87. return {'raw_proxy': total_raw_proxy, 'useful_proxy': total_useful_queue}
  88. if __name__ == '__main__':
  89. pp = ProxyManager()
  90. pp.refresh()