# -*- coding: utf-8 -*- # Author : Charley # Python : 3.12.10 # Date : 2026/08/04 """得卡 DECA 已售流程——每日新增增量采集(常驻定时)。 完整管道,增量模式(每商家历史成交连续无新页即早停,只采新成交): 商家列表 → 每商家已售(增量) → 详情补抓 → 卡密清单 → 拆卡报告 + 视频回放。 拆卡报告/回放靠 report_state/replay_state 驱动,拿不到(还没生成)下轮重采。 从根目录运行:python sold_daily_spider.py(每天 03:00 一次) """ import sys import time import schedule from loguru import logger from tenacity import retry, stop_after_attempt, wait_fixed from mysql_pool import MySQLConnectionPool import deca_sold_core as core logger.remove() logger.add("./logs/sold_daily_{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") @retry(stop=stop_after_attempt(100), wait=wait_fixed(3600), after=core.after_log) def main_task(log): """已售每日增量采集(连续无新页早停,incremental=True)。 Args: log: 日志对象。 Raises: RuntimeError: 数据库连接池异常时抛出以触发重试。 """ log.info(f"开始运行 {sys._getframe().f_code.co_name} 已售每日增量采集" + "." * 40) pool = MySQLConnectionPool(log=log) if not pool.check_pool_health(): log.error("数据库连接池异常") raise RuntimeError("数据库连接池异常") try: core.run_pipeline(log, pool, incremental=True) except Exception as e: log.error(f"{sys._getframe().f_code.co_name} error: {e}") finally: log.info(f"已售每日增量采集 {sys._getframe().f_code.co_name} 运行结束" + "." * 20) def schedule_task(): """定时任务入口:每天 03:00 增量采集一次。""" main_task(log=logger) # 立即跑一次(调试时取消注释) schedule.every().day.at("08:00").do(main_task, log=logger) while True: schedule.run_pending() time.sleep(1) if __name__ == "__main__": schedule_task()