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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user