From 4a7bf9a1635a23659608a5740cb440d392b70227 Mon Sep 17 00:00:00 2001 From: va1is Date: Wed, 3 Sep 2025 14:18:40 +0300 Subject: [PATCH] =?UTF-8?q?ZARAHOME=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B2=20json=20+=20api=20=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=BA=D0=BE=20=D1=82=D0=B5=20=D1=82=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=80=D1=8B=20=D1=87=D1=82=D0=BE=20=D0=B5=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B2=20=D0=BD=D0=B0=D0=BB=D0=B8=D1=87=D0=B8=D0=B8.=20=D0=9C?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=BC=D0=B5=D0=BD=D1=8F?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B2=20=D0=BA=D0=BE=D0=B4=D0=B5=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=BC=20=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=B8=D1=85=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=20=D1=87=D1=82=D0=BE=D0=B1=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B2=D1=81=D0=B5?= =?UTF-8?q?,=20=D0=B0=20=D0=BC=D0=B5=D0=BD=D1=8F=D1=82=D1=8C=20=D1=82?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20inStock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Parsing ZARAHOME/src/xlsx_recorder.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Parsing ZARAHOME/src/xlsx_recorder.py b/Parsing ZARAHOME/src/xlsx_recorder.py index ca637c0..5e694f9 100644 --- a/Parsing ZARAHOME/src/xlsx_recorder.py +++ b/Parsing ZARAHOME/src/xlsx_recorder.py @@ -25,6 +25,9 @@ MIN_PRICE = 40 MAX_PRICE = 1200 EXCLUSION_FILE = Path(__file__).with_name("exclusion_materials.txt") # в том же каталоге +# Только такие статусы допускаем в JSON/POST +ALLOWED_VIS = {"SHOW", "RUNNING_OUT"} + INVALID_FILE_CHARS = r'[<>:"/\\|*?]' # для имён файлов Windows def sanitize_filename(name: str, repl: str = "_") -> str: @@ -76,21 +79,31 @@ class Recorder: price_raw = row[idx["Цена закупки"]] price_int = math.ceil(float(price_raw)) if not (MIN_PRICE <= price_int <= MAX_PRICE): + # вне ценового коридора — остаётся только в XLSX continue - # ----------- фильтр по составу ------- + # ----------- фильтр статуса наличия -------- + vis_val = row[idx["Наличие на сайте"]] + #Закомментить это если нужно выключить (начало)-------------------------------# + if vis_val not in ALLOWED_VIS: # + # любые статусы кроме SHOW/RUNNING_OUT — только в XLSX # + log.debug("Skip by availability: %s (%s)", row[idx["Артикул"]], vis_val) # + continue # + #Закомментить это если нужно выключить (конец)--------------------------------# + + # ----------- фильтр по составу ----------- comp_txt = row[idx["Параметр: Состав"]].replace("\n", "
") comp_low = comp_txt.lower() if any(tok in comp_low for tok in self.forbidden): log.debug("Skip by exclusion token: %s", row[idx["Артикул"]]) continue - # ----------- формируем variant ------- + # ----------- формируем variant ----------- article = row[idx["Артикул"]] partnumber = row[idx["PartNumber"]] clr_name = row[idx["Свойство: Цвет"]].capitalize() size_full = row[idx["Свойство: Размер"]].replace("\n", "
") - vis = row[idx["Наличие на сайте"]] + vis = vis_val weight_g = float(row[idx["Свойство: Вес(г)"]]) if row[idx["Свойство: Вес(г)"]] else 0.0 weight_kg = math.ceil(weight_g / 1000) if weight_g else 0 url_full = row[idx["Краткое описание"]] @@ -116,7 +129,7 @@ class Recorder: "originalDescription": desc_orig, "originalComposition": comp_txt, "images": images, - "inStock": vis == "SHOW", + "inStock": vis in ALLOWED_VIS, # ← здесь привязали к ALLOWED_VIS "weight": weight_kg }