무조건 성공하는 API 불러오기 및 컴퓨터에 저장 방법
(+ 성공 코드)
사용 언어 : python, 사용 IDE : DataSpell
아래 내용이 어렵다면 링크 확인 필수
▼ ▼ ▼ ▼
▤ 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만개로 설정되어 있는 것과 연관이 있어보임.
▤ 7. JSON형식으로 응답받은 데이터 확인
JSON데이터포멧으로 응답받은 데이터를 확인
불러온 데이터는 딕셔너리로 되어있고 원하는 정보는 "data"키의 값
코드 | 실행 결과 | |
1 | ||
2 |
Pandas라이브러리를 사용해 데이터프레임에 넣을 때
1번처럼 불러온 데이터를 바로 넣으면 목표했던 값들이 모두 data컬럼에 모두 들어가 있는것을 알 수 있다.
2번처럼 불러온 데이터의 'data' 키로 접근해 그 값을 데이터프레임에 넣으면 목표했던 값들이 데이터프레임에 잘 들어갔음을 알 수 있다.
결론. data['data']로 접근
▤ 8. CSV 파일로 저장
파일로 저장할 때 인코딩을 encoding='utf-8-sig' 로 설정하는 이유
▼ ▼ ▼ ▼
만약 .json 파일로 저장하려면 아래 코드
(json파일도 엑셀에서 열 수 있다.)
▤ advanced. 원하는 데이터만 추출하는 코드 작성
전체 데이터는 1억개가 넘어 원하는 데이터만 필터링해 추출해야 함.
사용처지역코드 USAGE_RGN_CD를 확인하면 서울, 경기, 인천, 강원도, 충청북도, 세종특별자치시, 충청남도, 대전광역시 등 타겟이 되는 서울 외 지역이 혼재해 있음.
이래 사항을 필터링하는 코드를 짜야함.
- 서울만 요청.
- 데이터 분석에 용이하게 구별로 분류.
- 구별로 1만개씩 끊어 응답하는 데이터를 이어붙여 하나의 파일로 저장.
- 기간 201907~202308 데이터만.
코드 아이디어: 반복문, concat(), 이어붙여 하나로 만들 데이터프레임
1차 시도
⚠️에러 발생으로 실행 종료
ChunkedEncodingError: ('Connection broken: IncompleteRead(567 bytes read, 7625 more expected)', IncompleteRead(567 bytes read, 7625 more expected))
ChankedEncoingError
HTTP 응답이 예상대로 완료되지 않고 끊겼을 때 발생하는 오류.
서버에서 데이터를 가져올 때 응답이 조각난 경우 발생.
데이터 소실 없이, 통신 지속하게 하는 예외처리 필요
- Retry Mechanism (재시도 메커니즘) : https요청 실패한 경우 계속 재시도, request 라이브러리의 requests.exceptions.RequestException으로 로직 구현
- Backoff Strategy (지수 백오프 전략) : 재시도 시점을 조절, 초기에는 빠르게 재시도 일정 횟수 이상 실패한 경우 재시도 간격을 늘림(서버 과부하 방지)
2차 시도
⚠️원하지 않는 동작 발생
강북구, 도봉구 정상적으로 저장됨.
노원구, 종로구, 서대문구에서 오류 발생 해당 구 데이터 수집이 종료됨.
실행 중지시킴.
재시도 매커니즘 구현
- requests.adapters.HTTPAdapter
- requests.packages.urllib3.util.retry.Retry
연결 재사용 성능 향상
- requests.Session() 사용하여
3차 시도
결론. 속도가 2차 시도때보다 느려졌지만
원하는 필터링 데이터와 구별 파일 모두 저장 완료
이 데이터 분석한 프로젝트 보기
▼ ▼ ▼ ▼
깃허브 주소 (위 코드 다운로드)
▼ ▼ ▼ ▼
'기술스택 > API' 카테고리의 다른 글
[API] 가장 쉬운 API 이해(2024) (0) | 2023.09.29 |
---|