- 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
3.8 KiB
3.8 KiB
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 실행 (권장)
# 이미지 빌드
docker build -t japan-news .
# 컨테이너 실행
docker run -d --name japan-news -p 8001:8000 japan-news
로컬 실행
# 가상환경 생성 및 활성화
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
오늘의 뉴스 조회. 오늘 수집된 기사가 없으면 자동으로 수집 후 반환.
응답 예시:
{
"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
뉴스 수집 실행
응답 예시:
{
"status": "success",
"collected_count": 20,
"details": {
"Economy": 5,
"Society": 5,
"Lifestyle": 5,
"Health": 5
}
}
GET /api/dates
수집된 날짜 목록 조회
응답 예시:
{
"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 엔드포인트를 사용하면 외부 시스템에서 오늘의 뉴스를 쉽게 조회할 수 있습니다.
# 오늘의 뉴스 조회 (없으면 자동 수집)
curl http://localhost:8001/api/today
Docker 관리 명령어
# 로그 확인
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