迁移目录
This commit is contained in:
@@ -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
Reference in New Issue
Block a user