From ef453f661af71b8397aa47611d70e1481fb26510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=91=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?=D1=83=D1=80=D0=B8=D1=81=D1=82?= Date: Tue, 5 May 2026 21:24:45 +1000 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/routes.py | 6 ++--- parsers/universal.py | 6 +++-- work_parser.py | 53 +++++++++++++++++++++++++++++++++++--------- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/api/routes.py b/api/routes.py index 94213f0..03f1edd 100644 --- a/api/routes.py +++ b/api/routes.py @@ -62,9 +62,9 @@ def setup_routes(app: FastAPI) -> None: background_tasks.add_task(start_pars_all_istochnik, str(url.url), url.promt) return {"message": "Процесс парсинга любого источника запущен"} - @app.get("/get_tasks_offset", summary="Метод получения задач парсинга") - async def get_tasks_offset(limit: int = Query(10, gt=0), offset: int = Query(0, ge=0)): - return wp.get_tasks_offset(limit, offset) + # @app.get("/get_tasks_offset", summary="Метод получения задач парсинга") + # async def get_tasks_offset(limit: int = Query(10, gt=0), offset: int = Query(0, ge=0)): + # return wp.get_tasks_offset(limit, offset) # ==================== Настройки ==================== diff --git a/parsers/universal.py b/parsers/universal.py index 433f19c..c309182 100644 --- a/parsers/universal.py +++ b/parsers/universal.py @@ -46,7 +46,7 @@ class UniversalParser(BaseParser): """ print(f"Начало парсинга: {self.url} с промтом: {self.promt}") self.start_task(self.url) - + num = 0 try: response = requests.get(self.url) # print(response.text) @@ -85,6 +85,7 @@ class UniversalParser(BaseParser): print("URL:", abs_url) if len(article.text) > 200 and article.publish_date: + num += 1 # Если дата публикации отсутствует - используем текущую if article.publish_date: time_text = article.publish_date.strftime("%Y/%m/%d %H:%M:%S") @@ -109,7 +110,8 @@ class UniversalParser(BaseParser): print(f"Ошибка при обработке статьи {abs_url}: {e}") logger.info(f"Ошибка при обработке статьи {abs_url}: {e}") continue - + if num: + wp.update_source_status(url) self.complete_task() diff --git a/work_parser.py b/work_parser.py index 1838baf..8bf8a1a 100644 --- a/work_parser.py +++ b/work_parser.py @@ -324,42 +324,75 @@ def create_table_add_sourse(): cur.execute(""" CREATE TABLE IF NOT EXISTS sourse ( url TEXT PRIMARY KEY, - promt TEXT + promt TEXT, + status BOOLEAN DEFAULT FALSE ); """) print("Таблица sourse создана или уже существует") finally: pass -def add_sources(url: str, promt: str): + +def add_sources(url: str, promt: str, status: bool = False): conn = get_connection() try: with conn.cursor() as cur: cur.execute(""" - INSERT INTO sourse (url, promt) - VALUES (%s, %s) + INSERT INTO sourse (url, promt, status) + VALUES (%s, %s, %s) ON CONFLICT (url) DO UPDATE SET - promt = EXCLUDED.promt - """, (url, promt)) + promt = EXCLUDED.promt, + status = EXCLUDED.status + """, (url, promt, status)) conn.commit() finally: pass + def get_all_sources(category: str): - """Возвращает все записи из таблицы sourse""" + """Возвращает все записи из таблицы sourse. Сначала показываются записи со status=false""" conn = get_connection() try: with conn.cursor(cursor_factory=RealDictCursor) as cur: if category == "all": - cur.execute("SELECT * FROM sourse") + cur.execute(""" + SELECT * FROM sourse + ORDER BY status ASC, url ASC + """) else: - cur.execute("SELECT * FROM sourse WHERE promt = %s", (category,)) + cur.execute(""" + SELECT * FROM sourse + WHERE promt = %s + ORDER BY status ASC, url ASC + """, (category,)) rows = cur.fetchall() - sources = [{"url": row["url"], "promt": row["promt"]} for row in rows] + sources = [{"url": row["url"], "promt": row["promt"], "status": row["status"]} for row in rows] return {"sources": sources} + except Exception as e: + print(f"Ошибка при получении источников: {e}") + return {"error": str(e), "sources": []} finally: pass + +def update_source_status(url: str, status: bool = True): + """Обновляет статус источника по URL""" + conn = get_connection() + try: + with conn.cursor() as cur: + cur.execute(""" + UPDATE sourse SET status = %s WHERE url = %s + """, (status, url)) + updated = cur.rowcount + conn.commit() + return {"message": f"Статус обновлён для {url}", "updated_rows": updated} + except Exception as e: + print(f"Ошибка при обновлении статуса: {e}") + return {"error": str(e), "updated_rows": 0} + finally: + pass + + def delete_sources(url: str): """Удаляет источник по URL из таблицы sourse""" conn = get_connection()