Module 1: 점수화 엔진 설계 (v1.0)
스마트블록 기반 니치 후보를 4가지 지표 × 가중치로 평가하여 신인 블로거도 1등 가능한 세부 주제를 자동 발굴하는 점수화 엔진의 설계 문서.
1. 설계 목표
1.1 입력 / 출력 정의
[INPUT]
- 사용자 프로필: 전문 분야, 기존 블로그 주제, C-Rank 추정치
- 시드 키워드: "제주도", "초등 육아", "다이소" 등 1~5개
- 홈판 추세 데이터: Selenium 자동 수집 또는 수동 CSV 입력
- 옵션: 후보 수 (기본 150), 컷오프 (기본 70점)
[OUTPUT]
- 니치 후보 리스트 (점수순 정렬)
- 니치 조합: "제주도 + 아이 + 카페"
- 종합 점수: 0~100
- 4개 하위 점수: 인기도, 적성, 수익화, 경쟁
- 추천 제휴 상품 키워드 (수익화용)
- 예상 월 트래픽 (10K / 5K / 1K)
1.2 핵심 원칙
| 원칙 | 의미 | 적용 |
|---|---|---|
| 단계적 정확도 | MVP는 LLM+수동, 안정화 후 실측 API | Phase 1: Selenium+수동 → Phase 3: API 통합 |
| 편향 보정 | 단일 지표 압도 방지 | 단일 항목 90점 초과 시 가중치 자동 조정 |
| 재현성 | 같은 입력 = 같은 결과 (seed 고정) | Claude API temperature=0, seed 옵션 |
| 설명 가능성 | 왜 이 점수인지 reasoning 저장 | 각 점수별 “근거 텍스트” 필드 보존 |
2. 점수 공식 (v1.0)
2.1 종합 점수
니치_점수(0~100)
= 홈판_인기도 × 0.30
+ C-Rank_적성 × 0.30
+ 수익화_가능 × 0.25
+ (100 − 경쟁_강도) × 0.15
선정 기준: 70점 이상
참고: 경쟁 강도는 “낮을수록 좋음”이므로
(100 − 경쟁_강도)형태로 양의 가중치 적용.
2.2 가중치 설계 근거
| 항목 | 가중치 | 근거 |
|---|---|---|
| 홈판 인기도 | 30% | 트래픽 폭발 잠재력 = 수익의 1차 동인 |
| C-Rank 적성 | 30% | 신인 블로거가 노출되려면 적성 일치 필수 |
| 수익화 가능 | 25% | 트래픽이 있어도 제휴/광고 없으면 수익 0 |
| 경쟁 강도 (역) | 15% | 진입 장벽 — 단독 1등 가능 여부 |
합계 = 100% | 가중치는 운영 데이터 누적 후 Phase 4(2026-09)에서 튜닝.
3. 4가지 지표 정의 및 측정
3.1 홈판 인기도 (Home Feed Popularity)
정의: 해당 니치 키워드가 네이버 홈판(추천 알고리즘)에 노출될 잠재력.
측정 신호 (총 100점):
| 신호 | 가중치 | 측정 방법 | MVP 데이터 소스 |
|---|---|---|---|
| 홈판 노출 빈도 | 35점 | 네이버 홈판 직접 크롤링 | Selenium 또는 수동 CSV |
| 검색량 추세 (30일) | 25점 | DataLab / Google Trends | Phase 1: Claude 추정 |
| 시의성 (계절·이벤트) | 20점 | 현재 월/계절과의 적합도 | 캘린더 룰 기반 |
| 키워드 트렌드 방향 | 20점 | 상승(+) / 보합(0) / 하락(-) | Phase 1: Claude 추정 |
핵심: **홈판 노출 빈도(35점)**가 가장 중요 — 실제 네이버가 어떤 주제를 노출하는지가 직접 신호.
계산 예시:
인기도 = (
홈판_노출_빈도_점수 * 0.35
+ 검색량_추세_점수 * 0.25
+ 시의성_점수 * 0.20
+ 트렌드_방향_점수 * 0.20
)3.2 C-Rank 적성 (Creator Rank Affinity)
정의: 사용자의 기존 블로그 주제 / 전문 분야 와 후보 니치의 의미적 매칭도.
측정 신호 (총 100점):
| 신호 | 가중치 | 측정 방법 |
|---|---|---|
| 주제 의미 유사도 | 50점 | 사용자 프로필 vs 니치 (Claude 평가) |
| 기존 발행 이력 매칭 | 30점 | 최근 30편 카테고리 분포 |
| 사용자 자기평가 적성 | 20점 | 사용자가 직접 입력한 “관심도 1~10” |
Phase 1 (MVP) 단순화:
- 사용자 프로필 텍스트 (자기소개) + 니치 후보를 Claude에 전달
- “이 블로거가 이 주제에 적성이 있는지 0~100으로 평가” 요청
- 평가 근거 reasoning을 함께 저장
예시:
사용자 프로필: "초등 자녀 1명을 둔 워킹맘. 교육·정리정돈·간편 요리 위주 발행."
니치 A: "초등 2학기 학용품 추천" → C-Rank 적성: 92점 (강한 매칭)
니치 B: "비트코인 단타 전략" → C-Rank 적성: 18점 (불일치)
니치 C: "다이소 정리함 비교" → C-Rank 적성: 85점 (영역 인접)3.3 수익화 가능 (Monetization Potential)
정의: 해당 니치로 발행 시 광고 + 제휴 + 지식 창업 수익 잠재력.
측정 신호 (총 100점):
| 신호 | 가중치 | 측정 방법 | MVP 데이터 소스 |
|---|---|---|---|
| 제휴 상품 가용성 | 40점 | 네이버 쇼핑 API 상품 수 | Phase 1: Claude 추정 |
| 평균 제휴 수수료율 | 30점 | 카테고리별 수수료 (3~48%) | Phase 1: 카테고리 룩업 테이블 |
| 광고 CPM 추정 | 20점 | 콘텐츠 카테고리 × 광고 단가 | Phase 1: 카테고리 룩업 테이블 |
| 지식 창업 확장성 | 10점 | 전자책/강의 수요 가능성 | Phase 1: Claude 평가 |
카테고리 룩업 테이블 (예시):
| 카테고리 | 평균 수수료율 | 예상 CPM | 비고 |
|---|---|---|---|
| 뷰티/패션 | 8~15% | 8K | 수익률 최상 |
| 육아/유아 | 5~10% | 6K | 안정적 |
| 인테리어/정리 | 5~10% | 6K | 다이소 등 강함 |
| 식품/요리 | 3~8% | 4K | 단가 낮음 |
| IT/디지털 | 2~5% | 5K | 수수료 낮음 |
| 교육/책 | 5~10% | 4K | 지식 창업 강함 |
3.4 경쟁 강도 (Competition Intensity) — 낮을수록 좋음
정의: 해당 니치 키워드에서 이미 강한 경쟁자가 얼마나 있는지.
측정 신호 (총 100점, 낮을수록 좋음):
| 신호 | 가중치 | 측정 방법 |
|---|---|---|
| 스마트블록 결과 글 수 | 40점 | 검색 시 상위 노출 글 수 |
| 상위 블로거 C-Rank | 30점 | 상위 10개 글 작성자 신뢰도 |
| 키워드 검색량 | 20점 | (역설적) 너무 높으면 경쟁 ↑ |
| 신규 발행 빈도 | 10점 | 최근 30일 신규 글 수 |
계산 로직:
경쟁_강도 = (
글_수_점수 * 0.40 # 0(없음) ~ 100(가득)
+ 경쟁자_C_Rank * 0.30 # 0(약함) ~ 100(강함)
+ 검색량_점수 * 0.20 # 100K↑(높음) ~ 1K↓(낮음)
+ 신규_발행_점수 * 0.10
)
# 최종 공식에서는 (100 - 경쟁_강도) 사용 → 낮을수록 가산
MVP 단순화: Claude에게 “이 니치의 경쟁 강도를 0~100으로 평가 (높을수록 경쟁 치열)” 요청.
4. 네이버 홈판 추세 수집 ⭐ (Module 1 핵심 입력)
중요: 홈판 인기도 점수의 35%를 차지하는 핵심 신호. MVP에서도 반드시 포함.
4.1 두 가지 수집 방식 (병행 운영)
| 방식 | 자동화 | 정확도 | 안정성 | MVP 우선순위 |
|---|---|---|---|---|
| A. Selenium 자동 수집 | ✅ 완전 자동 | ⭐⭐⭐ | ⚠️ DOM 변경 시 깨짐 | 1순위 |
| B. 수동 CSV 입력 | ❌ 수동 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 백업 (Selenium 실패 시) |
4.2 방식 A: Selenium 자동 수집
대상 URL (2026-05-13 실측 후 확정):
https://www.naver.com/ # ⭐ PC 홈, ContentHeaderView 컴포넌트
대상 탭 (5개) — 콘텐츠 추천 영역:
추천 / 패션뷰티 / 리빙푸드 / 지식 / 건강
(블로그 콘텐츠 관련성 낮은 카테크·웹툰·책방은 제외)
셀렉터: [class*='ContentHeaderView'][class*='tab_list']
- 8개 탭(추천/카테크/웹툰/패션뷰티/리빙푸드/책방/지식/건강) 모두 포함된 두 번째 tab_list 자동 인식
- 각 탭
[role='tab']클릭 → 2초 대기 → 카드(a[href]) 수집 - 글로벌 URL dedup으로 페이지 헤더 뉴스 중복 제거
수집 데이터 (스키마, 실구현):
@dataclass
class HomeFeedItem:
rank: int # 노출 순위 1~30 (탭별)
title: str
tab: str # 어느 탭에서 수집 (추천/패션뷰티/...)
domain: str # URL 도메인 (blog.naver.com / in.naver.com / ...)
category: str # 도메인 또는 탭 기반 카테고리
keywords: list[str] # 제목에서 추출한 키워드 (top 8)
blog_url: str | None
thumbnail_url: str | None
collected_at: datetime
section: str # "home" (기본)실측 수집량 (2026-05-13): 5개 탭 × 20건 → 글로벌 dedup 후 74건 (15초)
도메인 분포 (블로그 점수화에 유의미):
in.naver.com(인플루언서): 27%happybean.naver.com(펀딩, 트렌드 신호): 16%m.naver.com(네이버 메인): 18%blog.naver.com/m.blog.naver.com: 8%cafe.naver.com: 5%- 노이즈(news 등): 7% 미만
수집 로직 (Selenium):
def collect_naver_home_feed() -> list[HomeFeedItem]:
driver = webdriver.Chrome(options=stealth_options)
driver.get("https://m.naver.com/")
# 1. 홈피드 카드 50개 스크롤 로드
for _ in range(5):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
# 2. 카드 추출 (DOM 셀렉터)
cards = driver.find_elements(By.CSS_SELECTOR, "div[data-section='home-feed'] article")
items = []
for idx, card in enumerate(cards, 1):
items.append(HomeFeedItem(
rank=idx,
title=card.find_element(By.CSS_SELECTOR, "h3").text,
blog_id=card.get_attribute("data-blog-id"),
category=infer_category(card),
keywords=extract_keywords(card.find_element(...).text),
thumbnail_url=card.find_element(By.TAG_NAME, "img").get_attribute("src"),
collected_at=datetime.now(),
section="home"
))
driver.quit()
return items안정성 보강:
- 재시도: DOM 셀렉터 실패 시 3회 재시도 (5초 간격)
- 백업 셀렉터: 주 셀렉터 + 대체 셀렉터 2개 (네이버 DOM 변경 대응)
- 헤더 위장: User-Agent 모바일, 자연스러운 스크롤 (random sleep)
- rate limit: 한 번에 50개만, 1일 1회 (08:10 자동 스케줄)
- 실패 알림: Slack 또는 vault
system/logs/module1-errors.log
위험:
- ⚠️ 네이버 DOM 자주 변경 → 월 1회 셀렉터 점검 필요
- ⚠️ 봇 차단 가능성 → 너무 자주 호출 금지 (1일 1회 권장)
- ⚠️ 로그인 필요한 영역은 제외 (개인 추천 피드)
4.3 방식 B: 수동 CSV 입력 (백업)
용도: Selenium 실패 시 또는 정확한 데이터가 필요할 때.
CSV 포맷 (00-Inbox/blog/home-feed-YYYY-MM-DD.csv):
rank,title,category,keywords,blog_url
1,"같은 20평인데 우리집만 좁아 보이는 이유","인테리어","인테리어;공간배치;원룸","https://blog.naver.com/abc"
2,"제주도 아이랑 가기 좋은 카페 5곳","육아여행","제주도;카페;아이","https://blog.naver.com/def"
3,"5월 가정의달 다이소 신상 추천","쇼핑","다이소;가정의달;정리","https://blog.naver.com/ghi"
...수동 입력 방법:
- 사용자가 네이버 홈판을 휴대폰으로 5분 스크롤
- 메모장 또는 Obsidian에 50개 제목 + 카테고리 기록
- CSV로 변환 (Claude에게 “이거 CSV로 변환해줘” 요청 가능)
00-Inbox/blog/폴더에 저장- Module 1이 자동으로 픽업
4.4 수집된 홈판 데이터 → 점수 변환 로직
def calc_home_feed_score(niche: str, home_items: list[HomeFeedItem]) -> tuple[float, str]:
"""니치가 홈판에 얼마나 등장하는지 0~100 점수화"""
# 1. 니치의 키워드 추출 ("제주도 + 아이 + 카페" → ["제주도", "아이", "카페"])
niche_keywords = niche.split(" + ")
# 2. 홈판 50개 글에서 키워드 매칭 수 카운트
match_scores = []
for item in home_items:
overlap = len(set(niche_keywords) & set(item.keywords))
if overlap >= 2: # 2개 이상 겹침 = 강한 매칭
match_scores.append(item.rank) # 순위 기록
# 3. 점수 계산: 매칭 개수 + 평균 순위
if not match_scores:
score = 30 # 매칭 없음 = 30점 (홈판 미노출 = 기회 또는 위험)
reason = "현재 홈판에 직접 매칭 없음 (블루오션 또는 트렌드 외)"
else:
avg_rank = sum(match_scores) / len(match_scores)
count_bonus = min(len(match_scores) * 10, 40) # 매칭 수 보너스 (최대 40)
rank_score = max(60 - avg_rank, 0) # 상위 순위 보너스
score = min(count_bonus + rank_score, 100)
reason = f"홈판 {len(match_scores)}건 매칭, 평균 순위 {avg_rank:.1f}위"
return score, reason해석 가이드:
- 70점↑: 현재 홈판에 강하게 노출되는 트렌드 — 즉시 진입 권장
- 50~70점: 일부 매칭 — 품질 좋으면 노출 가능
- 30~50점: 매칭 없음 — 블루오션 또는 트렌드 외
- 30점: 미매칭 기본값 — 다른 신호로 판단 필요
4.5 수집 스케줄
일일 수집 (Selenium):
시간: 매일 08:10
대상: PC 5개 탭(추천/패션뷰티/리빙푸드/지식/건강) 카드 60~120건
저장: SQLite home_feed 테이블 + system/data/home-feed-YYYY-MM-DD.jsonl
주간 분석 (Module 1 실행):
시간: 매주 금요일 14:00
입력: 최근 7일 홈판 데이터 ~500건
분석: Claude 1회 통합 호출 → 니치 150개 생성 + 점수화 + 게이트 + 다양성
출력: vault `20-Personal/logs/module1-{YYYY-WXX}.md`5. MVP 알고리즘 (Phase 1)
5.1 LLM-as-a-Judge + 홈판 실측 하이브리드
┌────────────────────────────────────────────────┐
│ 1. 홈판 데이터 수집 (Selenium or CSV) │
│ → 50개 글 제목·카테고리·키워드 추출 │
└────────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────────┐
│ 2. 시드 키워드 5개 입력 + Claude 호출 │
│ → 150개 세부 니치 조합 생성 │
└────────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────────┐
│ 3. 4가지 평가 (병렬 처리) │
│ a. 홈판_인기도: 홈판 데이터 매칭 (실측 35% │
│ + Claude 추정 65%) │
│ b. C-Rank_적성: Claude 평가 │
│ c. 수익화_가능: Claude + 룩업 테이블 │
│ d. 경쟁_강도: Claude 평가 │
└────────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────────┐
│ 4. 종합 점수 + 게이트 룰 + 다양성 보장 │
│ → 상위 N개 추천 │
└────────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────────┐
│ 5. SQLite 저장 + Markdown 리포트 생성 │
│ → 20-Personal/logs/module1-W19.md │
└────────────────────────────────────────────────┘
5.2 Claude Prompt 구조 (배치 처리)
System:
너는 네이버 블로그 니치 평가 전문가다.
사용자 프로필, 홈판 추세, 니치 후보를 받아 4가지 기준으로 평가한다.
- 홈판_인기도 (0~100): 현재 홈판 매칭도 + 검색량·시의성·트렌드 종합
- C_Rank_적성 (0~100): 사용자 전문성과 매칭도
- 수익화_가능 (0~100): 제휴 상품·광고 CPM·지식 창업
- 경쟁_강도 (0~100): 높을수록 경쟁 치열 (역지표)
반드시 JSON 배열로 응답, 각 항목에 reasoning 1줄 포함.
User:
사용자 프로필: <자기소개 200자>
현재 월: 2026-05
현재 네이버 홈판 추세 (50건):
- [1위] "같은 20평인데 우리집만 좁아 보이는 이유" (인테리어)
- [2위] "제주도 아이랑 가기 좋은 카페 5곳" (육아여행)
- [3위] "5월 가정의달 다이소 신상 추천" (쇼핑)
...
니치 후보 (150개):
- "제주도 + 가족 + 유아"
- "제주도 + 혼자 + 감성"
...
Output JSON:
[{
"niche": "제주도 + 가족 + 유아",
"popularity": 78,
"popularity_reason": "홈판 2위 직접 매칭, 5월 가정의달 시의성 ★",
"affinity": 88,
"affinity_reason": "워킹맘 프로필과 강한 매칭",
"monetization": 65,
"monetization_reason": "키즈 호텔/렌터카 제휴, 수수료 5~10%",
"competition": 55,
"competition_reason": "중형 블로거 다수, 신인 진입 가능"
}, ...]5.3 종합 점수 계산 (Python)
def calculate_score(item: dict) -> dict:
"""4개 하위 점수 → 종합 점수"""
score = (
item["popularity"] * 0.30 +
item["affinity"] * 0.30 +
item["monetization"] * 0.25 +
(100 - item["competition"]) * 0.15
)
return {
**item,
"total_score": round(score, 1),
"tier": "A" if score >= 80 else "B" if score >= 70 else "C"
}6. 편향 보정 메커니즘
6.1 단일 지표 압도 방지
문제: 수익화 100점인데 경쟁 강도 100점 → 종합 점수 76점 (선정됨) → 실제로는 진입 불가 영역
해결: 게이트 키퍼 룰
def apply_gates(item: dict) -> dict:
# Gate 1: 경쟁 강도 90↑ 시 즉시 탈락
if item["competition"] >= 90:
item["tier"] = "REJECTED"
item["reject_reason"] = "경쟁 과열"
# Gate 2: C-Rank 적성 30↓ 시 탈락
if item["affinity"] < 30:
item["tier"] = "REJECTED"
item["reject_reason"] = "적성 부족"
# Gate 3: 모든 지표 50↓ 시 탈락
sub_scores = [item["popularity"], item["affinity"],
item["monetization"], 100-item["competition"]]
if all(s < 50 for s in sub_scores):
item["tier"] = "REJECTED"
item["reject_reason"] = "전 영역 약세"
return item6.2 다양성 보장 (카테고리 분산)
문제: 상위 30개가 모두 “다이소 정리” 계열이면 콘텐츠 단조로움 해결: 카테고리별 상한 (예: 한 카테고리 최대 10개)
def diversify(items: list, max_per_category: int = 10) -> list:
from collections import Counter
counter = Counter()
result = []
for item in sorted(items, key=lambda x: -x["total_score"]):
cat = item["category"]
if counter[cat] < max_per_category:
result.append(item)
counter[cat] += 1
return result7. 데이터 저장 (SQLite 스키마)
-- 7.1 니치 평가 결과
CREATE TABLE niches (
id INTEGER PRIMARY KEY AUTOINCREMENT,
niche TEXT NOT NULL,
seed_keyword TEXT,
category TEXT,
-- 하위 점수
popularity REAL,
popularity_reason TEXT,
affinity REAL,
affinity_reason TEXT,
monetization REAL,
monetization_reason TEXT,
competition REAL,
competition_reason TEXT,
-- 종합
total_score REAL,
tier TEXT, -- A / B / C / REJECTED
reject_reason TEXT,
-- 메타
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
week_id TEXT, -- 2026-W19 (주차 식별)
used INTEGER DEFAULT 0 -- 1 = 이미 글 발행함
);
CREATE INDEX idx_score ON niches(total_score DESC);
CREATE INDEX idx_week ON niches(week_id);
-- 7.2 홈판 추세 데이터 (Selenium 수집)
CREATE TABLE home_feed (
id INTEGER PRIMARY KEY AUTOINCREMENT,
collected_at TIMESTAMP NOT NULL,
section TEXT, -- home / blog_top / datalab
rank INTEGER,
title TEXT,
blog_id TEXT,
category TEXT,
keywords TEXT, -- JSON array
thumbnail_url TEXT,
raw_html TEXT -- 디버깅용 백업
);
CREATE INDEX idx_collected ON home_feed(collected_at DESC);
CREATE INDEX idx_section ON home_feed(section);8. 출력 형식 (Vault Markdown 리포트)
# Module 1 주간 리포트 - 2026-W19 (2026-05-13)
## 요약
- 홈판 수집: 350건 (7일치)
- 후보 생성: 150개
- 선정 (70점↑): 38개
- A티어 (80점↑): 12개
- 추천 카테고리: 육아 / 인테리어 / 5월 가족
## 홈판 추세 TOP 5 (이번 주)
1. "같은 20평인데 우리집만 좁아 보이는 이유" - 인테리어
2. "제주도 아이랑 가기 좋은 카페 5곳" - 육아여행
3. "5월 가정의달 다이소 신상 추천" - 쇼핑
4. "초등 자녀 학용품 비교" - 교육
5. "워킹맘 일주일 식단 정리" - 요리
## A티어 추천 (12개)
### 1. [92점] 초등 2학기 학용품 추천 (5월 마무리 ~ 8월 신학기)
- 인기도: 88 (홈판 4위 직접 매칭 + 시의성 ★)
- 적성: 95 (워킹맘 강매칭)
- 수익화: 88 (다이소·문구점 제휴)
- 경쟁: 55 (중형 진입 가능)
- 추천 제휴: 다이소 / 모닝글로리 / 알파문구
### 2. [89점] 다이소 정리함 5월 신상 비교
...9. 검증 계획
9.1 Dry-run 검증 (개발 중)
시나리오 1: 명백한 좋은 니치
- 입력: 워킹맘 프로필 + “초등 육아” + 홈판 데이터(5월 가정의달)
- 기대: “초등 2학기 학용품” 80점↑
시나리오 2: 명백히 나쁜 니치
- 입력: 워킹맘 프로필 + “비트코인”
- 기대: “비트코인 단타” 50점 미만, REJECTED
시나리오 3: 홈판 매칭 강함
- 입력: 워킹맘 프로필 + “정리정돈” + 홈판 1위가 “20평 좁아보이는 이유”
- 기대: “20평 가족공간 정리법” 인기도 90점↑
9.2 실측 검증 (Phase 4, 2026-09)
- 추천된 A티어 니치로 30편 발행
- 4주 후 CTR, 체류시간, 수익 측정
- 점수 vs 실제 성과 상관관계 분석 (Pearson r ≥ 0.6 목표)
- 가중치 자동 튜닝 (선형 회귀)
10. 구현 일정
| Phase | 일정 | 산출물 | 상태 |
|---|---|---|---|
| 1 MVP | 2026-05-13 ~ 05-16 | core/Selenium/Claude/scorer/gate/report | 🟢 Day 3/6 완료 |
| 2 API 통합 | 2026-06 | DataLab / Google Trends / Naver Shopping | ⏳ |
| 3 스마트블록 크롤링 | 2026-07 | 경쟁 강도 실측 + 검색 결과 분석 | ⏳ |
| 4 튜닝 | 2026-09 | 가중치 회귀 + 게이트 룰 정교화 | ⏳ |
MVP 실측 결과 (2026-05-13)
| 단계 | 측정값 |
|---|---|
| 홈판 수집 (5개 탭) | 74건 / 15초 |
| Claude 1회 호출 (50 후보) | $0.40 / 90초 / 8,369 출력 토큰 |
| 캐시 생성 | 29,821 토큰 (Claude Code system prompt) |
| 운영 비용 추정 | 월 ~$4 (주간 1회 × 150 후보) |
11. 핵심 결정 사항
- Selenium + 수동 CSV 병행 — Selenium 실패에 대비한 백업 경로 확보
- MVP는 LLM-as-a-Judge + 실측 홈판 — 1주일 내 가동, 정확도 균형
- 가중치는 30/30/25/15 고정 — 운영 데이터 4주 누적 후 조정
- 홈판 인기도 내부 가중치 35/25/20/20 — 실측 데이터(35%) 최우선
- 컷오프 70점 — 너무 높으면 후보 부족, 너무 낮으면 노이즈
- 3중 게이트 룰 — 단일 지표 압도 / 적성 부족 / 전 영역 약세 자동 탈락
- 카테고리 다양성 보장 — 한 카테고리 최대 10개
- 홈판 수집 1일 1회 — 봇 차단 위험 최소화
12. 위험 및 대응
| 위험 | 영향 | 확률 | 대응 |
|---|---|---|---|
| 네이버 DOM 변경 → Selenium 깨짐 | Module 1 중단 | 중 | 월 1회 셀렉터 점검 + 수동 CSV 백업 |
| 봇 차단 (IP·UA) | 수집 실패 | 낮 | 1일 1회 + UA 위장 + 수동 백업 |
| Claude 평가 편향 | 점수 신뢰도 ↓ | 중 | Phase 4에서 실측 보정 + 가중치 튜닝 |
| 카테고리 분류 오류 | 다양성 보장 실패 | 낮 | 룩업 테이블 + 수동 보정 |
관련 문서
- 부모: 블로그-홈판-노출-수익화-자동화-프로젝트
- 알고리즘 이론: 네이버-홈판-알고리즘
- 수익화 이론서: 2026-05-12-네이버-블로그-수익화-이론서
- SEO 템플릿: 블로그-발행-SEO-템플릿
작성: 2026-05-13 최종 수정: 2026-05-13 (Day 1~6 완료, MVP 완성) 상태: 🟢 MVP 완성 — 자동 운영 시작 (launchd 등록) 다음 단계: 4주 운영 데이터 누적 후 가중치 튜닝 (Phase 4)