добавил атостарт всех сайтов
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 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,
|
||||||
|
|||||||
@@ -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'
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user