import logging from apscheduler.schedulers.asyncio import AsyncIOScheduler from app.api.deps import get_crawl_service from app.config import settings logger = logging.getLogger(__name__) scheduler = AsyncIOScheduler() async def scheduled_crawl(): logger.info("开始定时爬取任务") service = get_crawl_service() names = service.get_spider_names() for name in names: try: results = await service.run_spider(name) for r in results: if not r.success: logger.error(f"Spider {name} 失败: {r.error_message}") else: logger.info(f"Spider {name} 完成: {r.total_count} 条") except Exception as e: logger.error(f"Spider {name} 异常: {e}") logger.info("定时爬取任务完成") def start_scheduler(): if not settings.scheduler_enabled: return scheduler.add_job( scheduled_crawl, "cron", hour="8,14,18", minute="0", id="scheduled_crawl", name="定时爬取", timezone="Asia/Shanghai", ) scheduler.start() logger.info("APScheduler 已启动 (8:00, 14:00, 18:00)") def shutdown_scheduler(): if scheduler.running: scheduler.shutdown(wait=False) logger.info("APScheduler 已停止")