Spaces:
Running
Running
| # λ€μ΄λ² μλμμ±μΌλ‘ μλ μ€μ¬μ μ€μ λμκ²μ κ²½λ‘ νΈλ¦¬λ₯Ό λ§λλ λͺ¨λ (λΉκ³΅μ μλν¬μΈνΈ) | |
| 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} | |