- BizinfoApiSource: bizinfo.go.kr 자체 crtfcKey 사용, /uss/rss/bizinfoApi.do - 페이지네이션 없음 → totCnt 파악 후 전체 일괄 요청(1,463건 검증) - bsnsSumryCn(HTML) 본문 → stripHtml 로 태그 제거, 단일패스 적재(전건 DETAILED) - reqstBeginEndDe "YYYY-MM-DD ~ ..." → 신청기간 파싱(706건), 텍스트형은 null - util: stripHtml, parsePeriodRange 추가 - 데몬 4소스 가동: kstartup/bizinfo/mss/smes Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.9 KiB
3.9 KiB
정부지원사업 수집 데몬 (gov-scraper)
한국 정부지원사업 공고를 주기적으로 수집해 Oracle DB(gov_opportunity)에 적재하는 Node.js 데몬.
전략
Open API 우선 + HTML 보조 + 디스커버리 확장. 정부지원사업 공고는 소수 허브 포털에 대부분 집계되므로, API가 있는 곳은 API로(안 깨짐), 없는 곳은 HTML로 긁고, 부족분은 디스커버리로 소스를 넓힌다.
아키텍처
src/
├── config.js 환경설정(루트 .env 로드)
├── bootstrap.js LD_LIBRARY_PATH(Instant Client) 보정 후 재실행
├── db.js Oracle thick 모드 접속(sso 지갑 재사용)
├── crawler/
│ ├── browser.js sundol-chrome(CDP 9222) 연결 — 기존 인프라 재사용
│ └── crawler.js 3단계 폴백(cheerio → Jina → Playwright) [Facade]
├── sources/ [Strategy] 소스별 어댑터
│ ├── base.js OpportunitySource 인터페이스
│ ├── kstartup.js K-Startup Open API (data.go.kr 서비스키)
│ ├── genericHtml.js config 기반 범용 HTML 게시판 스크래퍼
│ ├── htmlSources.js HTML 소스 config 목록(여기에 추가)
│ └── registry.js 가용 소스 집계(키 없는 소스 자동 제외)
├── store/ gov_source/gov_opportunity 적재(중복제거)
├── pipeline.js 목록 수집 → 적재 → 상세 본문 수집
├── daemon.js 주기 폴링 데몬(PM2)
└── cli.js 수동 실행(test-db / test-crawl / run-once)
- 중복 제거:
(source_code, external_id)유니크 키. external_id 는 API 고유키(pbanc_sn 등) 또는 게시판 글번호. - 상세 본문: API 소스는 목록 단계에서 본문까지 한 번에 적재(단일 패스). HTML 소스는 목록 적재 후 detail_url 을 3단계 크롤러로 긁는 2-패스.
DB 접속 (중요)
node-oracledb thick 모드 + Oracle Instant Client 를 쓴다. 백엔드 JDBC 와 동일하게
자동로그인 지갑(cwallet.sso)을 재사용하므로 지갑 비밀번호가 필요 없다.
(thin 모드는 sso 를 못 읽어 지갑 비밀번호가 필요한데, 그 비밀번호는 어디에도 저장돼 있지 않음)
- Instant Client:
/home/opc/oracle-ic/instantclient_23_26(.env의ORACLE_IC_LIB_DIR) - net 설정:
government/oracle-net/— 지갑의sqlnet.ora가WALLET_LOCATION을?/network/admin로 가리켜 instant client 가 sso 를 못 여는 문제를 보정한 전용 설정.
실행
cd government
node src/cli.js test-db # DB 접속 확인
node src/cli.js run-once kstartup # K-Startup 1회 수집
node src/cli.js run-once mss # 중기부 게시판 1회 수집
node src/cli.js run-once # 가용 소스 전체 1회
node src/cli.js test-crawl <url> # 크롤러 단독 테스트
# 데몬(PM2)
pm2 start /home/opc/sundol/ecosystem.config.cjs --only gov-daemon
pm2 logs gov-daemon
새 소스 추가
- HTML 게시판:
src/sources/htmlSources.js의HTML_SOURCE_CONFIGS에 항목 추가 (listUrl, rowSelector, externalId 정규식, detailUrl 템플릿). 코드 로직 수정 불필요. - API:
src/sources/에OpportunitySource상속 어댑터 작성 후registry.js등록.
디스커버리 (소스 발굴)
데몬 자체는 웹 검색을 못 하므로, 신규 소스 발굴은 Claude(WebSearch)가 수행해
htmlSources.js 또는 gov_source 에 등록한다. 후보 목록은 docs/sources-catalog.md 참조.
구현된 소스
kstartup(K-Startup Open API, ~29k건)bizinfo(기업마당 Open API, ~1.5k건 — 본문 포함 단일패스)mss(중기부 게시판 HTML)smes(중소벤처24 HTML 목록전용 — 상세는 팝업 전용이라 목록만 적재)
TODO
- 지자체/부처 게시판 추가(GenericHtmlSource config).