panini_control_price.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. # -*- coding: utf-8 -*-
  2. # Author : Charley
  3. # Python : 3.10.8
  4. # Date : 2025/2/12 13:16
  5. import time
  6. import datetime
  7. from loguru import logger
  8. from CloudflareBypasser import CloudflareBypasser
  9. from DrissionPage import ChromiumPage, ChromiumOptions
  10. from tenacity import retry, stop_after_attempt, wait_fixed
  11. logger.remove()
  12. logger.add("./logs/{time:YYYYMMDD}.log", encoding='utf-8', rotation="00:00",
  13. format="[{time:YYYY-MM-DD HH:mm:ss.SSS}] {level} {message}",
  14. level="DEBUG", retention="7 day")
  15. def after_log(retry_state):
  16. """
  17. retry 回调
  18. :param retry_state: RetryCallState 对象
  19. """
  20. # 检查 args 是否存在且不为空
  21. if retry_state.args and len(retry_state.args) > 0:
  22. log = retry_state.args[0] # 获取传入的 logger
  23. else:
  24. log = logger # 使用全局 logger
  25. if retry_state.outcome.failed:
  26. log.warning(
  27. f"Function '{retry_state.fn.__name__}', Attempt {retry_state.attempt_number} Times")
  28. else:
  29. log.info(f"Function '{retry_state.fn.__name__}', Attempt {retry_state.attempt_number} succeeded")
  30. def get_screen_shot(log, page, end_time):
  31. """
  32. 每分钟刷新页面并截图
  33. :param log:
  34. :param page:
  35. :param end_time:
  36. """
  37. log.info("开始截图....................")
  38. while datetime.datetime.now() < end_time:
  39. page.refresh()
  40. page.wait.load_start() # 等待页面进入加载状态
  41. page.wait.eles_loaded('.card-body') # 等待 class 为 div1 的元素加载
  42. time.sleep(3)
  43. page.wait.load_start() # 等待页面进入加载状态
  44. path = "./panini_screenshot_images"
  45. current_time = datetime.datetime.now()
  46. screenshot_filename = current_time.strftime("%Y%m%d%H%M%S") + ".jpg"
  47. # full_page参数 为True截取的是整页截图, 为False截取可视窗口 默认为False
  48. # page.get_screenshot(path, name=screenshot_filename, full_page=True)
  49. page.get_screenshot(path, name=screenshot_filename)
  50. log.info(f"已保存截图: {screenshot_filename}")
  51. time.sleep(60) # 每隔1分钟刷新一次
  52. def get_screen_cast(log, tab, end_time):
  53. """
  54. 每分钟刷新页面并录制视频
  55. :param log:
  56. :param tab:
  57. :param end_time:
  58. """
  59. tab.screencast.set_save_path('video') # 设置视频存放路径
  60. tab.screencast.set_mode.video_mode() # 设置录制模式
  61. tab.screencast.start() # 开始录制
  62. try:
  63. while datetime.datetime.now() < end_time:
  64. tab.refresh()
  65. tab.wait.load_start() # 等待页面进入加载状态
  66. current_time = datetime.datetime.now()
  67. screenshot_filename = current_time.strftime("%Y%m%d%H%M%S") + ".jpg"
  68. tab.get_screenshot('./panini_screenshot_video', name=screenshot_filename)
  69. log.info(f"已保存截图: {screenshot_filename}")
  70. time.sleep(60) # 每隔1分钟刷新一次
  71. except Exception as e:
  72. log.error(f"录制过程中发生错误: {e}")
  73. finally:
  74. tab.screencast.stop() # 停止录制
  75. @retry(stop=stop_after_attempt(2), wait=wait_fixed(1), after=after_log)
  76. def panini_control_price(log):
  77. log.info("开始请求页面....................")
  78. options = ChromiumOptions().set_paths(local_port=9103,
  79. user_data_path=r'D:\Drissionpage_temp\panini_control_price_port_9103')
  80. options.set_argument("--disable-gpu")
  81. options.set_argument("-accept-lang=en-US")
  82. page = ChromiumPage(options)
  83. page.set.window.full()
  84. try:
  85. url = "https://www.paniniamerica.net/2024-25-select-basketball-white-sparkle-pack-3-cards-per-pack-on-average-look-for-randomly-inserted-1-1-autographs.html"
  86. page.get(url, timeout=20)
  87. # page_title = page.title.lower()
  88. # print(page_title)
  89. # if "just a moment" in page_title:
  90. # cf_bypasser = CloudflareBypasser(page, max_retries=5, log=log)
  91. # cf_bypasser.bypass()
  92. # page.wait.load_start() # 等待页面进入加载状态
  93. # else:
  94. # logger.info("无需绕过")
  95. # 设置开始时间和结束时间
  96. # start_time = datetime.datetime.strptime("2025-02-12 23:55:00", "%Y-%m-%d %H:%M:%S")
  97. start_time = datetime.datetime.strptime("2025-07-21 23:55:50", "%Y-%m-%d %H:%M:%S")
  98. end_time = start_time + datetime.timedelta(hours=2.5)
  99. # 等待到开始时间
  100. while datetime.datetime.now() < start_time:
  101. time.sleep(1)
  102. get_screen_shot(log, page, end_time)
  103. except Exception as e:
  104. log.error(f"操作失败: {e}")
  105. finally:
  106. log.info("结束请求页面....................")
  107. page.close()
  108. page.quit()
  109. if __name__ == '__main__':
  110. panini_control_price(logger)
  111. # http://grafana.ipangyou.com/explore?panes=%7B%220xD%22:%7B%22datasource%22:%22e0f7c4fb-4dc6-4665-9d15-2c5faa0f4fc2%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22expr%22:%22%7Bapplication%3D%5C%22ins-python%5C%22%7D%22,%22queryType%22:%22range%22,%22datasource%22:%7B%22type%22:%22loki%22,%22uid%22:%22e0f7c4fb-4dc6-4665-9d15-2c5faa0f4fc2%22%7D,%22editorMode%22:%22builder%22,%22legendFormat%22:%22%22%7D%5D,%22range%22:%7B%22from%22:%22now-2d%22,%22to%22:%22now%22%7D%7D%7D&schemaVersion=1&orgId=1