gov-scraper: 중소벤처24(smes) 사업공고 소스 추가

- GenericHtmlSource 확장: 신청기간(period) 날짜 파싱, listOnly(목록 전용) 모드
- smes(중소벤처24 bizApply) config 추가 — href의 PBLN 공고ID 추출, 제목/분야/주관기관/신청기간 적재
- smes 상세는 팝업 전용(JS 다이얼로그)이라 직접 크롤 불가 → 목록 전용으로 적재(18건 검증)
- util: parseFlexibleDate(YY-MM-DD/YYYYMMDD 대응)
- pipeline: skipDetail 소스는 상세 단계 건너뜀

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-10 05:51:46 +00:00
parent cbc5ba5663
commit f2a8f30867
7 changed files with 99 additions and 13 deletions

View File

@@ -27,6 +27,31 @@ export function parseYmd(s) {
return new Date(Date.UTC(y, m - 1, d));
}
/**
* 'YY-MM-DD' / 'YYYY-MM-DD' / 'YYYYMMDD' / 'YYMMDD' 를 Date 로. 불일치면 null.
* 6자리는 20YY 로 간주한다.
*/
export function parseFlexibleDate(s) {
if (s == null) return null;
const d = String(s).replace(/[^0-9]/g, '');
let y;
let mo;
let day;
if (d.length === 8) {
y = Number(d.slice(0, 4));
mo = Number(d.slice(4, 6));
day = Number(d.slice(6, 8));
} else if (d.length === 6) {
y = 2000 + Number(d.slice(0, 2));
mo = Number(d.slice(2, 4));
day = Number(d.slice(4, 6));
} else {
return null;
}
if (mo < 1 || mo > 12 || day < 1 || day > 31) return null;
return new Date(Date.UTC(y, mo - 1, day));
}
export function nonEmpty(s) {
if (s == null) return null;
const t = String(s).trim();