Files
collect-japan-news/README.md
kihong.kim 56a6de61ce Initial commit: Japan Senior News Collector
- FastAPI backend with news scraping from Yahoo Japan
- SQLite database for article storage
- Web UI with dark mode, article modal, statistics dashboard
- Docker support for containerized deployment
- API endpoints: /api/today, /api/news, /api/collect-news, /api/dates, /api/download-json
- Auto-collect feature when requesting today news
- Content filtering for articles without body text
2025-12-15 15:55:37 +09:00

182 lines
3.8 KiB
Markdown

# Japan Senior News Collector
일본 Yahoo Japan에서 시니어 관련 뉴스를 자동으로 수집하고 관리하는 웹 애플리케이션입니다.
## 주요 기능
### 뉴스 수집
- Yahoo Japan에서 4개 카테고리 뉴스 자동 수집
- 건강 (Health)
- 생활 (Lifestyle)
- 경제 (Economy)
- 사회 (Society)
- 각 카테고리별 최대 5개 기사 수집
- 기사 본문 콘텐츠 자동 추출
- 콘텐츠가 없는 기사 자동 필터링
### 웹 UI
- 카테고리별 뉴스 카드 뷰
- 기사 클릭 시 상세 모달 표시
- 날짜별 히스토리 조회
- 다크모드 지원
- 통계 대시보드 (카테고리별 기사 수)
- JSON 다운로드 기능
## 기술 스택
- **Backend**: FastAPI, Python 3.9
- **Database**: SQLite
- **Frontend**: HTML, Tailwind CSS, JavaScript
- **Scraping**: BeautifulSoup4, Requests
- **Container**: Docker
## 설치 및 실행
### Docker 실행 (권장)
```bash
# 이미지 빌드
docker build -t japan-news .
# 컨테이너 실행
docker run -d --name japan-news -p 8001:8000 japan-news
```
### 로컬 실행
```bash
# 가상환경 생성 및 활성화
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 의존성 설치
pip install -r requirements.txt
# 서버 실행
uvicorn main:app --reload --port 8000
```
## API 엔드포인트
### GET /
웹 UI 페이지 반환
### GET /api/today
오늘의 뉴스 조회. 오늘 수집된 기사가 없으면 자동으로 수집 후 반환.
**응답 예시:**
```json
{
"date": "2025-12-15",
"articles": {
"Economy": [...],
"Society": [...],
"Lifestyle": [...],
"Health": [...]
},
"total_count": 19
}
```
### GET /api/news
뉴스 목록 조회
**Query Parameters:**
- `date` (optional): 조회할 날짜 (YYYY-MM-DD 형식)
### POST /api/collect-news
뉴스 수집 실행
**응답 예시:**
```json
{
"status": "success",
"collected_count": 20,
"details": {
"Economy": 5,
"Society": 5,
"Lifestyle": 5,
"Health": 5
}
}
```
### GET /api/dates
수집된 날짜 목록 조회
**응답 예시:**
```json
{
"dates": ["2025-12-15", "2025-12-14", "2025-12-13"]
}
```
### GET /api/download-json
뉴스 데이터 JSON 파일 다운로드
**Query Parameters:**
- `date` (optional): 다운로드할 날짜 (YYYY-MM-DD 형식)
## 프로젝트 구조
```
japan-news/
├── main.py # FastAPI 애플리케이션
├── database.py # SQLite 데이터베이스 관리
├── scraper.py # Yahoo Japan 뉴스 스크래퍼
├── requirements.txt # Python 의존성
├── Dockerfile # Docker 설정
├── .dockerignore # Docker 빌드 제외 파일
├── static/
│ └── index.html # 웹 UI
└── README.md
```
## 데이터베이스 스키마
### articles 테이블
| 컬럼 | 타입 | 설명 |
|------|------|------|
| id | INTEGER | Primary Key |
| title | TEXT | 기사 제목 |
| url | TEXT | 기사 URL (UNIQUE) |
| image_url | TEXT | 썸네일 이미지 URL |
| published_date | TEXT | 발행일 |
| category | TEXT | 카테고리 |
| source | TEXT | 출처 |
| collected_at | TEXT | 수집 시간 (ISO format) |
| content | TEXT | 기사 본문 |
## 외부 연동
`/api/today` 엔드포인트를 사용하면 외부 시스템에서 오늘의 뉴스를 쉽게 조회할 수 있습니다.
```bash
# 오늘의 뉴스 조회 (없으면 자동 수집)
curl http://localhost:8001/api/today
```
## Docker 관리 명령어
```bash
# 로그 확인
docker logs -f japan-news
# 컨테이너 중지
docker stop japan-news
# 컨테이너 시작
docker start japan-news
# 컨테이너 삭제
docker rm -f japan-news
# 이미지 재빌드 후 실행
docker rm -f japan-news && docker build -t japan-news . && docker run -d --name japan-news -p 8001:8000 japan-news
```
## 라이선스
MIT License