Skip to content

feat(funding): collect SEMAS policy funds from ols.semas.or.kr - #42

Merged
jhjh0512 merged 1 commit into
mainfrom
feat/5-semas-policy-funds
Sep 29, 2026
Merged

jhjh0512 merged 1 commit into
mainfrom
feat/5-semas-policy-funds

Conversation

@jhjh0512

Copy link
Copy Markdown
Contributor

Refs #5

변경 내용

ADR 0006의 정책자금 크롤링 출처인 소진공 정책자금 사이트(ols.semas.or.kr) 수집기를 funding:sync에 등록했다. 수집 규칙과 ADR 0006과 다르게 정한 부분은 새 ADR 0007에 적었다.

  • 수집기 app/src/features/funding/sources/semas-ols.ts
    • 읽는 곳:
      • 정책자금 한눈에 보기: 자금별 신청요건·대출기간·한도·금리, 공통 지원자격, 기준금리
      • 홈 화면 "정책자금 신청하기": 자금별 "접수중" 표시와 접수기간
      • 공지 목록 JSON: 자금별 최신 접수 안내 공지를 찾는 데만 쓴다
      • 공지 상세: 접수기간·신청대상
    • 첨부(PDF)는 읽지 않고 페이지 원문은 저장하지 않는다. HTML 파서 의존성은 추가하지 않았다.
    • 요청 규칙(ADR 0006 3절):
      • robots.txt가 새로 생기면 멈춘다.
      • 요청 사이 1초 이상 쉰다(기본 1.5초).
      • User-Agent에 서비스 이름과 운영자 연락처(FUNDING_SYNC_CONTACT)를 밝힌다.
      • 403·429·자동 입력 방지 화면은 다시 시도하지 않고 멈춘다.
    • 필수 항목(자금 표, 표 머리글, 공통 지원자격, "정책자금 신청하기" 영역, 공지 목록·상세)을 찾지 못하면 그 출처를 실패로 기록한다.
  • 상품: 표의 자금 한 행이 상품 하나다. 출처 식별자는 대출구분:자금명이다(ADR 0007).
    • LOAN, 사업자등록 이후(공통 지원자격이 소상공인), 전국, 용도·업종 UNKNOWN(신청 전 확인)으로 기록한다.
    • 금리는 기준금리 연동이거나 "고정금리(2.0%P)"처럼 모호하다. 그래서 확정 금리로 기록하지 않고 상환 계산 대상이 아니다(ADR 0006 5절).
    • 한도는 금액이 하나일 때만 원 단위로 옮긴다.
  • 접수 상태(ADR 0007):
    • 홈 화면에 그 자금이 "접수중"으로 표시되고 날짜 모순이 없을 때만 OPEN이다.
    • 표시가 없거나 세부 유형만 표시되면 UNKNOWN이고, 마감 표시는 CLOSED다.
    • 제외 업종에 음식점 관련 표현이 보이면 OPEN으로 기록하지 않는다.
  • 근거 checksum: 자동 상품의 웹 페이지 근거에는 그 페이지 응답의 SHA-256을 남긴다(ADR 0006 2절).
    • 이를 위해 validation.ts가 자동 상품의 OFFICIAL_WEB_PAGE 근거 checksum을 허용하도록 바꿨다.
    • 사람이 기록한 상품의 웹 페이지 근거에 checksum이 있으면 지금처럼 오류다.
  • 문서:
    • ADR 0007 신설. ADR 0006에는 Validation의 "첫 실행 기록"을 추가했다.
    • docs/domains/funding.md: 소진공 수집 규칙, 출처 표, 검증 규칙, 테스트 목록
    • docs/DEVELOPMENT.md와 app/.env.example: FUNDING_SYNC_CONTACT
    • docs/ARCHITECTURE.md

검증

  • npm --prefix app run verify:fast: 통과(Vitest 299 passed / 41 skipped, skipped는 모두 DB·원본 대조 테스트).
  • npm --prefix app run verify:db: 통과(334 passed / 6 skipped, 6개는 data/raw/ 없는 원본 대조 테스트).
  • npm --prefix app run verify: 통과(Vitest 334 passed / 6 skipped, E2E Playwright Chromium 6 passed). skipped 6개는 data/raw/가 없어 건너뛴 상권 원본 대조 테스트다.
  • 실제 사이트 확인(2026-09-29, DB 적재 없이 수집기만 실행):
    • 요청 24회, 35.9초. robots.txt 404를 재확인했다.
    • 자금 13건 → 상품 13건(접수 중 4건). 접수 안내 공지 13건이 모두 연결됐다.
    • 카탈로그 검사 오류 0, 주의 0.
  • 첫 실제 실행(로컬 앱 DB, funding:sync):
    • trendbench-funding-catalog@2026-09-29.1 ACTIVATED
    • 소진공: 13건 받아 상품 13건, 접수 OPEN 4건
    • 기업마당: 1,514건 받아 상품 84건
    • 스위치가 꺼져 있어 현재 후보는 0건이다. 수치는 ADR 0006 "첫 실행 기록"에 적었다.
  • 테스트 sources/semas-ols.test.ts는 실제 페이지 구조를 줄인 HTML 조각 fixture를 쓴다. 다루는 것:
    • 접수기간 표기, 표·홈 화면·공지 해석과 필수 항목 누락 실패
    • 접수 상태 판정, 모호한 금리·한도
    • 스위치·최신성별 판정, 근거별 checksum
    • 요청 순서와 간격, 연락처 없음·robots·403·429·재시도·잘린 목록
  • 화면 변경은 없다. 자금 후보 화면은 기존 두 갈래 표시(feat(funding): split funding candidates into policy funds and support programs #39)를 그대로 쓴다.

위험·후속

  • API·DB: 스키마·migration·API 변경 없음. 카탈로그 검증 규칙 하나(자동 상품의 웹 페이지 근거 checksum 허용)를 넓혔다.
  • 데이터 계약: 정책자금 자동 승격 스위치는 꺼진 채다. 켜기 전에는 소진공 상품이 현재 후보가 되지 않는다. 켜면 ADR 0006의 4주 표본 점검을 시작한다.
  • 출처 의존 위험:
    • 홈 화면 구조가 바뀌면 소진공 출처가 실패로 기록되고, 3일 뒤 소진공 상품이 현재 후보에서 빠진다(ADR 0007).
    • 자금 이름이 바뀌면 새 상품으로 잡힌다.
  • 운영: FUNDING_SYNC_CONTACT가 없으면 소진공 출처는 실패로 기록된다. 정기 실행 위치는 #15에서 정한다.
  • 후속:

🤖 Generated with Claude Code

Add the SEMAS policy fund collector to funding:sync, the crawled
policy loan source of ADR 0006.

- Read the policy fund overview table, the home page "정책자금
  신청하기" status cards, the notice list (only to find notices) and
  notice details. Check robots.txt first, wait at least 1 second
  between requests, name the service and FUNDING_SYNC_CONTACT in the
  User-Agent, and stop on 403, 429 or a CAPTCHA page.
- Make one LOAN product per fund row, identified by loan section and
  fund name. Mark a fund OPEN only when the home page shows it as
  "접수중" with no date contradiction. Keep variable or ambiguous
  rates unconfirmed, so no fund reaches repayment math.
- Keep the SHA-256 of each crawled page on the evidence, and let
  validation accept web page checksums on automated products only.
- Add ADR 0007 for the status source and fund-level identity, and
  record the first funding:sync run in ADR 0006.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jhjh0512
jhjh0512 merged commit d5c6d37 into main Sep 29, 2026
1 check passed
@jhjh0512
jhjh0512 deleted the feat/5-semas-policy-funds branch September 29, 2026 13:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant