47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
"""[DEPRECATED] 네이버 finance 종목 뉴스 스크래핑.
|
|
|
|
본 모듈은 ai_news Phase 1 (2026-05-14) 에서 더 이상 파이프라인에서 사용되지 않음.
|
|
데이터 소스는 stock-lab 의 articles 테이블 (ai_news/articles_source.py) 로 전환됨.
|
|
|
|
삭제 시점: Phase 2 (DART 도입) 결정 후. IC 검증 4주 누적 후 노드 활성화
|
|
여부에 따라 본 모듈을 (a) 완전 삭제 또는 (b) ensemble fallback 으로 재활용.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from typing import Any, Dict, List
|
|
|
|
from bs4 import BeautifulSoup
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
NAVER_NEWS_URL = "https://finance.naver.com/item/news_news.naver"
|
|
NAVER_HEADERS = {
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
|
|
"Referer": "https://finance.naver.com/",
|
|
}
|
|
|
|
|
|
async def fetch_news(client, ticker: str, n: int = 5) -> List[Dict[str, Any]]:
|
|
"""Scrape top N news headlines for a ticker. Returns [] on any failure."""
|
|
try:
|
|
r = await client.get(NAVER_NEWS_URL, params={"code": ticker, "page": 1})
|
|
except Exception as e:
|
|
log.warning("ai_news scrape http error for %s: %s", ticker, e)
|
|
return []
|
|
if r.status_code != 200:
|
|
return []
|
|
soup = BeautifulSoup(r.text, "lxml")
|
|
out: List[Dict[str, Any]] = []
|
|
for row in soup.select("table.type5 tbody tr")[:n]:
|
|
title_el = row.select_one("td.title a")
|
|
date_el = row.select_one("td.date")
|
|
if not title_el or not date_el:
|
|
continue
|
|
out.append({
|
|
"title": title_el.get_text(strip=True),
|
|
"date": date_el.get_text(strip=True),
|
|
})
|
|
return out
|