#!/usr/bin/env python3 # ikea_leaf_categories.py • собирает «листовые» категории каталога import json, requests, pathlib, pandas as pd, time, sys # ── настройки ──────────────────────────────────────────────────── BASE_DIR = pathlib.Path(__file__).resolve().parent LOCALE_PATH = "/pl/pl/" # ← поменяйте на /de/de/, /fr/fr/ … при нужде JSON_URL = (f"https://www.ikea.com{LOCALE_PATH}" "meta-data/navigation/catalog-products-slim.json") HEADERS = {"User-Agent": "Mozilla/5.0", "Accept": "application/json"} TXT_OUT = BASE_DIR / "leaf_categories.txt" XLSX_OUT = BASE_DIR / "leaf_categories.xlsx" EXCLUDE_NAMES = {"Wyprzedaż"} # можно расширять EXCLUDE_URL_SNIPPETS = {"/last-chance/"} # подстроки url, которые нужно отсечь # ── загрузка JSON ──────────────────────────────────────────────── def fetch_json(): r = requests.get(JSON_URL, headers=HEADERS, timeout=10) r.raise_for_status() return r.json() # ── рекурсивный обход ──────────────────────────────────────────── def walk(node: dict, acc: list): # ── NEW: фильтр «Wyprzedaż / last-chance» ───────────────────── nm = node.get("name", "") url = node.get("url", "") if nm in EXCLUDE_NAMES or any(sn in url for sn in EXCLUDE_URL_SNIPPETS): return # просто не лезем в эту ветку # ───────────────────────────────────────────────────────────── subs = node.get("subs") or [] if not subs: # лист acc.append({ "id": node.get("id"), "name": nm, "url": "https://www.ikea.com" + url }) else: for s in subs: walk(s, acc) def collect_leaves(tree): """ tree – либо dict с ключом 'subs', либо list из таких dict-ов. Возвращает список «листовых» категорий. """ leaves = [] # если пришёл список – обходим каждый элемент if isinstance(tree, list): for node in tree: walk(node, leaves) return leaves # если dict – работаем по старой схеме if isinstance(tree, dict): for top in tree.get("subs", []): walk(top, leaves) return leaves # ── main ───────────────────────────────────────────────────────── def main(): try: data = fetch_json() except Exception as e: sys.exit(f"❌ Не удалось скачать JSON: {e}") leaves = collect_leaves(data) print("Найдено категорий-листов:", len(leaves)) # txt with open(TXT_OUT, "w", encoding="utf-8") as f: f.write("\n".join(cat["url"] for cat in leaves)) print("Ссылки сохранены:", TXT_OUT) # xlsx (для удобства) try: pd.DataFrame(leaves, columns=["id", "name", "url"]).to_excel( XLSX_OUT, index=False) print("Таблица сохранена:", XLSX_OUT) except Exception as e: print("⚠️ Excel не записан:", e) if __name__ == "__main__": main()