ProxyRefreshSchedule.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. -------------------------------------------------
  5. File Name: ProxyRefreshSchedule.py
  6. Description : 代理定时刷新
  7. Author : JHao
  8. date: 2016/12/4
  9. -------------------------------------------------
  10. Change Activity:
  11. 2016/12/4: 代理定时刷新
  12. 2017/03/06: 使用LogHandler添加日志
  13. -------------------------------------------------
  14. """
  15. import sys
  16. import time
  17. import requests
  18. from multiprocessing import Process
  19. from apscheduler.schedulers.blocking import BlockingScheduler
  20. sys.path.append('../')
  21. from Manager.ProxyManager import ProxyManager
  22. from Util.LogHandler import LogHandler
  23. __author__ = 'JHao'
  24. class ProxyRefreshSchedule(ProxyManager):
  25. """
  26. 代理定时刷新
  27. """
  28. def __init__(self):
  29. ProxyManager.__init__(self)
  30. self.log = LogHandler('refresh_schedule')
  31. def valid_proxy(self):
  32. """
  33. valid_proxy
  34. :return:
  35. """
  36. self.db.changeTable(self.raw_proxy_queue)
  37. raw_proxy = self.db.pop()
  38. self.log.info('%s start valid proxy' % time.ctime())
  39. while raw_proxy:
  40. proxies = {"http": "http://{proxy}".format(proxy=raw_proxy),
  41. "https": "https://{proxy}".format(proxy=raw_proxy)}
  42. try:
  43. # 超过30秒的代理就不要了
  44. r = requests.get('https://www.baidu.com/', proxies=proxies, timeout=30, verify=False)
  45. if r.status_code == 200:
  46. self.db.changeTable(self.useful_proxy_queue)
  47. self.db.put(raw_proxy)
  48. self.log.debug('proxy: %s validation passes' % raw_proxy)
  49. except Exception, e:
  50. self.log.debug('proxy: %s validation fail' % raw_proxy)
  51. pass
  52. self.db.changeTable(self.raw_proxy_queue)
  53. raw_proxy = self.db.pop()
  54. self.log.info('%s valid proxy complete' % time.ctime())
  55. def refresh_pool():
  56. pp = ProxyRefreshSchedule()
  57. pp.valid_proxy()
  58. def main(process_num=10):
  59. p = ProxyRefreshSchedule()
  60. p.refresh()
  61. pl = []
  62. for num in range(process_num):
  63. proc = Process(target=refresh_pool, args=())
  64. pl.append(proc)
  65. for num in range(process_num):
  66. pl[num].start()
  67. for num in range(process_num):
  68. pl[num].join()
  69. if __name__ == '__main__':
  70. main()
  71. sched = BlockingScheduler()
  72. sched.add_job(main, 'interval', minutes=10)
  73. sched.start()