""" 사이 (SAI): e뮤지엄 API 데이터 품질 조사 (v0 데이터 탐색 단계 산물). 1페이지(오래된 데이터) vs 마지막 페이지(최신) 데이터 품질 비교. NOTE: v0 시절 의사결정의 근거가 된 스크립트 — e뮤지엄 API의 description이 "보존상태 기록" 위주임을 확인하고 큐레이터 추천 페이지 스크래핑으로 방향을 전환하게 만든 도구. 학습 여정의 흔적으로 보존됩니다. """ import os import sys import requests from dotenv import load_dotenv URL = "https://api.kcisa.kr/openapi/service/rest/meta/MPKreli" def fetch_page(api_key: str, page_no: int, num_rows: int = 10): """특정 페이지의 데이터를 가져옴.""" params = {"serviceKey": api_key, "numOfRows": num_rows, "pageNo": page_no} response = requests.get(URL, params=params, headers={"Accept": "application/json"}) data = response.json() if data["response"]["header"]["resultCode"] != "0000": return None, 0 items = data["response"]["body"]["items"]["item"] total = int(data["response"]["body"]["totalCount"]) return items, total def analyze_quality(items, label: str) -> None: """데이터 품질 분석 + 출력.""" print(f"\n{'='*60}") print(f" [{label}]") print(f"{'='*60}") if not items: print(" 데이터 없음") return total = len(items) fields_to_check = [ ("description", "해설"), ("subjectKeyword", "키워드"), ("subjectCategory", "분류"), ("temporal", "시대"), ("medium", "재질"), ] print(f"\n 필드 채워짐 비율 (총 {total}개 중)") for field, label_kr in fields_to_check: filled = sum(1 for item in items if item.get(field)) pct = (filled / total) * 100 bar = "#" * int(pct / 10) + "-" * (10 - int(pct / 10)) print(f" {label_kr:6s} [{bar}] {filled}/{total} ({pct:.0f}%)") print("\n 작품 제목 샘플") for i, item in enumerate(items[:5], 1): title = item.get("title") or "(제목없음)" temporal = item.get("temporal") or "(시대불명)" print(f" {i}. {title} ({temporal})") items_with_desc = [item for item in items if item.get("description")] if items_with_desc: sample = items_with_desc[0] desc = sample.get("description", "")[:200] print("\n 해설 있는 작품 예시") print(f" 제목: {sample.get('title') or '(없음)'}") print(f" 해설: {desc}...") def main() -> int: load_dotenv() api_key = os.getenv("EMUSEUM_API_KEY") if not api_key: print("EMUSEUM_API_KEY 가 .env 에 없습니다.", file=sys.stderr) return 1 print("사이 — 데이터 품질 조사 시작") print(f" API 키 길이: {len(api_key)}자") items_first, total = fetch_page(api_key, 1, 10) print(f"\n 전체 데이터 수: {total:,}개") analyze_quality(items_first, "1페이지 (가장 오래된 데이터 추정)") last_page = (total // 10) + (1 if total % 10 else 0) items_last, _ = fetch_page(api_key, last_page, 10) analyze_quality(items_last, f"마지막 페이지 #{last_page} (최신 데이터 추정)") middle_page = last_page // 2 items_middle, _ = fetch_page(api_key, middle_page, 10) analyze_quality(items_middle, f"중간 페이지 #{middle_page}") print(f"\n{'='*60}") print(" 조사 완료") print(f"{'='*60}") print("\n 사용한 API 호출 수: 3회 / 일일 한도 1000회") return 0 if __name__ == "__main__": sys.exit(main())