добавил атостарт всех сайтов
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-05-16 12:41:54 +10:00
parent 656c8d9d9a
commit 770445feaa
4 changed files with 55 additions and 2 deletions

28
main.py
View File

@@ -4,6 +4,7 @@ Parser API - Точка входа приложения
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from fastapi import FastAPI from fastapi import FastAPI
import uvicorn import uvicorn
from work_parser import get_true_sources
from config import ( from config import (
APP_TITLE, APP_TITLE,
@@ -16,10 +17,11 @@ from config import (
SCHEDULED_PARSER_2_MINUTE SCHEDULED_PARSER_2_MINUTE
) )
from apscheduler.schedulers.asyncio import AsyncIOScheduler 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 from api import setup_routes
# Инициализация планировщика # Инициализация планировщика
scheduler = AsyncIOScheduler() scheduler = AsyncIOScheduler()
@@ -30,12 +32,36 @@ async def lifespan(app: FastAPI):
# Startup # Startup
scheduler.add_job(scheduled_parser_1, "cron", hour=SCHEDULED_PARSER_1_HOUR, minute=SCHEDULED_PARSER_1_MINUTE) 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) 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() scheduler.start()
yield yield
# Shutdown # Shutdown
scheduler.shutdown() scheduler.shutdown()
# Создание приложения FastAPI # Создание приложения FastAPI
app = FastAPI( app = FastAPI(
title=APP_TITLE, title=APP_TITLE,

View File

@@ -15,5 +15,6 @@ __all__ = [
'start_pars_two_istochnik', 'start_pars_two_istochnik',
'scheduled_parser_2', 'scheduled_parser_2',
'UniversalParser', 'UniversalParser',
'start_pars_all_istochnik' 'start_pars_all_istochnik',
'scheduled_parser_universal'
] ]

View File

@@ -122,3 +122,10 @@ def start_pars_all_istochnik(url: str, promt: str) -> None:
""" """
parser = UniversalParser(url, promt) parser = UniversalParser(url, promt)
parser.parse() parser.parse()
def scheduled_parser_universal(url: str, promt: str) -> None:
"""
Функция для автоматического запуска универсального парсера по расписанию
"""
start_pars_all_istochnik(url, promt)

View File

@@ -409,6 +409,25 @@ def get_all_sources(category: str):
return {"error": str(e), "sources": []} 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): def update_source_status(url: str, status: bool = True):
"""Обновляет статус источника по URL""" """Обновляет статус источника по URL"""
conn = get_connection() conn = get_connection()