-
보조금24 사이트 데이터 크롤링 프로그램 만들기크롤링 2026. 5. 1. 02:52
이번에 고객님께 의뢰받은 일은 한 줄로 요약하면 이렇다. "보조금24 사이트에 올라와 있는 2026년도 보조사업자 전체 명단을, 연락처랑 팩스번호까지 다 채워서 엑셀로 받고 싶다." 보조금24는 정부가 운영하는 국고보조사업 통합 포털이다. 어느 부처가 어떤 사업에 얼마를 배정했고, 그 사업을 누가 수행하는지가 전부 공개돼 있다. 영업이나 제안 활동을 하는 회사 입장에서는 그야말로 잠재 고객 명단 그 자체다. 다만 사이트가 잘 만들어져 있다고 데이터를 쉽게 빼낼 수 있다는 뜻은 아니다.


사람이 직접 하면 일주일도 모자란 작업이었다
고객이 처음 보내준 엑셀 파일을 열어봤다. 행이 만 단위였다. 회계연도, 보조사업명, 차수, 보조사업자, 중앙관서, 분야, 부문, 사업비 합계와 항목별 금액까지는 이미 들어 있었다. 문제는 그 옆 칸들이었다. 수행기관, 담당부서/담당자, 전화번호, 홈페이지, 팩스. 이 다섯 칸이 군데군데 비어 있었다. 어떤 행은 깔끔하게 차 있고, 어떤 행은 통째로 비어 있고, 어떤 행은 팩스만 빠져 있었다.
그리고 결정적인 한 가지. 고객이 가지고 있는 명단은 한참 전 버전이었다. 2026년도 사업이 새로 갱신되면서 행이 추가되거나 사업비가 바뀐 곳이 많았다. 그러니까 단순히 빈칸을 채우는 게 아니라, 보조금24 사이트의 최신 데이터를 다시 긁어와서 기존 데이터와 맞춰 합쳐야 했다. 그 와중에 비어 있는 연락처는 보조금24 상세 페이지에서 끌어오고, 거기에도 없는 팩스번호는 각 기관 홈페이지에 직접 들어가서 찾아내는 것까지가 요구사항이었다.
이걸 사람이 한다고 상상해 보면 견적이 안 나온다. 사이트에 들어가서 부처별로 필터를 걸고, 사업 하나하나 클릭해서 상세 페이지에 들어가 담당자 정보를 베끼고, 홈페이지가 있으면 또 그 홈페이지에 들어가서 푸터까지 스크롤해서 팩스 적힌 곳을 찾는 작업. 그걸 수만 건 반복한다. 일주일도 모자란다.
사이트가 보내는 신호를 그대로 흉내 낸 수집기
이런 작업을 자동화할 때 가장 먼저 보는 건 사이트가 데이터를 어떻게 그리는가 하는 부분이다. 화면에 보이는 표가 실은 어디서 오는지, 어떤 형식으로 오는지를 들여다보면 길이 보인다. 보조금24의 경우 화면에 보이는 명단은 사이트 내부 API가 JSON 형태로 내려주는 데이터를 표로 그려주는 구조였다. 그러니까 사람이 페이지를 넘기면서 한 줄씩 보는 대신, 그 API에 직접 요청을 보내서 한 번에 수천 건씩 받아오는 게 가능했다.
다만 단순히 한 번 호출해서 끝나는 일이 아니었다. 중앙관서별로 코드가 따로 있어서, 부처 코드 리스트를 먼저 받아와서 그 코드 하나하나로 다시 명단을 요청해야 했다. 어떤 부처는 사업이 수십 개고, 어떤 부처는 수천 개다. 사업 단위로 다시 상세 페이지 데이터를 호출해야 담당자, 전화, 홈페이지가 나왔다. 결국 호출해야 할 횟수가 만 단위로 쌓였다.
이 부분이 자동화 설계에서 가장 신경 쓴 지점이다. 한 번 호출에 1초만 걸려도 만 번이면 세 시간이다. 그래서 동시에 여러 건을 처리하는 멀티스레드 구조로 짜되, 사이트에 부담을 주지 않을 만큼만 풀어 줬다. 그리고 한 번 받아온 결과는 전부 캐시 파일로 저장해 두는 방식으로 만들었다. 중간에 네트워크가 끊기거나 사이트가 잠깐 응답을 안 해도, 다시 돌리면 이미 받아둔 건 건너뛰고 빠진 것만 채운다. 만 단위 호출에서는 이 안전장치가 거의 필수다.
빈칸이었던 팩스번호를 채워 넣는 마지막 한 수
이 의뢰의 진짜 까다로운 지점은 따로 있었다. 팩스번호다. 보조금24 상세 페이지에서 팩스를 제공하는 기관은 일부였고, 나머지는 빈칸이었다. 영업 자료로 쓰려면 팩스가 있어야 의미가 있는데 사이트에는 없다. 그래서 추가로 만든 게 홈페이지 자동 방문기다.
각 보조사업자에게는 안내 홈페이지 주소가 같이 들어 있다. 거기로 직접 들어가면 푸터든 연락처 페이지든 어딘가에 팩스가 적혀 있는 경우가 많다. 그래서 빈칸으로 남은 사업자만 추려서, 그 홈페이지를 자동으로 방문해 본문을 읽고 팩스 패턴을 찾아내는 로직을 붙였다. "팩스", "FAX", "F:" 같은 표시 옆에 붙어 있는 전화번호 형식의 숫자를 정규표현식으로 잡아낸다. 010으로 시작하는 휴대폰 번호는 제외한다. 본인 휴대폰을 팩스라고 적어 둘 일은 없으니까.
홈페이지가 https에서 막히면 http로 한 번 더 시도하고, 자바스크립트나 메타 리프레시로 다른 주소로 보내는 사이트는 그 리다이렉트를 따라간다. 한 사이트에서 모든 경로를 시도해도 못 찾으면 깔끔하게 빈칸으로 남겨둔다. 잘못 추출한 번호를 채우는 것보다 빈칸이 낫다. 그리고 한 번 방문한 홈페이지의 결과도 캐시에 저장해 둔다. 같은 홈페이지를 가진 사업자가 여럿이면 한 번만 방문하고 결과를 공유한다.
결과: 며칠치 작업이 한 번 실행으로 끝난다
다 돌리고 나면 한 파일이 떨어진다. '전체' 시트에는 모든 사업자가 들어 있고, 그 뒤에 중앙관서별로 시트가 자동으로 분리돼서 붙는다. 부처별로 영업할 때 바로 쓸 수 있게 한 구조다. 헤더에는 색이 들어가 있고, 굵은 글씨로 표시되고, 1행은 고정되어 스크롤해도 헤더가 따라온다. 자동필터까지 걸려 있어서 분야나 부문으로 곧바로 거를 수 있다. 컬럼 너비도 컬럼 성격에 맞게 미리 잡아 뒀다. 받아서 그대로 영업팀이나 제안팀에 넘기면 된다.
수치로 정리해 보면 임팩트가 분명하다. 사람이 했으면 며칠은 잡아야 했을 작업이, 한 번 실행에 30분 안쪽에 끝난다. 이미 한 번 돌려서 캐시가 차 있는 상태라면 그 다음 실행은 몇 분이면 충분하다. 데이터가 갱신되는 시점에 다시 한 번만 돌리면 최신 명단이 항상 손에 들어온다는 뜻이다. 빈칸 비율도 크게 줄었다. 사이트 자체에서 비어 있어 어쩔 수 없는 일부를 빼면 거의 채워졌다.

비슷한 데이터로 영업 자료 만들고 있다면
이번 프로젝트에서 가장 마음에 들었던 부분은 "사이트에는 없는데 홈페이지에는 있는 정보까지 끌어왔다"는 점이다. 단순한 크롤러는 화면에 있는 걸 그대로 베끼는 데서 끝난다. 진짜 영업 가능한 명단을 만들려면 한 단계 더 들어가야 한다. 빈칸을 어떻게 메울지, 못 메우는 빈칸은 어떻게 솔직하게 비워둘지에 대한 판단이 같이 들어가야 결과물이 실무에서 쓸 만해진다.
정부 공공 포털, 협회 회원사 명단, 박람회 참가업체 리스트처럼 영업이나 제안에 쓸 만한 공개 데이터는 생각보다 곳곳에 흩어져 있다. 그런데 막상 들여다보면 다운로드 버튼이 없거나, 페이지를 일일이 넘겨야 하거나, 정작 필요한 연락처는 빠져 있는 식이다. 이런 건 거의 다 자동화가 된다. 데이터를 어떻게 가져올지, 빠진 부분을 어디서 메울지, 어떤 형태로 엑셀에 떨어뜨릴지를 정해두면 그 다음은 프로그램이 알아서 한다. 비슷한 작업이 손에 잡혀 있는데 어디서부터 손대야 할지 막막하다면, 편하게 연락을 주시라. 언제든지 도움을 드릴 수 있으니!


'크롤링' 카테고리의 다른 글
쿠팡 상품 리뷰 크롤링 데이터 추출 프로그램 만들기 (2) 2026.04.18 SKT·KT·LGU+ 통신3사 공시지원금 데이터 크롤링 프로그램 만들기 (0) 2026.04.17 진학사 세특 탐구보고서 크롤링 프로그램 만들기 (0) 2026.04.02 신상마켓 매장 신상품 데이터 크롤링 프로그램 (0) 2025.12.29