#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 더불어민주당 크롤러 스케줄러 - 매일 지정된 시간에 자동 실행 - 백그라운드 실행 지원 - 로그 기록 """ import asyncio import logging from datetime import datetime from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.cron import CronTrigger from minjoo_crawler_async import MinjooAsyncCrawler # 로깅 설정 logging.basicConfig( level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s', handlers=[ logging.FileHandler('crawler_scheduler.log', encoding='utf-8'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) async def scheduled_task(): """스케줄된 작업""" logger.info("="*60) logger.info("스케줄된 크롤링 시작") logger.info("="*60) try: crawler = MinjooAsyncCrawler() await crawler.run_incremental() logger.info("크롤링 완료") except Exception as e: logger.error(f"크롤링 실패: {e}", exc_info=True) def main(): """스케줄러 메인""" scheduler = AsyncIOScheduler() # 매일 오전 9시에 실행 scheduler.add_job( scheduled_task, trigger=CronTrigger(hour=9, minute=0), id='daily_crawl', name='민주당 크롤러 일일 실행', replace_existing=True ) # 즉시 한 번 실행 (테스트용) # scheduler.add_job(scheduled_task, 'date', run_date=datetime.now()) logger.info("스케줄러 시작") logger.info("매일 오전 9시에 크롤링 실행") logger.info("종료하려면 Ctrl+C를 누르세요") scheduler.start() try: # 이벤트 루프 실행 asyncio.get_event_loop().run_forever() except (KeyboardInterrupt, SystemExit): logger.info("스케줄러 종료") if __name__ == "__main__": main()