위니브에 적합한 사업 공고를 자동 크롤링하여 정적 페이지에 노출하는 프로젝트입니다.
HTML/CSS/JS 는 고정이고, data.json 파일만 교체하면 페이지가 자동으로 업데이트됩니다.
business/
├── index.html # 페이지 구조 (고정)
├── style.css # 스타일 (고정)
├── script.js # 렌더링 로직 (고정)
└── data.json # 크롤러가 업데이트하는 데이터 파일 ← 여기만 수정
fetch로 data.json을 불러오므로 반드시 HTTP 서버로 띄워야 합니다.
(file:// 로 직접 열면 CORS 로 실패합니다.)
# Python 3
python -m http.server 8000
# → http://localhost:8000크롤러는 오직 data.json 파일만 덮어쓰면 됩니다.
다른 HTML/CSS/JS 파일은 수정할 필요가 없습니다.
{
"lastUpdated": "YYYY-MM-DD",
"businesses": [
{
"id": "고유ID (문자열)",
"title": "사업 공고 제목",
"agency": "주관 기관",
"category": "카테고리 (예: 에듀테크, 웹개발, 콘텐츠 등)",
"description": "사업 요약 설명",
"budget": "지원 금액 (예: '최대 2억원')",
"deadline": "YYYY-MM-DD 형식의 신청 마감일",
"postedDate": "YYYY-MM-DD 형식의 공고 등록일",
"url": "공고 상세 페이지 링크"
}
]
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
lastUpdated |
string | O | 최상위. 크롤링 완료 시각 (YYYY-MM-DD) |
businesses |
array | O | 최상위. 사업 공고 배열 |
id |
string | O | 항목별 고유 식별자 |
title |
string | O | 카드 상단 제목으로 표시됨 |
agency |
string | O | 제목 아래 기관명으로 표시됨 |
category |
string | O | 상단 필터 버튼 자동 생성에 사용됨 |
description |
string | △ | 카드 본문 설명 |
budget |
string | △ | 지원금액 영역에 표시 |
deadline |
string | O | 반드시 YYYY-MM-DD 형식 — D-day 계산에 사용됨 |
postedDate |
string | △ | 등록일 영역에 표시 |
url |
string | △ | "공고 상세보기" 버튼 링크 |
category값이 바뀌면 상단 필터 버튼이 자동으로 재생성됩니다.deadline기준으로 마감 임박순 정렬됩니다.- 마감까지 7일 이하인 공고는 빨간색으로 강조됩니다.
- 지난 마감일은
D-day표시가 생략됩니다.
크롤러(별도 구현)는 이 프로젝트 루트의 data.json 을 원자적으로 덮어쓰기만 하면 됩니다.
import json
from pathlib import Path
from datetime import date
result = {
"lastUpdated": date.today().isoformat(),
"businesses": crawled_items, # 위 스키마 형태의 리스트
}
Path("data.json").write_text(
json.dumps(result, ensure_ascii=False, indent=2),
encoding="utf-8",
)| 바꾸고 싶은 것 | 수정할 파일 |
|---|---|
| 페이지 제목/설명 문구 | index.html 의 .site-header 블록 |
| 색상/폰트/레이아웃 | style.css 상단의 :root CSS 변수 |
| 카드에 표시되는 필드/형식 | script.js 의 cardTemplate() 함수 |
| 정렬 기준 (기본: 마감일순) | script.js 의 render() 내 sort 블록 |
| 마감 임박 기준 (기본: 7일) | script.js 의 isUrgent() 함수 |