o2o-infinith-demo/scripts/update-csv-gu-content.py

178 lines
20 KiB
Python

#!/usr/bin/env python3
"""
update-csv-gu-content.py
강남언니 badges + procedures → clinic_registry_working.csv 에 컬럼 추가
"""
import csv, re, os
BASE = os.path.join(os.path.dirname(__file__), '..', 'data', 'clinic-registry')
# ── 스크래핑 결과 (hospital_id → badges, procedures) ────────────────────────
GU_CONTENT = {
23: (["수술실 CCTV","마취과 전문의 상주","여성 의사 진료","분야별 공동 진료","시술 후 관리","의료진 실명 공개","환자 숙박 정보 제공","전용 휴식 공간","입원 시설","응급 대응 체계","미용 의료 시술 진료","야간진료"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","필러","보톡스","리프팅","모발이식"]),
189: (["수술실 CCTV","마취과 전문의 상주","분야별 공동 진료","의료진 실명 공개","야간진료","여성 의사 진료","응급 대응 체계","시술 후 관리","입원 시설","전용 휴식 공간"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","필러","보톡스","피부리프팅","기타"]),
257: (["수술실 CCTV","시술 후 관리","의료진 실명 공개","여성 의사 진료","분야별 공동 진료","입원 시설","전용 휴식 공간","환자 숙박 정보 제공","야간진료","마취과 전문의 상주","응급 대응 체계"],
["양악수술","안면윤곽","눈/코성형","가슴성형","리프팅","피부클리닉","쁘띠성형","치과"]),
62: (["분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","입원 시설","마취과 전문의 상주","의료진 실명 공개","성형외과 전문의 진료","여성 의사 진료","미용 의료 시술 진료","환자 숙박 정보 제공","역에서 도보 5분","학회 활동 의사"],
["피부","코성형","눈성형","보톡스","필러","리프팅","가슴성형","지방성형"]),
2500: (["고객평가우수병원","분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","수술실 CCTV","여성 의사 진료","마취과 전문의 상주","야간진료","의료진 실명 공개"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","기타","모발이식","리프팅","보톡스","필러"]),
729: (["수술실 CCTV","입원 시설","의료진 실명 공개","전용 휴식 공간","시술 후 관리","응급 대응 체계","분야별 공동 진료"],
["코성형","안면윤곽","양악","눈성형","지방성형","필러","보톡스","가슴성형","리프팅","피부"]),
215: (["분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","수술실 CCTV","입원 시설","마취과 전문의 상주","야간진료","의료진 실명 공개"],
["눈성형","코성형","안면윤곽/양악","가슴성형","리프팅","기타","지방성형","피부","보톡스","필러"]),
926: (["수술실 CCTV","시술 후 관리","전용 휴식 공간","미용 의료 시술 진료","의료진 실명 공개"],
["눈성형","코성형","가슴성형","지방성형","필러","보톡스","리프팅"]),
938: (["분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","수술실 CCTV","여성 의사 진료","입원 시설","마취과 전문의 상주","의료진 실명 공개"],
["눈성형","코성형","가슴성형","지방성형","리프팅","필러","보톡스","안면윤곽/양악","피부"]),
2186: (["분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","환자 숙박 정보 제공","수술실 CCTV","여성 의사 진료","입원 시설","마취과 전문의 상주","야간진료","의료진 실명 공개"],
["눈성형","코성형","지방성형","가슴성형","안면윤곽/양악","리프팅"]),
250: (["분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","환자 숙박 정보 제공","수술실 CCTV","여성 의사 진료","입원 시설","마취과 전문의 상주","야간진료","의료진 실명 공개"],
["눈성형","코성형","지방성형","필러","보톡스","리프팅","가슴성형","안면윤곽/양악","모발이식","기타","피부"]),
3004: (["분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","여성 의사 진료","입원 시설","마취과 전문의 상주","야간진료","의료진 실명 공개","학회 활동 의사","미용 의료 시술 진료","역에서 도보 5분","성형외과 전문의 진료"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","필러","보톡스","리프팅","피부","기타"]),
139: (["마취과 전문의 상주","분야별 공동 진료","시술 후 관리","의료진 실명 공개","야간진료","여성 의사 진료","응급 대응 체계","입원 시설","전용 휴식 공간","미용 의료 시술 진료","성형외과 전문의 진료","학회 활동 의사"],
["피부","코성형","눈성형","보톡스","필러","리프팅","지방성형","기타"]),
141: (["시술 후 관리","전용 휴식 공간","수술실 CCTV","입원 시설","마취과 전문의 상주","의료진 실명 공개"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","필러","보톡스","리프팅","피부"]),
55: (["분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","환자 숙박 정보 제공","입원 시설","마취과 전문의 상주","의료진 실명 공개"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","필러","보톡스","리프팅","제모","치아","모발이식","한방"]),
116: (["고객평가우수병원","분야별 공동 진료","시술 후 관리","전용 휴식 공간","수술실 CCTV","입원 시설","마취과 전문의 상주","의료진 실명 공개"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","리프팅","필러","보톡스","기타"]),
248: (["수술실 CCTV","응급 대응 체계","시술 후 관리","전용 휴식 공간","입원 시설","마취과 전문의 상주","야간진료","의료진 실명 공개","분야별 공동 진료"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","필러","보톡스","리프팅","기타"]),
331: (["야간진료","시술 후 관리","전용 휴식 공간","여성 의사 진료"],
["안면윤곽","양악","지방성형","필러","보톡스","피부","리프팅","기타"]),
1449: (["시술 후 관리","의료진 실명 공개","전용 휴식 공간","응급 대응 체계"],
["코성형","눈성형","지방성형","리프팅","기타"]),
2196: (["응급 대응 체계","시술 후 관리","전용 휴식 공간","입원 시설","의료진 실명 공개","역에서 도보 5분","성형외과 전문의 진료","학회 활동 의사"],
["피부코성형","눈성형","보톡스","모발이식","리프팅","지방성형","가슴성형"]),
398: (["고객평가우수병원","분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","환자 숙박 정보 제공","여성 의사 진료","미용 의료 시술 진료","입원 시설","마취과 전문의 상주","야간진료","의료진 실명 공개","역에서 도보 5분","학회 활동 의사","성형외과 전문의 진료"],
["안면윤곽","양악수술","눈성형","코성형","가슴성형","체형성형","줄기세포","쁘띠성형","안티에이징","지방성형","필러","보톡스","리프팅","모발이식","기타"]),
1515: (["입원 시설","의료진 실명 공개","전용 휴식 공간","응급 대응 체계","시술 후 관리"],
["피부코성형","눈성형","안면윤곽/양악","보톡스","필러","리프팅","제모","지방성형","가슴성형","치아","모발이식","한방"]),
213: (["분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","수술실 CCTV","입원 시설","마취과 전문의 상주","야간진료","의료진 실명 공개"],
["눈성형","코성형","가슴성형","보톡스","리프팅","필러","기타","안면윤곽/양악","지방성형"]),
4154: (["수술실 CCTV","마취과 전문의 상주","시술 후 관리","의료진 실명 공개","전용 휴식 공간","응급 대응 체계","여성 의사 진료"],
["가슴성형","보톡스","필러","기타","지방성형","치아","리프팅","모발이식","한방"]),
623: (["고객평가우수병원","입원 시설","전용 휴식 공간","시술 후 관리"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","필러","보톡스","리프팅","기타"]),
2122: (["고객평가우수병원","시술 후 관리","전용 휴식 공간","입원 시설","야간진료","의료진 실명 공개","응급 대응 체계","분야별 공동 진료","성형외과 전문의 진료","환자 숙박 정보 제공","미용 의료 시술 진료","역에서 도보 5분","학회 활동 의사","마취과 전문의 상주"],
["눈성형","코성형","지방성형","필러","보톡스","리프팅","기타","가슴성형"]),
6597: (["고객평가우수병원","분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","입원 시설","마취과 전문의 상주","의료진 실명 공개"],
["얼굴성형","동안성형","채형성형","줄기세포성형","피부코성형","눈성형","안면윤곽/양악","보톡스","필러","리프팅","가슴성형","지방성형","기타"]),
166: (["수술실 CCTV","여성 의사 진료","입원 시설","마취과 전문의 상주","의료진 실명 공개","시술 후 관리","전용 휴식 공간","응급 대응 체계","분야별 공동 진료"],
["눈성형","코성형","가슴성형","지방성형","리프팅","안면윤곽/양악","보톡스","필러","기타"]),
108: (["수술실 CCTV","마취과 전문의 상주","응급 대응 체계","의료진 실명 공개","분야별 공동 진료","시술 후 관리","야간진료","입원 시설","전용 휴식 공간"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","필러","보톡스","리프팅","기타"]),
69: (["고객평가우수병원"],
["리프팅","필러","보톡스","눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","피부","기타","모발이식"]),
660: (["수술실 CCTV","응급 대응 체계","시술 후 관리","전용 휴식 공간","야간진료","의료진 실명 공개"],
["눈성형","코성형","지방성형","필러","보톡스","리프팅"]),
4244: (["여성 의사 진료","의료진 실명 공개","미용 의료 시술 진료","역에서 도보 5분","학회 활동 의사","성형외과 전문의 진료","분야별 공동 진료","전용 휴식 공간","시술 후 관리"],
["피부","코성형","눈성형","보톡스","필러","리프팅","가슴성형","지방성형","기타","제모"]),
300: (["수술실 CCTV","의료진 실명 공개","응급 대응 체계","시술 후 관리","야간진료","여성 의사 진료","전용 휴식 공간","분야별 공동 진료"],
["눈성형","코성형","가슴성형","지방성형","보톡스","피부리프팅","필러","제모","기타","리프팅","모발이식","한방"]),
563: (["응급 대응 체계","마취과 전문의 상주","입원 시설","시술 후 관리","전용 휴식 공간"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","필러","보톡스","리프팅"]),
2991: (["응급 대응 체계","시술 후 관리","전용 휴식 공간","의료진 실명 공개","야간진료","미용 의료 시술 진료","여성 의사 진료","역에서 도보 5분","학회 활동 의사","성형외과 전문의 진료","분야별 공동 진료"],
["눈성형","코성형","지방성형","필러","보톡스","리프팅","제모","가슴성형","치아","모발이식","한방"]),
58: (["수술실 CCTV","응급 대응 체계","시술 후 관리","전용 휴식 공간","입원 시설","마취과 전문의 상주","의료진 실명 공개","분야별 공동 진료"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","필러","보톡스","리프팅","기타"]),
54: (["시술 후 관리","입원 시설","전용 휴식 공간","의료진 실명 공개","응급 대응 체계","마취과 전문의 상주","분야별 공동 진료","야간진료","역에서 도보 5분","성형외과 전문의 진료","학회 활동 의사"],
["피부코성형","눈성형","보톡스","필러","모발이식","리프팅","가슴성형","지방성형","기타"]),
1181: (["고객평가우수병원","분야별 공동 진료","미용 의료 시술 진료","시술 후 관리","야간진료","전용 휴식 공간","여성 의사 진료","응급 대응 체계","의료진 실명 공개","역에서 도보 5분","성형외과 전문의 진료"],
["코성형","눈성형","지방성형","필러","보톡스","피부리프팅","기타"]),
3000: (["수술실 CCTV","시술 후 관리","전용 휴식 공간","응급 대응 체계","의료진 실명 공개"],
["눈성형","코성형","지방성형","리프팅","필러","보톡스","기타","제모","가슴성형","치아","모발이식","한방"]),
66: (["고객평가우수병원","분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","입원 시설","의료진 실명 공개","성형외과 전문의 진료","야간진료","역에서 도보 5분"],
["눈성형","코성형","지방성형","리프팅","보톡스","필러"]),
4749: (["시술 후 관리","야간진료","여성 의사 진료","미용 의료 시술 진료","전용 휴식 공간"],
["피부보톡스","필러","제모","리프팅","지방성형","기타"]),
5500: (["의료진 실명 공개","응급 대응 체계","시술 후 관리","야간진료","입원 시설","전용 휴식 공간"],
["안면윤곽","양악","코성형","눈성형","피부","보톡스","필러","리프팅","지방성형","제모","가슴성형","치아","모발이식"]),
431: (["의료진 실명 공개","응급 대응 체계","시술 후 관리","전용 휴식 공간","역에서 도보 5분","성형외과 전문의 진료","미용 의료 시술 진료"],
["눈성형","코성형","안면윤곽/양악","가슴성형","지방성형","리프팅","필러","보톡스"]),
5870: (["시술 후 관리","전용 휴식 공간","입원 시설","야간진료","의료진 실명 공개"],
["코성형","눈성형","보톡스","필러","리프팅","지방성형","피부"]),
2052: (["시술 후 관리","전용 휴식 공간","수술실 CCTV","의료진 실명 공개"],
["눈성형","코성형","지방성형","필러","보톡스","리프팅","모발이식"]),
4459: (["여성 의사 진료","야간진료","미용 의료 시술 진료"],
["피부보톡스","필러","리프팅","제모","기타","지방성형","가슴성형","치아","모발이식","한방"]),
339: (["분야별 공동 진료","시술 후 관리","전용 휴식 공간","야간진료","의료진 실명 공개","성형외과 전문의 진료"],
["눈성형","코성형","안면윤곽/양악","필러","리프팅","보톡스","지방성형","기타","가슴성형"]),
912: (["시술 후 관리","전용 휴식 공간","수술실 CCTV","의료진 실명 공개"],
["눈성형","코성형","지방성형","필러","기타"]),
1265: (["의료진 실명 공개","응급 대응 체계","분야별 공동 진료","시술 후 관리","입원 시설","전용 휴식 공간","성형외과 전문의 진료"],
["피부코성형","눈성형","보톡스","필러","리프팅","가슴성형","지방성형"]),
839: (["수술실 CCTV","마취과 전문의 상주","시술 후 관리","의료진 실명 공개","응급 대응 체계","입원 시설","전용 휴식 공간"],
["가슴성형","지방성형","필러","보톡스","리프팅","피부","제모","기타","치아","모발이식","한방"]),
5554: (["고객평가우수병원","의료진 실명 공개","응급 대응 체계","시술 후 관리","전용 휴식 공간","수술실 CCTV"],
["코성형","눈성형","리프팅","가슴성형","안면윤곽/양악","지방성형","기타","치아","모발이식","한방"]),
4212: (["수술실 CCTV","의료진 실명 공개","응급 대응 체계","마취과 전문의 상주","시술 후 관리","전용 휴식 공간","여성 의사 진료"],
["코재수술","코제거","코성형","재건 중점 진료"]),
6680: (["응급 대응 체계","시술 후 관리","입원 시설","의료진 실명 공개"],
["리프팅","가슴성형","눈성형","지방성형","치아","모발이식","한방"]),
369: (["분야별 공동 진료","시술 후 관리","전용 휴식 공간","입원 시설","마취과 전문의 상주","야간진료"],
["눈성형","코성형","지방성형","필러","보톡스","리프팅","기타"]),
6204: (["고객평가우수병원"],
["눈성형","코성형","보톡스","필러","가슴성형","지방성형","피부"]),
3569: (["고객평가우수병원","분야별 공동 진료","응급 대응 체계","시술 후 관리","전용 휴식 공간","입원 시설","마취과 전문의 상주","의료진 실명 공개","성형외과 전문의 진료","역에서 도보 5분"],
["안면윤곽","양악","가슴성형","눈성형","코성형","리프팅","지방성형"]),
1178: (["야간진료","의료진 실명 공개","시술 후 관리","미용 의료 시술 진료","응급 대응 체계","전용 휴식 공간","분야별 공동 진료"],
["필러","보톡스","리프팅","피부","기타"]),
3429: (["응급 대응 체계","시술 후 관리","전용 휴식 공간","입원 시설","의료진 실명 공개","환자 숙박 정보 제공","분야별 공동 진료","야간진료"],
["입술성형","귀성형","인중축소","안면윤곽","가슴성형","눈성형","코성형","리프팅","지방성형","기타"]),
413: (["고객평가우수병원","시술 후 관리","의료진 실명 공개"],
["눈성형","코성형","지방성형","가슴성형"]),
5636: (["고객평가우수병원"],
["코성형","눈성형","안면윤곽/양악","보톡스","필러","리프팅","가슴성형","지방성형","제모","기타","치아","모발이식","한방"]),
}
def extract_id(url):
m = re.search(r'/hospitals/(\d+)', url or '')
return int(m.group(1)) if m else None
def lookup(url):
hid = extract_id(url)
if hid and hid in GU_CONTENT:
badges, procs = GU_CONTENT[hid]
return ';'.join(badges), ';'.join(procs)
return '', ''
# ── clinic_registry_working.csv ──────────────────────────────────────────────
reg_path = os.path.join(BASE, 'clinic_registry_working.csv')
with open(reg_path, newline='', encoding='utf-8-sig') as f:
reader = csv.DictReader(f)
fields = list(reader.fieldnames)
rows = list(reader)
# gangnam_unni_reviews 뒤에 삽입 (중복 방지)
insert_after = 'gangnam_unni_reviews'
if 'gangnam_unni_badges' not in fields:
idx = fields.index(insert_after) + 1 if insert_after in fields else len(fields)
fields[idx:idx] = ['gangnam_unni_badges', 'gangnam_unni_procedures']
updated = 0
for row in rows:
badges_str, procs_str = lookup(row.get('gangnam_unni_url', ''))
row.setdefault('gangnam_unni_badges', badges_str)
row.setdefault('gangnam_unni_procedures', procs_str)
if badges_str:
updated += 1
with open(reg_path, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=fields, extrasaction='ignore')
writer.writeheader()
writer.writerows(rows)
print(f'✅ clinic_registry_working.csv — {updated}개 병원 badges/procedures 추가')
print(f' 총 컬럼: {len(fields)}')
print()
print('샘플 (첫 3개):')
for r in rows[:3]:
print(f" {r['hospital_name']:<18} badges={len(r.get('gangnam_unni_badges','').split(';'))}개 procs={len(r.get('gangnam_unni_procedures','').split(';'))}")