공공 데이터 활용 공모전을 준비하는 중, OpenAPI를 사용하게 되었다.
먼저 이번 포스팅에는 OpenAPI를 사용하는 방법을 정리하고, 그 후에 데이터베이스에 저장하는 방법을 정리해보려고 한다.
예시로 사용할 데이터

페이지에 공유된 샘플 코드
# Python3 샘플 코드 #
import requests
url = 'http://apis.data.go.kr/B551177/PassengerNoticeKR/getfPassengerNoticeIKR'
params ={'serviceKey' : '서비스키', 'selectdate' : '0', 'type' : 'xml' }
response = requests.get(url, params=params)
print(response.content)
데이터 명세
① 요청 메시지 명세
| 항목명(영문) | 항목명(국문) | 항목크기 | 항목구분 | 샘플데이터 | 항목설명 |
| selectdate | 일자선택 | 1 | 0 | 0 | 오늘일자(D) ='0', 내일일자(D+1) ='1', default = 0 |
| type | 응답유형 | 4 | 0 | xml | 응답유형 [xml, json] default=xml |
| serviceKey | 서비스키 | 100 | 1 | - | 공공데이터포털에서 받은 인증키 |
※ 항목구분: 필수(1), 옵션(0), 1건 이상 복수건(1..n), 0건 또는 복수건(0..n)
② 응답 메시지 명세
| 항목명(영문) | 항목명(국문) | 항목크기 | 항목구분 | 샘플데이터 | 항목설명 |
| adate | 표출일자 | 10 | 0 | 20211130 | 표출일자(YYYYMMDD) |
| atime | 시간대 | 10 | 0 | 07_08 | 시간대 표시(HH_HH) *1시간 간격 |
| t1sum1 | T1 입국장(A,B) | 10 | 0 | 230.0 | 승객예고 T1 입국장(A,B) 현황(인원 수) |
| t1sum2 | T1 입국장(E,F) | 10 | 0 | 168.0 | 승객예고 T1 입국장(E,F) 현황(인원 수) |
| t1sum3 | T1 입국장(C) | 10 | 0 | 103.0 | 승객예고 T1 입국장(C) 현황(인원 수) |
| t1sum4 | T1 입국장(D) | 10 | 0 | 104.0 | 승객예고 T1 입국장(D) 현황(인원 수) |
| t1sumset1 | T1 입국장 합계 | 10 | 0 | 605.0 | 승객예고 T1 입국장 합계(인원 수) |
| t1sum5 | T1 출국장(1,2) | 10 | 0 | 244.0 | 승객예고 T1 출국장(1,2) 현황(인원 수) |
| t1sum6 | T1 출국장(3) | 10 | 0 | 147.0 | 승객예고 T1 출국장(3) 현황(인원 수) |
| t1sum7 | T1 출국장(4) | 10 | 0 | 189.0 | 승객예고 T1 출국장(4) 현황(인원 수) |
| t1sum8 | T1 출국장(5,6) | 10 | 0 | 250.0 | 승객예고 T1 출국장(5,6) 현황(인원 수) |
| t1sumset2 | T1 출국장 합계 | 10 | 0 | 830.0 | 승객예고 T1 출국장 합계(인원 수) |
| t2sum1 | T2 입국장(A) | 10 | 0 | 0.0 | 승객예고 T2 입국장(A) 현황(인원 수) |
| t2sum2 | T2 입국장(B) | 10 | 0 | 0.0 | 승객예고 T2 입국장(B) 현황(인원 수) |
| t2sumset1 | T2 입국장 합계 | 10 | 0 | 0.0 | 승객예고 T2 입국장 합계(인원 수) |
| t2sum3 | T2 출국장(1) | 10 | 0 | 0.0 | 승객예고 T2 출국장(1) 현황(인원 수) |
| t2sum4 | T2 출국장(2) | 10 | 0 | 0.0 | 승객예고 T2 출국장(2) 현황(인원 수) |
| t2sumset2 | T2 출국장 합계 | 10 | 0 | 0.0 | 승객예고 T2 출국장 합계(인원 수) |
| resultCode | 결과코드 | 10 | 1 | 00 | 결과코드 |
| resultMsg | 결과메시지 | 20 | 1 | NORMAL SERVICE. | 결과메시지 |
※ 항목구분: 필수(1), 옵션(0), 1건 이상 복수건(1..n), 0건 또는 복수건(0..n)
우선 데이터를 사용하기 위해서는 활용신청을 해야한다!

활용신청 후 마이페이지에 들어가면 본인의 인증키를 확인할 수 있다.
Postman으로 호출 확인하기
1. RestAPI 확인
활용가이드 문서에 있는 Rest(URL)
http://apis.data.go.kr/B551177/PassengerNoticeKR/getfPassengerNoticeIKR?serviceKey=인증키&selectdate=0&type=xml

인증키 부분에 마이페이지 -> 개인 API 인증키 -> 인코딩된 인증키 복사해서 넣기
selectdate와 type 항목은 위의 요청 메시지 명세에 따라 원하는 데이터를 지정할 수 있다.
2. Postman 접속

New Request 클릭

GET 주소에 확인한 URL을 붙여넣기 한 후 Send 클릭

다음과 같이 결과가 나오게 된다.
- 우측 창에서 Status: 200OK 확인
- Body 탭에서 응답 형식 변경하여 확인 가능
Python으로 확인하기
jupyter notebook을 사용하여 확인했다.
# 모듈 불러오기
import json
import requests
import pandas as pd
# 본인의 인증키 입력
serviceKey = "본인의 인증키"
url = "openapi url 입력"
# 요청 파라미터
params = {
'selectdate': '0',
'type': 'json',
'serviceKey': serviceKey
}
# API 요청
response = requests.get(url, params=params)
# 응답 상태 확인
print(f"Status Code: {response.status_code}")
응답 상태를 확인했을 때, Status Code: 200 이 나온다면 정상이다.
⭐️ 요청 파라미터는 데이터에 따라 가이드 문서를 확인하여 변경해주어야 한다.
데이터 확인
data = response.json()
items = data.get('response', {}).get('body', {}).get('items', None)
if items:
df = pd.DataFrame(items)
print(df.head())
else:
print("no items in the response.")

이후 원하는 용도에 따라 저장하면 된다.
'IT > Python' 카테고리의 다른 글
| [Python] Iterator와 Generator (0) | 2025.04.03 |
|---|