-
SKT·KT·LGU+ 통신3사 공시지원금 데이터 크롤링 프로그램 만들기크롤링 2026. 4. 17. 18:35
SKT, KT, LGU+ 세 통신사의 공시지원금 데이터를 한 번에 긁어서 엑셀로 떨어뜨리는 프로그램을 만들었다.
당연히 고객님의 요청으로 개발하게 되었다.
세 통신사, 세 가지 다른 세계
공시지원금이 뭔지부터 짚고 가자. 휴대폰 구입할 때 통신사에서 할인해 주는 금액이다. 기종에 따라 다르고, 요금제에 따라 다르고, 기기변경인지 번호이동인지 신규가입인지에 따라 또 다르다. 이 조합은 어마어마하게 많다. SKT만 해도 5G폰과 LTE폰을 나누고, 요금제가 수십 개, 가입유형이 세 가지다. 여기에 KT랑 LGU+까지 더하면 조합이 수천 개를 훌쩍 넘긴다.
고객이 원한 건 단순했다. 통신3사의 모든 공시지원금 데이터를 주기적으로 모아서 엑셀 한 장으로 보고 싶다는 거다. 여기서 "모든"이 문제였다. 세 통신사 홈페이지를 하나씩 열어서 기종별로 요금제별로 가입유형별로 일일이 눌러보려면 하루 종일 붙어 있어도 끝나지 않는다. 게다가 지원금은 수시로 바뀐다. 이번 주에 뽑은 데이터가 다음 주면 이미 구데이터가 돼 있다. 결국 이 작업은 기계한테 맡기지 않으면 답이 없었다.
첫 미팅에서 또 하나 튀어나온 요구사항이 있었다. 통신사마다 데이터 구조가 완전히 다른데, 나온 결과 엑셀은 통일된 형식이어야 한다는 점이었다. "삼성 갤럭시 S24 Ultra 512GB"라고 쓰여 있든 "SM-S928N_512G"라고 쓰여 있든, 엑셀에서는 같은 기기로 정리돼야 한다는 거다. 이게 생각보다 까다로운 작업이 될 거라는 게 그 자리에서 바로 감이 왔다.
통신사 세 곳, 세 번의 탐색
수집 자체는 각 통신사 홈페이지가 내부적으로 호출하는 API를 활용하는 구조로 잡았다. 세 곳의 API 구조가 다 다르기 때문에, 각각을 따로 뜯어보고 거기에 맞는 요청 방식을 구현했다.
SKT는 요금제 카테고리를 먼저 가져오고, 그 카테고리 안의 요금제 리스트를 받아오고, 요금제마다 5G폰·LTE폰 × 기기변경·번호이동·신규가입 조합으로 공시지원 페이지를 긁는 방식이다. 페이지가 HTML로 내려오는데, 그 안에 자바스크립트 변수로 상품 리스트가 박혀 있다. 그걸 정규식으로 뽑아내서 JSON으로 변환하는 과정이 한 단계 더 있다. KT는 요금제 리스트를 JSON API로 받아온 뒤, 요금제×가입유형 조합마다 기종 리스트를 페이지 단위로 넘겨가며 전부 받아온다. LGU+는 5G폰과 LTE폰을 따로 호출해야 하고, 요금제 응답이 중첩 구조로 내려와서 이걸 한 번 평탄화하는 로직이 필요했다.
세 통신사의 데이터 스키마는 필드명까지 전부 다르다. SKT는 subscriptionNm이라는 필드에 요금제 이름이 들어 있고, KT는 pplNm, LGU+는 urcMblPpCd 같은 식이다. 기기 모델명, 출고가, 지원금 필드도 전부 이름이 다르다. 그래서 각 통신사별로 "이 응답에서 어느 필드를 뽑아 쓴다"는 매핑을 따로 만들어 두고, 최종 출력 단계에서 통일된 스키마로 변환한다.


기종명 통일이 절반이었다
"Samsung Galaxy S24 Ultra", "갤럭시S24울트라", "SM-S928N", "삼성 갤럭시 에스24 울트라"가 전부 같은 폰이다. 그런데 통신사마다 부르는 이름이 다르고, 같은 통신사 안에서도 페이지마다 조금씩 다르다. 이걸 그대로 엑셀로 뽑으면 같은 기기가 서로 다른 이름으로 수십 줄씩 중복된다. 고객 입장에서는 "같은 기기로 묶어줬으면" 하는 생각이 당연히 드는 구간이다.
그래서 정규화 로직을 꽤 단단하게 만들었다. 한글 표기는 영문으로 바꾼다. "갤럭시"는 "Galaxy", "아이폰"은 "iPhone", "프로 맥스"는 "Pro Max", "울트라"는 "Ultra" 같은 식으로 매핑 테이블을 깔아뒀다. 용량 표기도 따로 뽑아낸다. "512GB", "512G", "512기가" 같은 여러 표기를 한 가지 형태("512G")로 통일한다. 모델 코드 뒤에 붙는 숫자(예: "S928N512")를 보고 용량을 추정하는 fallback 로직도 넣었다. 제조사도 마찬가지로, 여러 표기를 Samsung, Apple, Xiaomi 같은 표준 이름으로 매핑한다.
결과 엑셀의 컬럼은 두 종류로 나눠뒀다. 정규화된 값("Galaxy S24 Ultra", "512G") 컬럼과, 원본 그대로의 값("갤럭시 S24 울트라 512GB") 컬럼을 나란히 둔 거다. 데이터를 분석할 때는 정규화된 값으로 필터링하고, 원본 확인이 필요할 때는 원본 컬럼을 보면 된다. 덕분에 나중에 데이터 검증할 때 "이게 왜 이렇게 정규화됐지?"를 추적할 수 있다.
IP 차단을 피하는 기본기
공시지원금 수집은 요청 수가 엄청 많다. 요금제 수백 개 × 가입유형 3가지 × 통신사 3곳을 다 돌면 API 호출이 쉽게 수천 건을 넘는다. 아무런 제어 없이 쏘면 두 가지가 터진다. 하나는 IP 차단이고, 다른 하나는 일시적 서버 오류다.
그래서 모든 HTTP 요청을 전담 클라이언트 객체에 맡기고, 거기에 세 가지 장치를 넣었다. 첫째, 요청 사이에 최소 간격을 둔다. 기본값은 120밀리초 정도로 짧지만, 이걸 두는 것과 안 두는 것의 차이가 크다. 사람 눈에는 여전히 빠르지만, 서버 입장에서는 정상 사용자의 요청 패턴과 크게 다르지 않게 보인다. 둘째, 실패하면 간격을 벌려가며 재시도한다. 429나 5xx 응답은 일시적인 경우가 많아서, 몇 초 기다렸다가 다시 치면 대부분 해결된다. 셋째, 세션을 유지해서 쿠키와 헤더가 계속 살아 있게 만든다.
그래도 실패하는 건 있다. 특정 요금제가 서버 쪽 오류로 아예 안 내려오거나, 네트워크가 순간적으로 끊기거나. 이런 경우에 프로그램 전체를 중단시키지 않고, 그 항목만 "실패 로그"에 적어두고 다음 항목으로 넘어간다. 수집이 다 끝나면 failed_requests.log라는 파일에 어떤 통신사의 어떤 요금제, 어떤 가입유형에서 실패했는지가 전부 남아 있다. 고객이 필요하면 그 로그를 보고 수동으로 다시 돌릴 수도 있고, 전체적으로는 일부 실패가 나도 나머지 수천 건의 데이터는 정상적으로 얻을 수 있다.
실행은 그냥 버튼 하나
고객은 개발자가 아니다. 스크립트 같은 걸 건드릴 일 없이, 그냥 더블클릭해서 실행 가능한 형태여야 했다. 그래서 Tkinter로 GUI를 감쌌다. 프로그램을 실행하면 단순한 창이 하나 뜬다. 상단에 저장 폴더를 지정하는 입력란과 폴더 선택 버튼, 그 아래에 "수집 시작" 버튼과 "저장 폴더 열기" 버튼. 그 아래는 수집이 진행되는 동안 실시간 로그가 쭉 흐르는 텍스트 박스다.
버튼을 누르면 수집이 시작된다. 로그에는 "[SKT] 수집 시작", "[SKT] 요금제 82건 확보", "[SKT] 5G 휴대폰 / 기기변경 / 5G 스탠다드 (12/82) → 34건", 이런 식으로 실시간 진행이 뜬다. 어디까지 돌았는지, 지금 무슨 통신사의 어떤 조합을 긁고 있는지가 눈으로 다 보인다. 수집은 별도 스레드에서 돌기 때문에, 창이 멈추거나 얼어붙는 일 없이 로그가 계속 업데이트된다.
수집이 끝나면 완료 팝업이 뜬다. 총 몇 건이 수집됐는지, 엑셀 파일은 어디에 저장됐는지, 실패 로그는 어디에 있는지가 팝업 한 장에 정리돼 있다. 저장 폴더 열기 버튼을 누르면 탐색기가 바로 열려서 파일을 확인할 수 있다. 복잡할 게 하나도 없다. 고객은 일주일에 한 번 프로그램 실행하고 엑셀 파일 받아가는 게 전부다.


엑셀 파일로 오는 결과물
결과는 CSV와 XLSX 두 가지로 동시에 저장된다. 컬럼은 통신사, 제조사, 모델명, 용량, 출고가, 요금제, 월요금, 가입유형, 공통지원금, 공시일, 수집일시, 크롤링 URL, 그리고 Raw 값 컬럼들로 구성된다. 엑셀 파일은 헤더를 고정하고 굵게 표시해 놨기 때문에, 열자마자 바로 필터 걸고 피벗 돌릴 수 있는 상태다.
그리고 수집을 매번 돌릴 때마다 결과가 새 폴더에 저장된다. run_20251115_143022 같은 타임스탬프 폴더가 자동으로 생기고, 그 안에 CSV, XLSX, 실패 로그가 같이 들어간다. 덕분에 매주 수집한 데이터를 시계열로 쌓을 수 있고, 지난주 대비 공시지원금이 어떻게 변했는지도 추적 가능하다.
중복 제거는 자동이다. 같은 통신사, 같은 모델번호, 같은 요금제, 같은 가입유형, 같은 공시일 조합이 있으면 한 번만 남긴다. 수집 과정에서 같은 조합이 여러 번 수집되는 경우가 있어서, 이걸 마지막 단계에서 정리해 준다.

이런식으로 데이터를 뽑을 수 있다.
마무리
이번 프로젝트의 핵심은 "수집 자체"가 아니라 "서로 다른 데이터를 하나의 형식으로 묶는 일"이었다. 통신사별로 다른 이름, 다른 구조, 다른 표기법을 일관된 엑셀 한 장으로 정리하는 게 진짜 가치다. 이런 종류의 작업은 제조사 다릅고 사이트 다를 뿐 어디에서나 반복된다. 시장 조사, 가격 모니터링, 경쟁사 분석 같은 이름으로 불리지만, 본질은 다 비슷한 문제다.
위 프로그램이 필요하시거나, 궁금하신 점이 있으시다면 언제든지 편하게 문의 주세요!
'크롤링' 카테고리의 다른 글
보조금24 사이트 데이터 크롤링 프로그램 만들기 (0) 2026.05.01 쿠팡 상품 리뷰 크롤링 데이터 추출 프로그램 만들기 (2) 2026.04.18 진학사 세특 탐구보고서 크롤링 프로그램 만들기 (0) 2026.04.02 신상마켓 매장 신상품 데이터 크롤링 프로그램 (0) 2025.12.29