迁移目录

This commit is contained in:
hajimi
2026-06-12 22:27:18 +08:00
parent 7381097582
commit cd44cd6e47
92 changed files with 1839 additions and 0 deletions
@@ -0,0 +1,376 @@
"""
定时调度器
- 基于 APScheduler 的定时任务管理
- 支持 Cron 表达式
"""
import asyncio
from typing import Optional
from loguru import logger
from src.core.config import get_config
from src.scheduler.task_runner import TaskRunner
class CronScheduler:
"""定时调度器"""
def __init__(self):
self._cfg = get_config().scheduler
self._runner: Optional[TaskRunner] = None
self._scheduler = None
async def start(self):
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger
self._runner = TaskRunner()
await self._runner.initialize()
self._scheduler = AsyncIOScheduler()
# 积分榜采集
self._scheduler.add_job(
self._job_standings,
CronTrigger.from_crontab(self._cfg.standings_cron),
id="standings",
name="积分榜采集",
)
# 赛程采集
self._scheduler.add_job(
self._job_schedule,
CronTrigger.from_crontab(self._cfg.schedule_cron),
id="schedule",
name="赛程采集",
)
# 新闻资讯采集
self._scheduler.add_job(
self._job_news,
CronTrigger.from_crontab(self._cfg.news_cron),
id="news",
name="新闻资讯采集",
)
# 实时比赛采集
self._scheduler.add_job(
self._job_live,
CronTrigger.from_crontab(self._cfg.live_cron),
id="live",
name="实时比赛采集",
)
# 文章详情补全
self._scheduler.add_job(
self._job_content,
CronTrigger.from_crontab(self._cfg.content_cron),
id="content",
name="文章详情补全",
)
# 视频列表采集
self._scheduler.add_job(
self._job_video,
CronTrigger.from_crontab(self._cfg.video_cron),
id="video",
name="视频列表采集",
)
# 中超赛程页面采集
self._scheduler.add_job(
self._job_csl_match,
CronTrigger.from_crontab(self._cfg.csl_match_cron),
id="csl_match",
name="中超赛程页面采集",
)
# NBA赛程页面采集
self._scheduler.add_job(
self._job_nba_match,
CronTrigger.from_crontab(self._cfg.nba_match_cron),
id="nba_match",
name="NBA赛程页面采集",
)
# CBA赛程页面采集
self._scheduler.add_job(
self._job_cba_match,
CronTrigger.from_crontab(self._cfg.cba_match_cron),
id="cba_match",
name="CBA赛程页面采集",
)
# 英超赛程页面采集
self._scheduler.add_job(
self._job_epl_match,
CronTrigger.from_crontab(self._cfg.epl_match_cron),
id="epl_match",
name="英超赛程页面采集",
)
# 德甲赛程页面采集
self._scheduler.add_job(
self._job_bundesliga_match,
CronTrigger.from_crontab(self._cfg.bundesliga_match_cron),
id="bundesliga_match",
name="德甲赛程页面采集",
)
# 西甲赛程页面采集
self._scheduler.add_job(
self._job_laliga_match,
CronTrigger.from_crontab(self._cfg.laliga_match_cron),
id="laliga_match",
name="西甲赛程页面采集",
)
# 意甲赛程页面采集
self._scheduler.add_job(
self._job_seriea_match,
CronTrigger.from_crontab(self._cfg.seriea_match_cron),
id="seriea_match",
name="意甲赛程页面采集",
)
# 法甲赛程页面采集
self._scheduler.add_job(
self._job_ligue1_match,
CronTrigger.from_crontab(self._cfg.ligue1_match_cron),
id="ligue1_match",
name="法甲赛程页面采集",
)
# 欧冠赛程页面采集
self._scheduler.add_job(
self._job_ucl_match,
CronTrigger.from_crontab(self._cfg.ucl_match_cron),
id="ucl_match",
name="欧冠赛程页面采集",
)
# 欧联赛程页面采集
self._scheduler.add_job(
self._job_uel_match,
CronTrigger.from_crontab(self._cfg.uel_match_cron),
id="uel_match",
name="欧联赛程页面采集",
)
# 网球赛程页面采集
self._scheduler.add_job(
self._job_tennis_match,
CronTrigger.from_crontab(self._cfg.tennis_match_cron),
id="tennis_match",
name="网球赛程页面采集",
)
# 电竞赛程页面采集
self._scheduler.add_job(
self._job_esports_match,
CronTrigger.from_crontab(self._cfg.esports_match_cron),
id="esports_match",
name="电竞赛程页面采集",
)
# 体坛赛程页面采集
self._scheduler.add_job(
self._job_sports_match,
CronTrigger.from_crontab(self._cfg.sports_match_cron),
id="sports_match",
name="体坛赛程页面采集",
)
# 联赛资讯采集
self._scheduler.add_job(
self._job_league_news,
CronTrigger.from_crontab(self._cfg.league_news_cron),
id="league_news",
name="联赛资讯采集",
)
# 文章内容补全
self._scheduler.add_job(
self._job_article_content,
CronTrigger.from_crontab(self._cfg.article_content_cron),
id="article_content",
name="文章内容补全",
)
self._scheduler.start()
logger.info("定时调度器已启动")
logger.info(f" 积分榜: {self._cfg.standings_cron}")
logger.info(f" 赛程: {self._cfg.schedule_cron}")
logger.info(f" 新闻: {self._cfg.news_cron}")
logger.info(f" 联赛资讯: {self._cfg.league_news_cron}")
logger.info(f" 文章补全: {self._cfg.article_content_cron}")
logger.info(f" 实时: {self._cfg.live_cron}")
logger.info(f" 详情: {self._cfg.content_cron}")
logger.info(f" 视频: {self._cfg.video_cron}")
logger.info(f" 中超: {self._cfg.csl_match_cron}")
logger.info(f" NBA: {self._cfg.nba_match_cron}")
logger.info(f" CBA: {self._cfg.cba_match_cron}")
logger.info(f" 英超: {self._cfg.epl_match_cron}")
logger.info(f" 德甲: {self._cfg.bundesliga_match_cron}")
logger.info(f" 西甲: {self._cfg.laliga_match_cron}")
logger.info(f" 意甲: {self._cfg.seriea_match_cron}")
logger.info(f" 法甲: {self._cfg.ligue1_match_cron}")
logger.info(f" 欧冠: {self._cfg.ucl_match_cron}")
logger.info(f" 欧联: {self._cfg.uel_match_cron}")
logger.info(f" 网球: {self._cfg.tennis_match_cron}")
logger.info(f" 电竞: {self._cfg.esports_match_cron}")
logger.info(f" 体坛: {self._cfg.sports_match_cron}")
async def stop(self):
if self._scheduler:
self._scheduler.shutdown(wait=False)
if self._runner:
await self._runner.close()
logger.info("定时调度器已停止")
async def _job_standings(self):
logger.info("[CRON] 触发积分榜采集")
try:
await self._runner.crawl_all_leagues("standings")
except Exception as e:
logger.error(f"[CRON] 积分榜采集失败: {e}")
async def _job_schedule(self):
logger.info("[CRON] 触发赛程采集")
try:
await self._runner.crawl_all_leagues("schedule")
except Exception as e:
logger.error(f"[CRON] 赛程采集失败: {e}")
async def _job_news(self):
logger.info("[CRON] 触发新闻资讯采集")
try:
await self._runner.crawl_news()
except Exception as e:
logger.error(f"[CRON] 新闻采集失败: {e}")
async def _job_live(self):
logger.info("[CRON] 触发实时比赛采集")
try:
await self._runner.crawl_live()
except Exception as e:
logger.error(f"[CRON] 实时比赛采集失败: {e}")
async def _job_content(self):
logger.info("[CRON] 触发文章详情补全")
try:
await self._runner.crawl_article_details(batch_size=3)
except Exception as e:
logger.error(f"[CRON] 文章详情补全失败: {e}")
async def _job_video(self):
logger.info("[CRON] 触发视频列表采集")
try:
await self._runner.crawl_videos()
except Exception as e:
logger.error(f"[CRON] 视频列表采集失败: {e}")
async def _job_csl_match(self):
logger.info("[CRON] 触发中超赛程页面采集")
try:
await self._runner.crawl_csl_matches()
except Exception as e:
logger.error(f"[CRON] 中超赛程采集失败: {e}")
async def _job_nba_match(self):
logger.info("[CRON] 触发NBA赛程页面采集")
try:
await self._runner.crawl_nba_matches()
except Exception as e:
logger.error(f"[CRON] NBA赛程采集失败: {e}")
async def _job_cba_match(self):
logger.info("[CRON] 触发CBA赛程页面采集")
try:
await self._runner.crawl_cba_matches()
except Exception as e:
logger.error(f"[CRON] CBA赛程采集失败: {e}")
async def _job_epl_match(self):
logger.info("[CRON] 触发英超赛程页面采集")
try:
await self._runner.crawl_epl_matches()
except Exception as e:
logger.error(f"[CRON] 英超赛程采集失败: {e}")
async def _job_bundesliga_match(self):
logger.info("[CRON] 触发德甲赛程页面采集")
try:
await self._runner.crawl_bundesliga_matches()
except Exception as e:
logger.error(f"[CRON] 德甲赛程采集失败: {e}")
async def _job_laliga_match(self):
logger.info("[CRON] 触发西甲赛程页面采集")
try:
await self._runner.crawl_laliga_matches()
except Exception as e:
logger.error(f"[CRON] 西甲赛程采集失败: {e}")
async def _job_seriea_match(self):
logger.info("[CRON] 触发意甲赛程页面采集")
try:
await self._runner.crawl_seriea_matches()
except Exception as e:
logger.error(f"[CRON] 意甲赛程采集失败: {e}")
async def _job_ligue1_match(self):
logger.info("[CRON] 触发法甲赛程页面采集")
try:
await self._runner.crawl_ligue1_matches()
except Exception as e:
logger.error(f"[CRON] 法甲赛程采集失败: {e}")
async def _job_ucl_match(self):
logger.info("[CRON] 触发欧冠赛程页面采集")
try:
await self._runner.crawl_ucl_matches()
except Exception as e:
logger.error(f"[CRON] 欧冠赛程采集失败: {e}")
async def _job_uel_match(self):
logger.info("[CRON] 触发欧联赛程页面采集")
try:
await self._runner.crawl_uel_matches()
except Exception as e:
logger.error(f"[CRON] 欧联赛程采集失败: {e}")
async def _job_tennis_match(self):
logger.info("[CRON] 触发网球赛程页面采集")
try:
await self._runner.crawl_tennis_matches()
except Exception as e:
logger.error(f"[CRON] 网球赛程采集失败: {e}")
async def _job_esports_match(self):
logger.info("[CRON] 触发电竞赛程页面采集")
try:
await self._runner.crawl_esports_matches()
except Exception as e:
logger.error(f"[CRON] 电竞赛程采集失败: {e}")
async def _job_sports_match(self):
logger.info("[CRON] 触发体坛赛程页面采集")
try:
await self._runner.crawl_sports_matches()
except Exception as e:
logger.error(f"[CRON] 体坛赛程采集失败: {e}")
async def _job_league_news(self):
logger.info("[CRON] 触发联赛资讯采集")
try:
await self._runner.crawl_league_news()
except Exception as e:
logger.error(f"[CRON] 联赛资讯采集失败: {e}")
async def _job_article_content(self):
logger.info("[CRON] 触发文章内容补全")
try:
await self._runner.crawl_article_content()
except Exception as e:
logger.error(f"[CRON] 文章内容补全失败: {e}")
File diff suppressed because it is too large Load Diff