# -*- coding: utf-8 -*- # Author : Charley # Python : 3.10.8 # Date : 2025/2/12 13:16 import time import datetime from loguru import logger from CloudflareBypasser import CloudflareBypasser from DrissionPage import ChromiumPage, ChromiumOptions from tenacity import retry, stop_after_attempt, wait_fixed logger.remove() logger.add("./logs/{time:YYYYMMDD}.log", encoding='utf-8', rotation="00:00", format="[{time:YYYY-MM-DD HH:mm:ss.SSS}] {level} {message}", level="DEBUG", retention="7 day") def after_log(retry_state): """ retry 回调 :param retry_state: RetryCallState 对象 """ # 检查 args 是否存在且不为空 if retry_state.args and len(retry_state.args) > 0: log = retry_state.args[0] # 获取传入的 logger else: log = logger # 使用全局 logger if retry_state.outcome.failed: log.warning( f"Function '{retry_state.fn.__name__}', Attempt {retry_state.attempt_number} Times") else: log.info(f"Function '{retry_state.fn.__name__}', Attempt {retry_state.attempt_number} succeeded") def get_screen_shot(log, page, end_time): """ 每分钟刷新页面并截图 :param log: :param page: :param end_time: """ log.info("开始截图....................") while datetime.datetime.now() < end_time: page.refresh() page.wait.load_start() # 等待页面进入加载状态 page.wait.eles_loaded('.card-body') # 等待 class 为 div1 的元素加载 time.sleep(3) page.wait.load_start() # 等待页面进入加载状态 path = "./panini_screenshot_images" current_time = datetime.datetime.now() screenshot_filename = current_time.strftime("%Y%m%d%H%M%S") + ".jpg" # full_page参数 为True截取的是整页截图, 为False截取可视窗口 默认为False # page.get_screenshot(path, name=screenshot_filename, full_page=True) page.get_screenshot(path, name=screenshot_filename) log.info(f"已保存截图: {screenshot_filename}") time.sleep(60) # 每隔1分钟刷新一次 def get_screen_cast(log, tab, end_time): """ 每分钟刷新页面并录制视频 :param log: :param tab: :param end_time: """ tab.screencast.set_save_path('video') # 设置视频存放路径 tab.screencast.set_mode.video_mode() # 设置录制模式 tab.screencast.start() # 开始录制 try: while datetime.datetime.now() < end_time: tab.refresh() tab.wait.load_start() # 等待页面进入加载状态 current_time = datetime.datetime.now() screenshot_filename = current_time.strftime("%Y%m%d%H%M%S") + ".jpg" tab.get_screenshot('./panini_screenshot_video', name=screenshot_filename) log.info(f"已保存截图: {screenshot_filename}") time.sleep(60) # 每隔1分钟刷新一次 except Exception as e: log.error(f"录制过程中发生错误: {e}") finally: tab.screencast.stop() # 停止录制 @retry(stop=stop_after_attempt(2), wait=wait_fixed(1), after=after_log) def panini_control_price(log): log.info("开始请求页面....................") options = ChromiumOptions().set_paths(local_port=9103, user_data_path=r'D:\Drissionpage_temp\panini_control_price_port_9103') options.set_argument("--disable-gpu") options.set_argument("-accept-lang=en-US") page = ChromiumPage(options) page.set.window.full() try: 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" page.get(url, timeout=20) # page_title = page.title.lower() # print(page_title) # if "just a moment" in page_title: # cf_bypasser = CloudflareBypasser(page, max_retries=5, log=log) # cf_bypasser.bypass() # page.wait.load_start() # 等待页面进入加载状态 # else: # logger.info("无需绕过") # 设置开始时间和结束时间 # start_time = datetime.datetime.strptime("2025-02-12 23:55:00", "%Y-%m-%d %H:%M:%S") start_time = datetime.datetime.strptime("2025-07-21 23:55:50", "%Y-%m-%d %H:%M:%S") end_time = start_time + datetime.timedelta(hours=2.5) # 等待到开始时间 while datetime.datetime.now() < start_time: time.sleep(1) get_screen_shot(log, page, end_time) except Exception as e: log.error(f"操作失败: {e}") finally: log.info("结束请求页面....................") page.close() page.quit() if __name__ == '__main__': panini_control_price(logger) # 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