# 네이버 블로그 경쟁 분석 크롤링 셀렉터 수정

## 배경
- `/api/naver-blog/competition-analysis` 경쟁 분석이 결과 0건 반환
- 원인: `_extract_blog_urls_from_search()` (server.py:313~354)의 CSS 셀렉터가 현재 네이버 HTML 구조와 불일치
- 네이버 검색 응답은 정상 (200 OK, 516KB, blog.naver.com 99회 언급)
- 하지만 셀렉터 4개 모두 매칭 0건:
  - `a.title_link` → 0
  - `div.title_area a` → 0
  - `a.api_txt_lines.total_tit` → 0
  - `div.total_tit a` → 0

## 수정 대상
- `/home/jay/workspace/dashboard/server.py` — `_extract_blog_urls_from_search()` 함수 (라인 313~354)

## 수정 방법
1. 실제 네이버 검색 HTML을 분석하여 현재 사용되는 CSS 클래스/구조 파악:
   ```bash
   python3 -c "
   import requests
   from bs4 import BeautifulSoup
   resp = requests.get('https://search.naver.com/search.naver', 
     params={'query': '보험대리점'},
     headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'},
     timeout=10)
   soup = BeautifulSoup(resp.text, 'html.parser')
   # blog.naver.com 링크를 가진 a 태그 찾기
   for a in soup.find_all('a', href=True):
     if 'blog.naver.com' in a['href']:
       print('classes:', a.get('class'))
       print('parent:', a.parent.name, a.parent.get('class'))
       print('href:', a['href'][:80])
       print('text:', a.get_text(strip=True)[:50])
       print('---')
   "
   ```
2. 파악된 클래스명으로 셀렉터 교체
3. `_parse_blog_url()`도 새 URL 패턴에 대응하는지 확인 (라인 357~)

## 테스트
1. curl 테스트:
   ```bash
   curl -X POST http://localhost:8000/api/naver-blog/competition-analysis \
     -H "Content-Type: application/json" \
     -d '{"keyword":"보험대리점"}'
   ```
2. homePosts, blogPosts에 최소 1건 이상 반환되는지 확인
3. 각 post에 charCount, keywordCount 등 메트릭이 포함되는지 확인

## 히스토리 저장 검증
- 경쟁 분석 성공 후 DB에 히스토리가 저장되는지 확인:
  ```bash
  python3 -c "import sqlite3; c=sqlite3.connect('/home/jay/workspace/dashboard/data/naver_blog_history.db'); print(c.execute('SELECT COUNT(*) FROM competition_analysis').fetchone())"
  ```

## 키워드 분석 히스토리도 확인
- `/api/naver-blog/keyword-analysis` 호출 후 keyword_analysis 테이블에 저장되는지도 검증
- 저장 안 되면 해당 endpoint에도 히스토리 저장 로직 추가

## 보고서
`/home/jay/workspace/memory/reports/task-1566.md`에 작성