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 Util.GetConfig 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
  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. # 挨个存储 proxy,优化raw 队列的 push 速度,进而加快 check proxy 的速度
  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()