Files
parser/main.py
Игорь Бандурист 770445feaa
All checks were successful
continuous-integration/drone/push Build is passing
добавил атостарт всех сайтов
2026-05-16 12:41:54 +10:00

81 lines
2.3 KiB
Python

"""
Parser API - Точка входа приложения
"""
from contextlib import asynccontextmanager
from fastapi import FastAPI
import uvicorn
from work_parser import get_true_sources
from config import (
APP_TITLE,
APP_DESCRIPTION,
APP_VERSION,
UVICORN_PORT,
SCHEDULED_PARSER_1_HOUR,
SCHEDULED_PARSER_1_MINUTE,
SCHEDULED_PARSER_2_HOUR,
SCHEDULED_PARSER_2_MINUTE
)
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from parsers import scheduled_parser_1, scheduled_parser_2, scheduled_parser_universal
from api import setup_routes
# Инициализация планировщика
scheduler = AsyncIOScheduler()
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Управление жизненным циклом приложения"""
# Startup
scheduler.add_job(scheduled_parser_1, "cron", hour=SCHEDULED_PARSER_1_HOUR, minute=SCHEDULED_PARSER_1_MINUTE)
scheduler.add_job(scheduled_parser_2, "cron", hour=SCHEDULED_PARSER_2_HOUR, minute=SCHEDULED_PARSER_2_MINUTE)
# Получаем все источники и распределяем их равномерно по 24 часам
sources = get_true_sources().items()
num_sources = len(sources)
if num_sources > 0:
total_minutes_per_day = 24 * 60
minutes_per_source = total_minutes_per_day / num_sources
for idx, (url, promt) in enumerate(sources):
total_minutes = int(idx * minutes_per_source)
scheduled_hour = total_minutes // 60
scheduled_minute = total_minutes % 60
# Для универсального парсера нужно передавать url и promt как аргументы
scheduler.add_job(
scheduled_parser_universal,
"cron",
hour=scheduled_hour,
minute=scheduled_minute,
args=[url, promt]
)
scheduler.start()
yield
# Shutdown
scheduler.shutdown()
# Создание приложения FastAPI
app = FastAPI(
title=APP_TITLE,
description=APP_DESCRIPTION,
version=APP_VERSION,
lifespan=lifespan
)
# Настройка маршрутов
setup_routes(app)
if __name__ == "__main__":
uvicorn.run("main:app", port=UVICORN_PORT, reload=True)