# 네이버 자동완성으로 시드 중심의 실제 동시검색 경로 트리를 만드는 모듈 (비공식 엔드포인트) import requests AC_URL = "https://ac.search.naver.com/nx/ac" UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36" def suggest(query: str, limit: int = 8) -> list[str]: # 한 쿼리의 자동완성 후보 리스트 반환 (시드 자신은 제외) params = { "q": query, "st": "100", "frm": "nx", "r_format": "json", "r_enc": "UTF-8", "r_unicode": "0", "t_koreng": "1", "ans": "2", } res = requests.get(AC_URL, params=params, headers={"User-Agent": UA}, timeout=5) res.raise_for_status() items = res.json().get("items") or [[]] out = [] for it in items[0]: if it and it[0] and it[0] != query: out.append(it[0]) return out[:limit] def build_autocomplete_path(seed: str, vol_lookup: dict, depth1: int = 5, depth2: int = 2) -> dict: # 시드 → 자동완성(depth1) → 각자의 자동완성(depth2)로 실제 동시검색 경로 생성 # vol_lookup: 키워드 → 검색량 (검색광고 데이터에 있으면 표시, 없으면 None) nodes = [{"id": 0, "keyword": seed, "volume": vol_lookup.get(seed), "depth": 0}] edges, seen, nid = [], {seed}, 1 for s1 in suggest(seed, depth1): if s1 in seen: continue seen.add(s1) n1 = nid; nid += 1 nodes.append({"id": n1, "keyword": s1, "volume": vol_lookup.get(s1), "depth": 1}) edges.append({"source": 0, "target": n1, "edge_type": "autocomplete"}) for s2 in suggest(s1, depth2): if s2 in seen: continue seen.add(s2) n2 = nid; nid += 1 nodes.append({"id": n2, "keyword": s2, "volume": vol_lookup.get(s2), "depth": 2}) edges.append({"source": n1, "target": n2, "edge_type": "autocomplete"}) return {"nodes": nodes, "edges": edges}