| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- # -*- 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
|