# 보험저널 섹션별 스크래핑 — rss_fetcher.py 수정

## 배경
보험저널 RSS(`allArticle.xml`)는 전체 기사를 반환하며 섹션/카테고리 정보가 없다.
제이회장님이 4개 특정 섹션만 사용하도록 지시. 섹션별 RSS는 존재하지 않으므로 HTML 스크래핑으로 대체한다.

## 대상 파일
`/home/jay/projects/ThreadAuto/crawler/rss_fetcher.py`

## 작업 내용

### 1. 기존 보험저널 RSS 항목 제거
```python
# 제거:
"보험저널": "https://www.insjournal.co.kr/rss/allArticle.xml",
```

### 2. 보험저널 4개 섹션 URL 추가
```python
INSJOURNAL_SECTIONS: dict[str, str] = {
    "보험저널-정책": "https://www.insjournal.co.kr/news/articleList.html?sc_sub_section_code=S2N1&view_type=sm",
    "보험저널-보험종합": "https://www.insjournal.co.kr/news/articleList.html?sc_sub_section_code=S2N27&view_type=sm",
    "보험저널-전문가칼럼": "https://www.insjournal.co.kr/news/articleList.html?sc_sub_section_code=S2N5&view_type=sm",
    "보험저널-기자의눈": "https://www.insjournal.co.kr/news/articleList.html?sc_sub_section_code=S2N41&view_type=sm",
}
```

### 3. HTML 스크래핑 함수 추가
- `fetch_insjournal_section(url: str) -> list[dict]` 함수 추가
- 각 섹션 페이지에서 기사 목록을 추출하여 RSS와 동일한 포맷 반환:
  - `title`: 기사 제목
  - `link`: 기사 URL (절대 경로)
  - `summary`: 기사 요약 (있으면)
  - `published`: 발행일
- HTTP 요청 시 User-Agent 헤더 필수: `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36`
  - insjournal.co.kr은 User-Agent 없으면 403 반환
- HTML 파싱은 `BeautifulSoup` 사용 (requirements.txt에 `beautifulsoup4` 추가 필요 시 확인)

### 4. fetch_all_feeds()에 통합
- 기존 RSS 피드 루프 후에 보험저널 섹션 스크래핑 루프 추가
- 동일하게 source 필드에 섹션명 설정
- 개별 섹션 실패 시 해당 섹션만 건너뛰고 계속 수집

### 5. HTML 구조 분석 참고
insjournal.co.kr의 기사 목록 페이지에서 기사 항목 추출 시:
- curl로 실제 HTML을 먼저 확인하고 적절한 CSS 셀렉터를 사용할 것
- `curl -s "URL" -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"` 로 확인
- 기사 항목은 보통 `<li>` 또는 `<div class="...">` 안에 제목, 링크, 날짜가 포함됨

## 체크리스트
- [ ] 기존 `"보험저널"` RSS 항목 제거
- [ ] `INSJOURNAL_SECTIONS` dict 추가
- [ ] `fetch_insjournal_section()` 함수 구현
- [ ] `fetch_all_feeds()`에 통합
- [ ] 테스트: 각 섹션에서 기사가 정상 수집되는지 확인 (python3 -c 등으로 실행)
- [ ] beautifulsoup4가 설치되어 있는지 확인, 없으면 설치
- [ ] 기존 RSS 피드들은 변경하지 않을 것 (보험저널만 수정)

## 주의사항
- 다른 RSS 피드 항목은 절대 건드리지 말 것
- User-Agent 헤더 필수 (403 방지)
- 기존 `fetch_feed()`, `fetch_all_feeds()` 함수 시그니처를 변경하지 말 것
- 반환 포맷은 기존과 동일: `{"title": str, "link": str, "summary": str, "published": str, "source": str}`
