엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기
"창업 전 상권 분석을 위해 지역별 인구·상가 데이터가 필요하다", "블로그 글에 신뢰할 수 있는 통계 자료를 넣고 싶다", "부동산 실거래가 데이터를 정기적으로 모니터링하고 싶다"…
대한민국 정부는 공공데이터포털(data.go.kr)을 통해 인구, 상가, 부동산, 교통, 기상 등 수천 개의 데이터를 무료 API로 제공합니다. 매번 사이트에 들어가 다운로드하는 대신, 파이썬으로 API를 호출하면 필요한 데이터를 자동으로 수집해 엑셀에 정리할 수 있습니다.
공공데이터포털에서 사용할 API의 인증키를 발급받아야 합니다.
⚠️ 주의: 인증키는 Encoding과 Decoding 두 가지가 제공됩니다. requests 라이브러리로 호출할 때는 보통 Decoding 키를 사용합니다. Encoding 키를 사용하면 URL 인코딩이 중복되어 오류가 날 수 있습니다.
터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install requests pandas openpyxl
requests는 공공데이터 API 서버에 요청을 보내는 라이브러리입니다. pandas와 openpyxl은 수집한 데이터를 엑셀로 저장하는 데 사용합니다.
대표적인 예시로 행정안전부 주민등록 인구 통계 API를 활용한 코드입니다. 아래 코드를 public_data.py로 저장하세요.
import requests
import pandas as pd
from pathlib import Path
# ① 설정
API_KEY = "여기에_Decoding_인증키_입력" # ← 1단계에서 발급받은 인증키
OUTPUT_PATH = r"C:\Users\내이름\Desktop\공공데이터_수집결과.xlsx" # ← 저장 경로
# 행정안전부 주민등록 인구통계 API 예시
BASE_URL = "https://apis.data.go.kr/1741000/admmSexdAgeStat/selectAdmmSexdAgeStat"
# ② API 요청 파라미터 (API 문서에 따라 항목이 다름)
params = {
"serviceKey": API_KEY,
"type": "json", # 응답 형식: json 또는 xml
"numOfRows": 100, # 한 번에 가져올 행 수
"pageNo": 1, # 페이지 번호
"regDate": "202605", # 조회 기준월 (예: 2026년 5월)
}
# ③ API 호출
res = requests.get(BASE_URL, params=params, timeout=15)
print(f" ✔ 응답 상태 코드: {res.status_code}")
if res.status_code != 200:
print(f" ✘ 요청 실패: {res.text[:300]}")
else:
data = res.json()
# ④ 응답 구조에 맞게 데이터 추출 (API마다 구조가 다르므로 확인 필요)
items = data.get("StatisticsService", [{}])[1].get("row", [])
print(f" ✔ 수집된 항목: {len(items)}건")
if items:
# ⑤ 데이터프레임으로 변환 후 엑셀 저장
df = pd.DataFrame(items)
df.to_excel(OUTPUT_PATH, index=False)
print(f"\n✅ 완료! 저장 → {OUTPUT_PATH}")
else:
print(" ⚠ 수집된 데이터가 없습니다. 파라미터를 확인하세요.")
💡 API마다 구조가 다릅니다: 공공데이터포털의 API는 제공기관마다 응답 구조(JSON 키 이름)가 다릅니다. 위 코드는 예시이며, 실제 사용할 API의 "활용가이드" 또는 "미리보기" 탭에서 정확한 요청/응답 구조를 반드시 확인한 후 코드를 맞춰야 합니다.
API_KEY에 발급받은 인증키를 입력합니다.BASE_URL과 params를 사용할 API의 가이드에 맞게 수정합니다.python public_data.py
정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 응답 상태 코드: 200 ✔ 수집된 항목: 100건 ✅ 완료! 저장 → C:\Users\내이름\Desktop\공공데이터_수집결과.xlsx
오류 1: SERVICE_KEY_IS_NOT_REGISTERED_ERROR
인증키가 아직 승인되지 않았거나 잘못 입력된 경우입니다. 활용신청 승인까지 최대 1일 소요될 수 있습니다. 마이페이지에서 승인 상태를 확인하세요.
오류 2: 응답이 JSON이 아닌 XML 형식으로 와서 오류 발생
일부 API는 type 파라미터가 없거나 기본값이 XML인 경우가 있습니다. 파라미터 이름이 API마다 다를 수 있으니(type, resultType 등) 가이드 문서를 확인하세요. XML 응답을 처리해야 한다면 아래 코드를 사용하세요:
import xml.etree.ElementTree as ET root = ET.fromstring(res.text)
오류 3: 페이지당 데이터 수가 적어서 전체를 못 받음
대부분의 공공데이터 API는 한 번에 최대 100~1000건만 반환합니다. pageNo를 늘려가며 반복 호출해서 전체 데이터를 모아야 합니다:
all_items = []
for page in range(1, 11): # 최대 10페이지까지
params["pageNo"] = page
res = requests.get(BASE_URL, params=params)
items = res.json().get("StatisticsService", [{}])[1].get("row", [])
if not items:
break
all_items.extend(items)
블로그나 업무에 활용하기 좋은 공공데이터 분야를 소개합니다. 각 분야는 data.go.kr에서 검색해 활용신청하면 됩니다.
인구통계 → 행정안전부 주민등록 인구 통계 상권분석 → 소상공인시장진흥공단 상가업소정보 부동산 → 국토교통부 아파트 매매 실거래가 기상정보 → 기상청 단기예보 조회 서비스 교통정보 → 한국교통안전공단 교통사고 통계 대중교통 → 서울특별시 버스도착정보 의료기관 → 건강보험심사평가원 병원정보서비스
💡 이전 게시글과 결합하면: 차트 자동 저장 편과 결합하면 공공데이터를 시각화한 보고서를 자동으로 만들 수 있고, 스케줄러 편과 결합하면 매달 갱신되는 통계를 자동으로 수집해 누적할 수 있습니다.
이 코드를 응용하면 여러 공공데이터 API를 조합해 지역별 종합 분석 리포트를 만들거나, 매달 자동 수집해 변화 추이를 추적하는 것도 가능합니다.