# AI News 자동 투고 시스템 - 크롤링 방식 변경 **작업일**: 2025년 11월 24일 **담당**: Claude Code **프로젝트**: AI News Auto Post System --- ## 개요 AI News 자동 투고 시스템의 뉴스 수집 방식을 **WebSearch 방식에서 RSS Feed 방식으로 변경**하여, 24시간 이내의 최신 뉴스를 안정적으로 5개 이상 확보할 수 있도록 개선했습니다. --- ## 문제점 ### 발생한 문제 매일 아침 8시 cron job 실행 시, WordPress에 투고되는 기사가 **1개만** 생성되는 문제가 발생했습니다. ### 원인 분석 **WebSearch 방식의 한계**: ``` 수집: 21-30건 ↓ 24시간 필터 ↓ 결과: 1건만 ❌ ``` - WebSearch로 수집한 뉴스의 대부분이 24시간을 초과 - 검색 키워드를 늘려도 오래된 기사가 다수 포함됨 - 시간대에 따라 24시간 이내 뉴스가 부족 ### 로그 증거 ``` [NewsCollector] 24時間超過で除外: Jeff Bezos... (167.0시간 전) [NewsCollector] 24時間超過で除外: As consumers... (167.0시간 전) [NewsCollector] 24時間超過で除外: AI Startup Cursor... (263.0시간 전) ... [NewsCollector] 24時間フィルタ後: 1件 ← 문제! ``` --- ## 검토한 해결 방안 ### 방안 1: 적응형 시간 필터 - 24시간 → 48시간 → 72시간으로 단계적으로 확대 - **기각 이유**: 사용자가 "48시간은 안됨, 시사성이 중요"라고 지적 ### 방안 2: 시간 필터 완화 (48시간 고정) - 24시간 → 48시간으로 변경 - **기각 이유**: 동일 ### 방안 3: 검색 쿼리 다양화 ⭐ (1차 시도) - 검색 키워드를 대폭 확대 - 일본 언론사 검색 강화 - **결과**: 수집량은 증가했으나 24시간 필터에서 대부분 제외되는 문제는 미해결 ### 방안 4: RSS Feed 방식 ✅ (채택) - 각 언론사의 RSS Feed에서 직접 수집 - 최신 기사를 확실하게 수집 - **채택 이유**: 시사성을 유지하면서 최신 뉴스를 안정적으로 확보 --- ## 구현 내용 ### 1. RSS Parser 도입 ```bash npm install rss-parser ``` ### 2. RSS Feed URL 목록 작성 #### 글로벌 언론사 (6개) - TechCrunch: `https://techcrunch.com/feed/` - Bloomberg Technology: `https://feeds.bloomberg.com/technology/news.rss` - VentureBeat: `https://venturebeat.com/feed/` - The Verge: `https://www.theverge.com/rss/index.xml` - Wired: `https://www.wired.com/feed/rss` - Ars Technica: `https://feeds.arstechnica.com/arstechnica/index` #### 일본 언론사 (3개) - GIGAZINE: `https://gigazine.net/news/rss_2.0/` - ITmedia AI+: `https://rss.itmedia.co.jp/rss/2.0/aiplus.xml` - Impress Watch: `https://www.watch.impress.co.jp/data/rss/1.0/ipw/feed.rdf` **총계**: 9개 RSS Feeds ### 3. news-collector.js 완전 리팩토링 #### Before (WebSearch 방식) ```javascript import { query } from '@anthropic-ai/claude-agent-sdk'; // Claude Agent SDK로 뉴스 검색 const response = query({ prompt: NEWS_SEARCH_PROMPT, options: { model: 'claude-sonnet-4-5', maxTurns: maxTurns, allowedTools: ['WebSearch'], }, }); ``` #### After (RSS Feed 방식) ```javascript import Parser from 'rss-parser'; // RSS Feed 파서 초기화 const parser = new Parser({ timeout: 10000, headers: { 'User-Agent': 'Mozilla/5.0 (compatible; AI-News-Collector/1.0)', }, }); // 모든 RSS Feed에서 병렬로 수집 const feedPromises = RSS_FEEDS.map((feedConfig) => fetchFeedWithRetry(feedConfig) ); const feedResults = await Promise.allSettled(feedPromises); ``` ### 4. 필터링 로직 #### 4단계 필터링 1. **전체 Feed 수집**: 9개의 RSS Feed에서 병렬 수집 2. **AI 관련 필터**: 30개 이상의 키워드로 AI 관련 기사 추출 3. **24시간 필터**: 시사성을 위해 24시간 이내 기사만 선택 4. **중복 제거**: URL 기반으로 중복 기사 삭제 #### AI 관련 키워드 (일부) ```javascript const aiKeywords = [ // 영어 'ai', 'artificial intelligence', 'machine learning', 'deep learning', 'llm', 'large language model', 'gpt', 'openai', 'anthropic', 'claude', 'gemini', 'copilot', 'chatgpt', 'generative ai', 'neural network', 'transformer', 'model', 'nvidia', 'gpu', 'training', 'inference', 'deepmind', 'google ai', 'microsoft ai', 'meta ai', 'amazon ai', // 일본어 '人工知能', '機械学習', '深層学習', 'ディープラーニング', '生成ai', 'チャットgpt', '大規模言語モデル', ]; ``` ### 5. 에러 핸들링 강화 ```javascript // 재시도 로직이 포함된 Feed 수집 async function fetchFeedWithRetry(feedConfig, retries = 2) { for (let attempt = 0; attempt <= retries; attempt++) { try { const feed = await parser.parseURL(url); return articles; } catch (error) { if (attempt < retries) { console.warn(`재시도 중... (${attempt + 1}/${retries + 1})`); await new Promise((resolve) => setTimeout(resolve, 1000 * (attempt + 1))); } else { throw error; } } } } ``` --- ## 테스트 결과 ### Before (WebSearch 방식) ``` 수집: 21-30건 AI 관련 필터: ~20건 24시간 필터: 1건 ❌ 투고: 1건만 ❌ ``` ### After (RSS Feed 방식) ``` 수집: 192건 (9개 RSS Feeds) AI 관련 필터: 81건 24시간 필터: 16건 ✅ 투고: 5건 ✅ ``` ### 상세 로그 ``` [NewsCollector] ニュース収集開始 (RSS Feed版)... [NewsCollector] 対象Feed数: 9 [NewsCollector] 全Feed取得完了: 192件の記事 [NewsCollector] AI関連フィルタ後: 81件 [NewsCollector] 24時間フィルタ後: 16件 [NewsCollector] 重複除去後: 16件 [NewsCollector] ソース別件数: { TechCrunch: 2, Bloomberg: 5, 'The Verge': 5, Wired: 3, GIGAZINE: 1 } [NewsAnalyzer] 5件のニュースを選定しました [WordPress 투고 성공] 투고 ID: 56 URL: https://2025032623012012057904.onamaeweb.jp/blog/2025-11-24-ai-news/ ``` ### 투고된 5개 기사 1. 대형 보험회사가 AI 관련 책임을 보상 대상에서 제외 요청 2. ChatGPT의 조작적 언어 사용으로 인한 비극 관련 집단소송 3. Lenovo가 AI 수요로 인한 '전례 없는' 메모리 부족으로 부품 비축 4. Apple iOS 27은 품질 중심의 'Snow Leopard'형 업데이트 5. Tesla가 AI5 칩 테이프아웃 임박, AI6 개발 시작 --- ## 성과 ### 정량적 개선 | 지표 | Before | After | 개선율 | |------|--------|-------|--------| | 수집 건수 | 21-30건 | 192건 | +540% | | AI 관련 건수 | ~20건 | 81건 | +305% | | 24시간 이내 | 1건 | 16건 | +1500% | | 투고 기사 수 | 1건 | 5건 | +400% | ### 정성적 개선 1. **시사성 유지**: 24시간 필터를 유지하면서 충분한 기사 확보 2. **안정성 향상**: 시간대에 관계없이 안정적으로 5개 이상 확보 3. **처리 속도**: WebSearch 불필요로 고속화 (약 2분) 4. **비용 절감**: Claude API 호출 감소 (분석에만 사용) 5. **신뢰성**: 신뢰할 수 있는 언론사의 RSS Feed만 사용 --- ## 변경 파일 목록 ### 수정된 파일 1. **`lib/news-collector.js`** (완전 리팩토링) - WebSearch 방식 → RSS Feed 방식으로 변경 - 268줄 (신규 구현) 2. **`package.json`** (의존성 추가) - `rss-parser`: RSS Feed 파싱 라이브러리 ### 변경 없는 파일 - `auto-post-ai-news.js` (메인 스크립트) - `lib/news-analyzer.js` (분석 모듈) - `lib/formatter.js` (포맷 모듈) - `lib/wordpress-client.js` (WordPress API 클라이언트) - `config/prompts.js` (프롬프트 정의 - WebSearch용은 사용되지 않지만 잔존) --- ## Cron Job 설정 ### 현재 설정 ```bash 0 8 * * * cd /var/www/tkim.planitai.co.jp/blog/batch/auto-post-ai-news && /usr/bin/node auto-post-ai-news.js >> logs/cron.log 2>&1 ``` - **실행 시간**: 매일 08:00 JST - **로그 저장**: `logs/cron.log` - **동작 확인**: ✅ 정상 ### 다음 실행 예정 - **일시**: 2025년 11월 25일 (월) 08:00 JST - **예상 동작**: - RSS Feed에서 최신 24시간 AI 뉴스 수집 - 영향력 큰 5개 선정 - WordPress 투고 (제목: "2025/11/25 AI News") --- ## 향후 확장 계획 ### 우선순위: 높음 - [ ] 추가 RSS Feed 소스 검토 - Reuters Technology - Forbes Technology - 일경xTECH (RSS 확인 필요) ### 우선순위: 중간 - [ ] RSS Feed 수집 타임아웃 조정 - [ ] AI 관련 키워드 최적화 - [ ] 소스별 우선순위 설정 ### 우선순위: 낮음 - [ ] 미사용 WebSearch 관련 코드 삭제 (`config/prompts.js`) - [ ] 기사 카테고리 자동 분류 - [ ] Featured Image 자동 설정 --- ## 트러블슈팅 ### 문제: RSS Feed 수집 실패 **증상**: ``` [NewsCollector] Feed取得失敗: The Verge - Timeout ``` **대처법**: - 재시도 로직이 자동으로 2회 재시도 - 다른 Feed에서 기사 보완 - 특정 Feed가 지속적으로 실패하면 URL 확인 필요 ### 문제: 24시간 이내 뉴스가 적음 **증상**: ``` [NewsCollector] 24時間フィルタ後: 3件 ``` **대처법**: - 보통 16건 전후 확보되므로 일시적 현상 가능성 - 3건이어도 분석·투고는 계속됨 - 지속적으로 적으면 RSS Feed 소스 추가 검토 ### 문제: 중복 투고 에러 **증상**: ``` [ERROR] 同じタイトルの投稿が既に存在します: 2025/11/24 AI News ``` **대처법**: - 이것은 **정상 동작**입니다 (중복 투고 방지 기능) - 같은 날 여러 번 실행된 경우에만 발생 - 다음 날 (오전 8시)에는 새로운 제목으로 투고됨 --- ## 관련 문서 - [프로젝트 README](../batch/auto-post-ai-news/README.md) - [구현 계획](../20251123-automate-ai-news-posts/plan.md) - [실행 로그](../batch/auto-post-ai-news/logs/) --- ## 참고 자료 ### RSS Parser 문서 - https://www.npmjs.com/package/rss-parser ### RSS Feed 사양 - RSS 2.0: http://www.rssboard.org/rss-specification - Atom: https://datatracker.ietf.org/doc/html/rfc4287 ### WordPress REST API - https://developer.wordpress.org/rest-api/reference/posts/ --- **작성자**: Claude Code **최종 업데이트**: 2025-11-24 **프로젝트**: AI News Auto Post System