3
0

scheduler.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import threading
  2. import time
  3. import requests
  4. from commons.Logger import get_spider_logger
  5. import threading
  6. logger = get_spider_logger('scheduler')
  7. class CrawlerScheduler:
  8. """爬虫任务调度器"""
  9. def __init__(self, DEVICE_ID, platform, heartbeat_interval=60):
  10. """
  11. 初始化调度器
  12. Args:
  13. platform: 平台名称
  14. heartbeat_url: 心跳上报URL
  15. heartbeat_interval: 心跳间隔时间(秒)
  16. """
  17. self.username = DEVICE_ID
  18. self.platform = platform
  19. self._lock = threading.Lock()
  20. self.heartbeat_url = 'http://192.168.2.246:8080/api/collect_task/heartbeat'
  21. self.heartbeat_interval = heartbeat_interval
  22. self.end = False
  23. self.heartbeat_thread = None
  24. def _heartbeat_reporter(self):
  25. """守护线程:只负责上报心跳"""
  26. headers = {'X-Crawler-Token': 'zhijiayun_crawler_2026'}
  27. while True:
  28. try:
  29. response = requests.post(
  30. self.heartbeat_url,
  31. json={
  32. "platform": self.platform,
  33. "username": self.username
  34. },
  35. headers=headers,
  36. timeout=3
  37. )
  38. print(f"[心跳] 发送成功: {response.status_code}")
  39. print(response.json())
  40. if response.json().get('code') != 'success':
  41. logger.error(f'心跳回传:{response.json()}')
  42. self.set_flag(True)
  43. # 写日志
  44. break
  45. logger.info(f'心跳回传:{response.json()}')
  46. self.set_flag(False)
  47. time.sleep(self.heartbeat_interval)
  48. except Exception as e:
  49. print(e)
  50. logger.error(e)
  51. time.sleep(5)
  52. def start(self):
  53. """启动调度器"""
  54. self.set_flag(False)
  55. self.heartbeat_thread = threading.Thread(
  56. target=self._heartbeat_reporter,
  57. daemon=True
  58. )
  59. self.heartbeat_thread.start()
  60. def stop(self):
  61. """停止调度器"""
  62. self.set_flag(True)
  63. logger.info('心跳停止')
  64. def get_task(self):
  65. try:
  66. task_api = "http://192.168.2.246:8080/api/collect_task/pull"
  67. headers = {'X-Crawler-Token': 'zhijiayun_crawler_2026'}
  68. params = {
  69. 'platform': self.platform,
  70. 'username': self.username
  71. }
  72. response = requests.get(task_api, params=params, headers=headers, timeout=5)
  73. result = response.json()
  74. logger.info(f'拉取任务:{result}')
  75. if result.get('code') == 'success':
  76. return result.get('data').get('task')
  77. print('拉取任务返回', result)
  78. except Exception as e:
  79. logger.error('获取任务报错', e)
  80. def post_report(self, data):
  81. try:
  82. url = "http://192.168.2.246:8080/api/collect_task/report"
  83. print('传给返回接口的数据', data)
  84. logger.info(f'report上传数据:{data}')
  85. headers = {'X-Crawler-Token': 'zhijiayun_crawler_2026'}
  86. response = requests.post(url, json=data, headers=headers, timeout=5)
  87. # 记录日志
  88. result = response.json()
  89. logger.info(result)
  90. if (result.get('code') != 'success'):
  91. logger.error(f'翻页回传结果不成功:{result}')
  92. self.stop()
  93. # 用守护线程 直接杀死该进程
  94. print(f'任务进度上传 {result}')
  95. except Exception as e:
  96. logger.error(e)
  97. def set_flag(self, value):
  98. with self._lock:
  99. self.end = value