Dev Hyeri

기술스택/API

[API] 공공데이터포털 API로 데이터 불러오는 방법(2024)

_hyeri 2023. 9. 30. 19:36

 

무조건 성공하는 API 불러오기 및 컴퓨터에 저장 방법

(+ 성공 코드)

 

사용 언어 : python,  사용 IDE : DataSpell

 

 

아래 내용이 어렵다면 링크 확인 필수

▼ ▼ ▼ ▼

 

[개발지식] 가장 쉬운 API 이해

API Application Programming Interface 애플리케이션 프로그램 인터페이스 소프트웨어 간의 요청.응답. 통신 예시 user API database 스마트폰 날씨 앱 API 기상청 소프트웨어 시스템에 들어있는 일일 기상 데이

developevolvify.tistory.com

 

 

 

 

 

▤ 1. 공공데이터포털에서 원하는 데이터 선택 및 활용 신청


1. '오픈API 상세'창에서   활용신청    버튼을 'Ctrl 키'를 누른채 클릭하여 새창으로 연 뒤 신청 진행 

2. '마이페이지'에서 신청 결과 확인

3. '마이페이지' '개발개정 상세보기'에서 확인 할 수 있는 정보들을 체크한다. 해당 창을 유지 

 

'활용신청' 버튼을 클릭해 신청 진행
마이페이지에서 신청 결과 확인

 

'마이페이지'의  '개발개정 상세보기 ' 확인할 수 있는 정보들

 

 

 

 

▤ 2. 다른 API 샘플코드를 참고하여 필요한 정보 확인 


1. '한국조폐공사 지역사랑상품권 결제정보' 오픈 API는 샘플코드가 없어 다른 데이터의 샘플코드 카피

import requests

url = 'http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst'
params ={'serviceKey' : '서비스키', 'pageNo' : '1', 'numOfRows' : '1000', 'dataType' : 'XML', 'base_date' : '20210628', 'base_time' : '0600', 'nx' : '55', 'ny' : '127' }

response = requests.get(url, params=params)
print(response.content)

 

2. 코드를 보면 'url', '서비스키', 'params' 정보가 필요

  • 주의. '마이페이지' '개발개정 상세보기'에서 확인한 End Point 주소를 API의 url로 사용하면 안됨(이유는 밑에서).

3. '오픈API 상세' 창 맨 하단 'Models' '>' 를 클릭하자 데이터의 정보를 확인. 대략 눈으로 훑어 구조 파악.

  • API 마다 컬럼이나 데이터 구조 정리를 다르게 했을 수 있으니 선택한 API가 제공한 대로 확인한다.

 


 

 

 

 

▤ 3. API 호출 테스트 _ API의 URL 및 동작 인증키 확인 작업


1. API 목록의     GET      /paymentV2 지역사랑상품권_결제정보  클릭 드롭다운으로 창 확장.

2. 'OpenAPI 실행 준비' 버튼 클릭

3. *required는 필수값.

  • serviceKey에는 공공데이터포털에서 받은 인증키라는 안내가 나와있다.  '마이페이지''개발개정 상세보기' 에서 확인한 일반 인증키 중 위의 것 (Encoding) 값을 복사해 붙여 넣는다.
  • 나머지 필수값에는 작은 값을 넣어 테스트해보자 (여기서는 다음 값을 넣었다. 페이지번호: 1, 한 페이지 결과 수: 2 )
  • 필수 값이 아닌 나머지는 비워둔다. 

4.    OpenAPI 호출    버튼 클릭. 

인증키가 인코딩일 때 실행 결과

 

5. Response body에 불려온 것을 확인

____★ 보면 "SERVICE_KEY_IS_NOT_REGISTERED_ERROR" 메시지 출력

→ 즉, 인증키 인코딩 방식으로는 코드를 짜면 데이터를 불러오는 데 실패할 것

 

 

6. serviceKey에  '마이페이지'  '개발개정 상세보기' 에서 확인한 일반 인증키 중 아래 것 (Decoding) 값을 복사해 붙여 넣는다.    OpenAPI 호출    버튼 클릭.

7. Response body에 불려온 것을 확인. 원하는 데이터 출력

→ 인증키 디코딩 방식으로는 코드를 짜면 데이터를 불러오는 데 성공할 것

 

     결론. 인증키로  일반 인증키 중 아래의 (Decoing)을 사용해야 한다. 

  (다른 API에서는 정상 동작하는 API Key가  Encodin일 수 있으니 동작 여부를 꼭 확인해야 함)  

 

 

8. 같은 페이지에서 'URL' 확인 ( '?'는 구분자 같은 거라 무시) 

 

 

   결론. 사용해야 하는 URL  

https://apis.data.go.kr/B190001/localGiftsPaymentV2/paymentsV2

 

'마이페이지'의 '개발개정 상세보기'에서 확인한 End Point 주소와 차이가 있다. End Point가 API url인줄 알고 바로 복사 붙여넣기 하면 안된다. 

http://apis.data.go.kr/B190001/localGiftsPaymentV2

 

 

 

 

▤ 4. 파라미터


구분 원천 데이터셋 링크 비고
한국조폐공사 지역사랑상품권 결제정보 https://www.data.go.kr/data/15108292/openapi.do#/layer-api-guide 공공데이터포털
REST API
컬럼명 설명 타입
PVSN_INST_CD 제공기관코드 string
CRTR_YM 기준연월 string
ALT_TEXT 가맹점 구분 ID
(사업자등록번호 대체텍스트)
string
USAGE_RGN_CD 사용처지역코드 string
PAR_GEND 결제자성별(M: 남성 F: 여성) string
PAR_AG 결제자연령대
(01: ~19 02: 20~29세 03:30~39세...)
string
STLM_NOCS 결제건수 integer
STLM_AMT 결제금액 integer
CARD_USE_AMT 카드사용금액 integer
MBL_USER_CNT 휴대이용자수 
(실제 결제를 한번이라도 진행한 사용자 수)
integer
MBL_USE_AMT 휴대사용금액 integer

 

 

 

 

5. 확인한 정보들로 샘플 코드 수정


Url , 디코딩 인증키, params(파람, 파라미터의 약어 변수명) 키와 값 작성 및 응답

(API 목록의  ' GET   /paymentV2 지역사랑상품권_결제정보' 클릭 드롭다운으로 창이 확장했을 때 확인한 Parameters의 Name 들)

데이터 통신이 잘 됨

 

 

 

소프트웨어 간 요청, 응답, 통신 이해

'마이페이지' '개발개정 상세보기'의 미리보기 아래 '확인' 버튼을 클릭

이런식으로 통신이 이루어지며

자기가 사용하는 IDE에 실행 결과로 출력되는 테크트리 확인

 

 

 

 

6. 일일 트래픽


페이지당 10만개의 데이터를 불러올 수 있게 코드를 수정한 결과 데이터가 제대로 들어오지 않음. 숫자를 이것 저것 테스트했을 때 1만 개까지 제대로 들어오는 걸 보면 

'마이페이지' '개발개정 상세보기'에서 일일 트래픽이 1만개로 설정되어 있는 것과 연관이 있어보임.

Response body에 데이터가 제대 들어오지 않는다.
Response body에 데이터가 제대 들어오지 않는다.
일일 트래픽과 연관성

 

 

 

 

▤ 7. JSON형식으로 응답받은 데이터 확인 


 

JSON데이터포멧으로 응답받은 데이터를 확인

불러온 데이터는 딕셔너리로 되어있고 원하는 정보는 "data"키의 값 

 

 

  코드 실행 결과
1
2

 

 

Pandas라이브러리를 사용해 데이터프레임에 넣을 때

1번처럼 불러온 데이터를 바로 넣으면 목표했던 값들이 모두 data컬럼에 모두 들어가 있는것을 알 수 있다.

2번처럼 불러온 데이터의 'data' 키로 접근해 그 값을 데이터프레임에 넣으면 목표했던 값들이 데이터프레임에 잘 들어갔음을 알 수 있다. 

 

 

 

    결론. data['data']로 접근    

 

 

    

 

▤ 8. CSV 파일로 저장


[코드복사] df.to_csv('파일명.csv', encoding='utf-8-sig', index=False)

 

 

파일로 저장할 때 인코딩을 encoding='utf-8-sig' 로 설정하는 이유

▼ ▼ ▼ ▼   

 

[ 파이썬 ] 주피터 노트북 한글 깨짐, 인코딩 문제 한방에 고치기

주피터노트북 CSV 한글 깨짐, 인코딩 문제 한방에 고치기 혹시 아래와 같은 문제를 겪고있지 않은지 확인해보자 1. 불러올 데이터에 한글이 있고 2. 해당 데이터를 주피터 노트북으로 불러왔더니

developevolvify.tistory.com

 

 

 

만약 .json 파일로 저장하려면 아래 코드

(json파일도 엑셀에서 열 수 있다.)

[코드복사]  with open('data.json', 'w', encoding='utf-8-sig') as file: json.dump(data['data'], file, indent=4, ensure_ascii=False)

 

 

 

 

▤ advanced.  원하는 데이터만 추출하는 코드 작성


전체 데이터는 1억개가 넘어 원하는 데이터만 필터링해 추출해야 함.  

사용처지역코드 USAGE_RGN_CD를 확인하면 서울, 경기, 인천, 강원도, 충청북도, 세종특별자치시, 충청남도, 대전광역시 등 타겟이 되는 서울 외 지역이 혼재해 있음. 

 

이래 사항을 필터링하는 코드를 짜야함.

  1. 서울만 요청. 
  2. 데이터 분석에 용이하게 구별로 분류.
  3. 구별로 1만개씩 끊어 응답하는 데이터를 이어붙여 하나의 파일로 저장. 
  4. 기간 201907~202308 데이터만.

코드 아이디어: 반복문, concat(), 이어붙여 하나로 만들 데이터프레임

 

 

 

 

 

1차 시도 

⚠️에러 발생으로 실행 종료

ChunkedEncodingError: ('Connection broken: IncompleteRead(567 bytes read, 7625 more expected)', IncompleteRead(567 bytes read, 7625 more expected))

 

 

ChankedEncoingError

HTTP 응답이 예상대로 완료되지 않고 끊겼을 때 발생하는 오류.

서버에서 데이터를 가져올 때 응답이 조각난 경우 발생.

 

 

 

 

 

데이터 소실 없이, 통신 지속하게 하는 예외처리 필요 

  1. Retry Mechanism (재시도 메커니즘) : https요청 실패한 경우 계속 재시도, request 라이브러리의 requests.exceptions.RequestException으로 로직 구현 
  2. Backoff Strategy (지수 백오프 전략) : 재시도 시점을 조절, 초기에는 빠르게 재시도 일정 횟수 이상 실패한 경우 재시도 간격을 늘림(서버 과부하 방지)
2차 시도 

⚠️원하지 않는 동작 발생 

강북구, 도봉구 정상적으로 저장됨.  
노원구, 종로구, 서대문구에서 오류 발생 해당 구 데이터 수집이 종료됨.

실행 중지시킴.

 

 

 

 

 

재시도 매커니즘 구현

  • requests.adapters.HTTPAdapter
  • requests.packages.urllib3.util.retry.Retry

연결 재사용 성능 향상

  • requests.Session() 사용하여 
3차 시도 

 

 

    결론. 속도가 2차 시도때보다 느려졌지만     

    원하는 필터링 데이터와 구별 파일 모두 저장 완료     

 

 

 

 

 

이 데이터 분석한 프로젝트 보기

▼ ▼ ▼ ▼

 

[ 데이터 분석 ] 서울시 구별 지역 화폐 활성화 정도 분석

(작성중) 단순 통계와 달리 데이터 분석은 문제 해결을 위한 상상력이 중요 데이터 분석 활동의 목표 Python Language 활용 데이터 분석 시각화 연습 데이터 변수의 특성과 구조적 관계 파악 훈련 목

developevolvify.tistory.com

 

깃허브 주소 (위 코드 다운로드)

▼ ▼ ▼ ▼

 

GitHub - yoonhyeri/data_api: 공공데이터포털 API로 데이터 불러오는 방법

공공데이터포털 API로 데이터 불러오는 방법. Contribute to yoonhyeri/data_api development by creating an account on GitHub.

github.com

 

'기술스택 > API' 카테고리의 다른 글

[API] 가장 쉬운 API 이해(2024)  (0) 2023.09.29