# InfoKeyword 근거 리포트 캡처 불일치 개선 — 3Phase 전체

## 태스크 ID: task-926.1
## 한정위임: Phase 3까지 완료

---

## 배경

task-925.1 분석 결과, 근거 리포트의 스크린샷과 실제 크롤링 데이터가 불일치하는 5가지 근본 원인이 규명됨.
이 작업에서 3단계에 걸쳐 전부 개선한다.

**분석 보고서 참조**: `memory/reports/task-925.1.md`

---

## Phase 1: 즉시 적용 (영향도 높음, 난이도 낮음)

### 1-1. 스크린샷 URL을 크롤링 URL과 통일

**파일**: `/home/jay/projects/InfoKeyword/worker/reporter/screenshot.py`

현재 스크린샷은 `where=blog`만 사용하지만, 크롤링은 `ssc=tab.blog.all&sm=tab_jum`을 사용.
스크린샷 URL을 크롤링과 동일하게 맞춘다.

**방법**: `screenshot.py`의 URL 매핑과 `blog_search.py`의 `_BLOG_SEARCH_URL` 상수를 공유하거나, 최소한 동일 파라미터 사용.

### 1-2. 페이지 로딩 대기 전략 개선

**파일**: `/home/jay/projects/InfoKeyword/worker/reporter/screenshot.py`

현재 `domcontentloaded` + 고정 2초 대기 → 동적 렌더링 미완료 상태 캡처 가능.

**변경**: 검색 결과 컨테이너 셀렉터(`wait_for_selector`) 기반 대기 + 여유 시간 추가.
네이버 블로그 검색 결과의 실제 DOM 셀렉터를 확인하여 적용할 것.

---

## Phase 2: 단기 적용 (영향도 높음, 난이도 중간)

### 2-1. 광고 영역 CSS 숨김 후 캡처

**파일**: `/home/jay/projects/InfoKeyword/worker/reporter/screenshot.py`

크롤링에서는 `_is_ad()`로 광고를 스킵하지만, 스크린샷에는 광고가 그대로 보임.
캡처 전 JavaScript로 광고 요소를 `display: none` 처리.

**참고**: `blog_search.py`의 `_is_ad()` 함수에서 사용하는 광고 판별 기준(CSS 클래스/속성)을 확인하여 동일한 요소를 숨길 것.

### 2-2. 크롤링 완료 후 스크린샷 시점 조정

**파일**: `/home/jay/projects/InfoKeyword/worker/pipeline/analyzer.py`

현재 `asyncio.gather`로 크롤링과 스크린샷이 독립 병렬 실행됨 (line 381-384).
스크린샷을 크롤링 완료 후에 실행하도록 순서를 조정하여 시간차를 최소화.

**주의**: 성능 영향을 최소화할 것. 스크린샷만 순차로 바꾸고, 다른 step 간 병렬은 유지.

---

## Phase 3: 구조 통합 (영향도 중간, 난이도 높음)

### 3-1. 크롤링과 스크린샷 Playwright 통합

**현재**: 크롤링은 `httpx.AsyncClient` (HTTP 직접), 스크린샷은 Playwright Chromium → 별도 세션으로 다른 결과 가능.

**목표**: 블로그 검색 크롤링도 Playwright 기반으로 전환하여, 동일 페이지에서 크롤링 + 스크린샷 수행.

**구현 방향**:
- `blog_search.py`에 Playwright 기반 크롤링 함수 추가 (기존 httpx 함수는 fallback으로 유지)
- Playwright로 페이지 로드 → DOM에서 블로그 목록 파싱 → 같은 페이지 스크린샷
- `analyzer.py`에서 통합 함수 호출

**주의사항**:
- 기존 `httpx` 기반 로직은 삭제하지 말고 fallback으로 유지 (Playwright 실패 시 사용)
- Playwright 브라우저 인스턴스 관리: 기존 screenshot.py의 브라우저 세션 재활용
- 성능: Playwright 크롤링이 httpx보다 느릴 수 있음 → 허용 가능한 수준인지 측정

---

## 전체 검증 기준

1. 동일 키워드로 분석 시, 스크린샷의 블로그 목록 순서와 크롤링 rank가 일치
2. 스크린샷에 광고 영역이 표시되지 않음
3. 페이지 미로딩 상태의 스크린샷이 없음 (빈 영역, 로딩 스피너 없음)
4. 기존 7단계 분석 로직에 영향 없음 (판정 결과 동일)
5. 기존 httpx 크롤링이 fallback으로 유지됨
6. pytest 기존 테스트 전체 통과 + 신규 테스트 추가
7. pyright/black/isort 통과

## 수정 금지
- 7단계 분석 판정 로직 변경 금지 (threshold, 판정 기준)
- 기존 리포트 데이터 삭제 금지
- config.py의 기존 threshold 값 변경 금지