добавил атостарт всех сайтов
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
28
main.py
28
main.py
@@ -4,6 +4,7 @@ Parser API - Точка входа приложения
|
||||
from contextlib import asynccontextmanager
|
||||
from fastapi import FastAPI
|
||||
import uvicorn
|
||||
from work_parser import get_true_sources
|
||||
|
||||
from config import (
|
||||
APP_TITLE,
|
||||
@@ -16,10 +17,11 @@ from config import (
|
||||
SCHEDULED_PARSER_2_MINUTE
|
||||
)
|
||||
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||
from parsers import scheduled_parser_1, scheduled_parser_2
|
||||
from parsers import scheduled_parser_1, scheduled_parser_2, scheduled_parser_universal
|
||||
from api import setup_routes
|
||||
|
||||
|
||||
|
||||
# Инициализация планировщика
|
||||
scheduler = AsyncIOScheduler()
|
||||
|
||||
@@ -30,12 +32,36 @@ 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,
|
||||
|
||||
@@ -15,5 +15,6 @@ __all__ = [
|
||||
'start_pars_two_istochnik',
|
||||
'scheduled_parser_2',
|
||||
'UniversalParser',
|
||||
'start_pars_all_istochnik'
|
||||
'start_pars_all_istochnik',
|
||||
'scheduled_parser_universal'
|
||||
]
|
||||
|
||||
@@ -122,3 +122,10 @@ def start_pars_all_istochnik(url: str, promt: str) -> None:
|
||||
"""
|
||||
parser = UniversalParser(url, promt)
|
||||
parser.parse()
|
||||
|
||||
|
||||
def scheduled_parser_universal(url: str, promt: str) -> None:
|
||||
"""
|
||||
Функция для автоматического запуска универсального парсера по расписанию
|
||||
"""
|
||||
start_pars_all_istochnik(url, promt)
|
||||
|
||||
@@ -409,6 +409,25 @@ def get_all_sources(category: str):
|
||||
return {"error": str(e), "sources": []}
|
||||
|
||||
|
||||
def get_true_sources():
|
||||
"""Возвращает все записи из таблицы sourse. Сначала показываются записи со status=true"""
|
||||
conn = get_connection()
|
||||
try:
|
||||
with conn.cursor(cursor_factory=RealDictCursor) as cur:
|
||||
cur.execute("""
|
||||
SELECT * FROM sourse
|
||||
WHERE status = true
|
||||
""")
|
||||
rows = cur.fetchall()
|
||||
sources = {}
|
||||
for row in rows:
|
||||
sources.update({row["url"]: row["promt"]})
|
||||
return sources
|
||||
except Exception as e:
|
||||
print(f"Ошибка при получении источников: {e}")
|
||||
return {"error": str(e), "sources": []}
|
||||
|
||||
|
||||
def update_source_status(url: str, status: bool = True):
|
||||
"""Обновляет статус источника по URL"""
|
||||
conn = get_connection()
|
||||
|
||||
Reference in New Issue
Block a user