# 2025-10-21 Platum/TheVC 크롤러 복구 및 Neo4j 뉴스 데이터 갱신

**작성일**: 2025-10-21  
**작성자**: Codex (51123 서버 관리자)  
**상태**: 완료

---

## 배경
- Platum/TheVC 크롤러가 robots.txt 차단으로 판단되어 삭제된 상태라 최신 뉴스가 누락되고 있었음.
- 기존 `crawler_utils.py`가 BOM이 포함된 robots.txt를 `can_crawl=False`로 잘못 해석하고, 브라우저 전용 압축(`br`)을 사용해 본문 파싱에 실패하는 문제가 확인됨.
- 최신 Platum 데이터 15페이지 분량을 확보한 뒤 Neo4j 뉴스 그래프를 갱신해야 함.

## 조치 요약
1. **크롤러 및 유틸리티 복구**
   - `startup_crawl/crawl_platum.py`, `startup_crawl/crawl_thevc.py`를 재작성하여 robots 허용 여부를 재검증하고, 요청 간 랜덤 대기(3~6초)로 서버 부하를 낮춤.
   - `startup_crawl/crawler_utils.py`에서
     - BOM 제거 후 `RobotFileParser.parse()`로 직접 로딩,
     - `Accept-Encoding: gzip, deflate`로 조정하여 브로틀리 응답 문제 해결,
     - 로그 경로를 `/mnt/hdd/data/DATA/startup_crawl/logs/` 등 접근 가능한 위치로 자동 선택.
   - `startup_crawl/run_all_crawlers.sh`를 순차 실행 방식으로 변경 (각 크롤러 별 로그).

2. **Platum 최신 데이터 수집**
   - 실행: `cd /mnt/hdd/data/DATA/startup_crawl && python3 crawl_platum.py 15`
   - 생성 파일: `startup_crawl/platum/articles_page_1_to_15.json` (총 180건, 2025-10-21 기사 포함).

3. **Neo4j 로더 개선 및 실행**
   - `load_all_to_neo4j.py`에 `--reset`, `--news-only` 옵션과 `extract_articles()` 헬퍼 추가.
   - 뉴스 JSON 구조가 dict/list 혼재된 경우에도 URL 기준 dedupe 수행.
   - 실행: `python3 load_all_to_neo4j.py --news-only`
     - 기존 그래프 유지, 뉴스만 MERGE로 갱신.
     - 결과 통계: `NewsArticle` 7,494개, `MENTIONS` 1,574개.

## 결과 및 영향
- Platum/TheVC 크롤러가 복구되어 향후 `run_all_crawlers.sh` 실행 시 해당 소스가 정상 반영됨.
- Neo4j 뉴스 노드가 최신 Platum 기사까지 포함하도록 갱신됨.
- `load_all_to_neo4j.py`를 배치에서 호출할 경우 입력 대기 없이 옵션으로 제어 가능해짐.

## 주의 사항
- TheVC는 여전히 `Disallow: /` 정책이므로 실제 크롤링은 robots 허용 시점에만 진행해야 함(스크립트는 `can_crawl` 검사 후 자동 중단).
- 크롤러 실행 전 `/mnt/hdd/data/DATA/startup_crawl/platum/checkpoint.json`을 확인하여 필요한 범위(페이지 수)를 조절할 것.
- Neo4j 로딩 시 전체 리셋이 필요하면 `--reset` 옵션을 명시적으로 사용해야 함.

## 다음 단계
1. `run_all_crawlers.sh`에 Platum 페이지 수(예: 15) 조정 및 주기적 실행 스케줄 검토.  
2. TheVC robots 정책 변경 여부를 주기적으로 점검하고 허용 시 `crawl_thevc.py` 실행 결과 검증.  
3. 뉴스-스타트업 매칭 정확도를 높이기 위한 제목/본문 키워드 기반 보완 로직 검토.  
4. 필요 시 Neo4j 로더에 증분 로딩 옵션(날짜 필터)을 추가하여 실행 시간을 단축.
