# task-898.1 완료 보고서: Step5 블로그 Top10 홍보성 분석 로직 디버깅

## SCQA

**S**: InfoKeyword 워커의 7단계 분석 파이프라인에서 Step5(블로그 Top10 홍보성 분석)가 실행되고 있으며, 워커(localhost:8100)는 정상 가동 중이다.

**C**: `_is_ad()` 함수가 `_fe_view_power_content` CSS 클래스를 광고 판별 기준으로 사용하고 있으나, Naver가 이 클래스를 **모든 블로그 검색 결과 아이템**에 적용하도록 변경하여 100% 오탐 발생 → 블로그 결과 0건 반환 → Step5 분석 불가. 이전 작업(task-891.1)이 워킹 트리에서 수정했으나 pyright hang으로 미커밋 상태.

**Q**: `_is_ad()`의 오탐을 제거하고, Step5 홍보성 분석이 정상적으로 10건의 블로그를 분석하도록 할 수 있는가?

**A**: `_fe_view_power_content` 클래스 기반 광고 감지를 제거하고, 정확한 신호(도메인/heatmap/속성)만 유지하여 수정 완료. 3개 키워드 E2E 검증에서 블로그 10건 정상 수집 + Step5 분석 정상 동작 확인. pytest 61건 관련 테스트 전체 통과.

---

## 수정 내용

### 1. 주요 수정: blog_search.py — `_is_ad()` 오탐 제거
- **파일**: `worker/crawler/blog_search.py`
- **원인**: `_AD_CLASS = "_fe_view_power_content"` 상수 + 클래스 기반 감지 로직이 모든 아이템을 광고로 판정
- **수정**: `_AD_CLASS` 상수 및 클래스 기반 감지 코드 6줄 제거
- **유지**: 도메인 기반(`integration_66.naver`), 리다이렉트(`adcr/ader.naver.com`), heatmap 속성(`articleSourceJSX_adtag`), `data-power-content-url` 속성 감지

### 2. 부수 수정: blog_content.py — `_INTERNAL_DOMAINS` 확장
- **파일**: `worker/crawler/blog_content.py`
- **원인**: 정규식이 `blog.naver.com`, `m.blog.naver.com`만 필터링 → `www.naver.com`, `help.naver.com`, `nid.naver.com` 등 시스템 링크가 "외부 링크"로 반환
- **수정**: `naver.com` 전체(모든 서브도메인) + `naver.net` 포함하도록 정규식 확장
- **영향**: downstream `detect_external_links()`가 이미 올바르게 필터링하므로 최종 분석 결과에는 영향 없음. 데이터 노이즈 제거 목적.

### 3. 테스트 수정: test_blog_search.py
- **파일**: `worker/tests/test_blog_search.py`
- **수정**: `test_is_ad_detects_power_content_class` 테스트의 기대값을 `True → False`로 변경
- **사유**: Naver가 모든 블로그 검색 결과에 `_fe_view_power_content` 클래스를 적용하므로, 이 클래스만으로는 광고 판별 불가

---

## 검증 결과

### pytest (관련 61건)
- `worker/tests/test_blog_search.py`: 9/9 PASSED
- `tests/test_external_links.py`: 22/22 PASSED
- `tests/test_phone_address.py`: 19/19 PASSED
- `tests/test_attachment.py`: 11/11 PASSED

### ⚠️ 기존 테스트 실패 5건 (본 작업 범위 외)
- `test_generate_keywords_calls_claude_cli` — Claude CLI mock 불일치
- `test_generate_keywords_retry_on_failure` — Claude CLI 재시도 로직 변경
- `test_parse_count_less_than` — `_parse_count("<10")` 반환값 불일치
- `test_cors_headers` — 환경별 CORS 설정 차이
- `test_cors_origins_configured` — 환경별 CORS 원본 차이

### E2E 검증 (3개 키워드)
- `강아지 사료 추천`: 10건 수집, 홍보 4건/정보 6건, ratio=0.4 (PASS)
- `인테리어 업체 추천`: 10건 수집, 홍보 10건/정보 0건, ratio=1.0 (FAIL — 상업 키워드로 정상)
- `성형외과 추천`: 10건 수집 확인 (수정 전 0건 → 수정 후 10건)

### pyright
- 60초 timeout 초과 (task 주의사항에 따라 스킵, InfoKeyword 프로젝트 known issue)

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **`_is_ad()` _fe_view_power_content 오탐** — 클래스 기반 감지 코드 제거하여 해결 (`blog_search.py:43-61`)
2. **`_INTERNAL_DOMAINS` 정규식 불완전** — naver.com 전체 서브도메인 포함하도록 확장 (`blog_content.py:29`)
3. **`test_is_ad_detects_power_content_class` 테스트 오류** — Naver HTML 현실에 맞게 기대값 수정 (`test_blog_search.py:75-87`)

---

## 생성/수정 파일 목록

| 파일 | 변경 유형 |
|------|-----------|
| `worker/crawler/blog_search.py` | 수정 (광고 감지 오탐 제거) |
| `worker/crawler/blog_content.py` | 수정 (내부 도메인 정규식 확장) |
| `worker/tests/test_blog_search.py` | 수정 (테스트 기대값 현실화) |

## 커밋
- `e55bb4e` [task-898.1] Fix Step5 blog ad false positive: remove _fe_view_power_content class detection

## 머지 판단
- **머지 필요**: No (master 브랜치 직접 커밋, 시스템 작업)
