check.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. # -*- coding: utf-8 -*-
  2. """
  3. -------------------------------------------------
  4. File Name: check
  5. Description :
  6. Author : JHao
  7. date: 2019/8/6
  8. -------------------------------------------------
  9. Change Activity:
  10. 2019/08/06:
  11. -------------------------------------------------
  12. """
  13. __author__ = 'JHao'
  14. from util.six import Empty
  15. from threading import Thread
  16. from datetime import datetime
  17. from helper.proxy import Proxy
  18. from util.validators import validators
  19. from handler.logHandler import LogHandler
  20. from handler.proxyHandler import ProxyHandler
  21. from handler.configHandler import ConfigHandler
  22. def proxyCheck(proxy_obj):
  23. """
  24. 检测代理是否可用
  25. :param proxy_obj: Proxy object
  26. :return: Proxy object, status
  27. """
  28. def __proxyCheck(proxy):
  29. for func in validators:
  30. if not func(proxy):
  31. return False
  32. return True
  33. if __proxyCheck(proxy_obj.proxy):
  34. # 检测通过 更新proxy属性
  35. proxy_obj.check_count += 1
  36. proxy_obj.last_status = 1
  37. proxy_obj.last_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  38. if proxy_obj.fail_count > 0:
  39. proxy_obj.fail_count -= 1
  40. return proxy_obj
  41. else:
  42. proxy_obj.check_count += 1
  43. proxy_obj.last_status = 0
  44. proxy_obj.last_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  45. proxy_obj.fail_count += 1
  46. return proxy_obj
  47. class Checker(Thread):
  48. """
  49. 多线程检测代理是否可用
  50. """
  51. def __init__(self, check_type, queue, thread_name):
  52. Thread.__init__(self, name=thread_name)
  53. self.type = check_type
  54. self.log = LogHandler("checker")
  55. self.proxy_handler = ProxyHandler()
  56. self.queue = queue
  57. self.conf = ConfigHandler()
  58. def run(self):
  59. self.log.info("ProxyCheck - {} : start".format(self.name))
  60. while True:
  61. try:
  62. proxy_json = self.queue.get(block=False)
  63. except Empty:
  64. self.log.info("ProxyCheck - {} : complete".format(self.name))
  65. break
  66. proxy = Proxy.createFromJson(proxy_json)
  67. proxy = proxyCheck(proxy)
  68. if self.type == "raw":
  69. if proxy.last_status:
  70. if self.proxy_handler.exists(proxy):
  71. self.log.info('ProxyCheck - {} : {} exists'.format(self.name, proxy.proxy.ljust(23)))
  72. else:
  73. self.log.info('ProxyCheck - {} : {} success'.format(self.name, proxy.proxy.ljust(23)))
  74. self.proxy_handler.put(proxy)
  75. else:
  76. self.log.info('ProxyCheck - {} : {} fail'.format(self.name, proxy.proxy.ljust(23)))
  77. else:
  78. if proxy.last_status:
  79. self.log.info('ProxyCheck - {} : {} pass'.format(self.name, proxy.proxy.ljust(23)))
  80. self.proxy_handler.put(proxy)
  81. else:
  82. if proxy.fail_count > self.conf.maxFailCount:
  83. self.log.info('ProxyCheck - {} : {} fail, count {} delete'.format(self.name,
  84. proxy.proxy.ljust(23),
  85. proxy.fail_count))
  86. self.proxy_handler.delete(proxy)
  87. else:
  88. self.log.info('ProxyCheck - {} : {} fail, count {} keep'.format(self.name,
  89. proxy.proxy.ljust(23),
  90. proxy.fail_count))
  91. self.proxy_handler.put(proxy)
  92. self.queue.task_done()
  93. def runChecker(tp, queue):
  94. """
  95. run Checker
  96. :param tp: raw/use
  97. :param queue: Proxy Queue
  98. :return:
  99. """
  100. thread_list = list()
  101. for index in range(20):
  102. thread_list.append(Checker(tp, queue, "thread_%s" % str(index).zfill(2)))
  103. for thread in thread_list:
  104. thread.start()
  105. for thread in thread_list:
  106. thread.join()