DB_JOB/작업파일/공공기관2/_kesco_rebuild.py
hehihoho3 df16c98366 백업: DB수집 전체 스냅샷 (공공기관2 정리 전)
공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 18:15:40 +09:00

61 lines
2.3 KiB
Python

# -*- coding: utf-8 -*-
"""전기안전공사 LNB(.sub_left_menu) 4단 권위트리 재추출 → _gnb\1.json.
대분류(GNB d1) > 섹션(LNB d0=E) > 항목(d1=F) > 세부(d2=G)."""
import sys, io, os, json, re
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
from playwright.sync_api import sync_playwright
GNB = r"D:\01.프로젝트\DB수집\작업파일\공공기관2\_gnb\1.json"
old = json.load(open(GNB, encoding='utf-8'))
# 대분류(depth1) 목록
majors = [(r['label'], r['href']) for r in old['gnb'] if r['depth'] == 1]
LNB_JS = """
() => {
const lnb = document.querySelector('.sub_left_menu, #snb, .snb, .lnb');
if(!lnb) return {rows:[]};
const rows=[];
lnb.querySelectorAll('a').forEach(a=>{
let d=0,p=a.parentElement;
while(p&&p!==lnb){ if(p.tagName==='UL')d++; p=p.parentElement; }
let label=(a.textContent||'').trim().replace(/\\s+/g,' ');
label=label.replace(/하위메뉴(닫기|열기)$/,'').trim();
let href=a.getAttribute('href')||'';
if(href==='#'||href.startsWith('javascript')) href='';
else if(href && !href.startsWith('http')) href='https://www.kesco.or.kr'+ (href.startsWith('/')?href:'/'+href);
if(label) rows.push({d, label, href});
});
return {rows};
}
"""
def clean(label):
return label
out_rows = []
with sync_playwright() as p:
br = p.chromium.launch(headless=True)
pg = br.new_context(ignore_https_errors=True, viewport={'width':1600,'height':1000}).new_page()
for name, href in majors:
try:
pg.goto(href, wait_until='domcontentloaded', timeout=30000)
pg.wait_for_timeout(1800)
r = pg.evaluate(LNB_JS)
except Exception as e:
print(f"[{name}] 실패 {e}");
out_rows.append({'depth':1,'label':name,'href':href}); continue
lnb = r['rows']
# 대분류 행
out_rows.append({'depth':1, 'label':name, 'href':href})
# LNB d0->depth2, d1->depth3, d2->depth4 ...
for n in lnb:
out_rows.append({'depth': 2 + n['d'], 'label': n['label'], 'href': n['href']})
d1cnt = sum(1 for n in lnb if n['d']==0)
print(f"[{name}] LNB {len(lnb)}항목 (섹션 {d1cnt})")
br.close()
old['gnb'] = out_rows
old['base'] = 'https://www.kesco.or.kr'
json.dump(old, open(GNB, 'w', encoding='utf-8'), ensure_ascii=False, indent=1)
print('', len(out_rows), '행 →', GNB)