본문 바로가기
IVS/Python 프로그래밍

[JSON] Project1- 파이썬을 활용한 API 데이터 수집

by 코곰_ 2024. 12. 18.

API (Application Programming Interface)?

정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 매커니즘

서로 다른 애플리케이션끼리 상호작용하고 데이터를 교환하기 위한 규칙과 도구

 

OPEN API?

외부에서 사용할 수 있도록 개방된 API

 

API Key: 사용자가 API를 사용할 수 있는 사용자인지 확인하는 역할

  • 일부 API는 사용량이 제한
  • 공식 문서의 일일 및 월간 사용량 제한 확인
사용 API
OpenWeatherMap API: 기상 데이터 및 날씨 정보를 제공하는 오픈 API
금융상품통합비교공시 API: 금융감독원에서 제공하는 금융 상품 정보를 제공하는 오픈 API

 

 

requests package

  • 파이썬에서 HTTP 요청을 보낼 수 있는 라이브러리

 

 

 

 

Openweathermap API 실습

ex1. 특정 지역의 현재 날씨에 대한 모든 정보 출력하기

import requests
from pprint import pprint

# 문제1. 날씨 데이터의 응답을 json 형태로 변환하여 key 값만 출력하시오.
# 공식문서의 요청변수와 예제 요청결과(JSON) 부분을 참고합니다.

def get_weather():
    api_key = "APIKEY"
    # 서울의 위도
    lat = 37.56
    # 서울의 경도
    lon = 126.97
    # API 요청 URL
    url = f'https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={api_key}'

    # dict 형식으로 response 변수에 할당
    response = requests.get(url).json()
    return response


# 아래 코드는 수정하지 않습니다.
if __name__ == '__main__':
    result = get_weather()
    # pprint: 데이터를 보기 좋게(pretty print) 출력
    pprint(result)

 

 

ex2. 특정 도시의 현재 날씨를 도시 이름으로 요청하여 모든 정보 출력하기

import requests
from pprint import pprint

# 문제2. 날씨 데이터 중 다음 조건에 해당하는 값만 딕셔너리 형태로 반환하는 함수를 구성합니다.
#   KEY 값이“main” 인 데이터
#   KEY 값이 “weather” 인 데이터
# 함수에서 두 데이터를 새로운 dictionary 에 담아서 return 합니다.

def get_weather():
    api_key = "APIKEY"
    city = "Seoul,KR"
    url = f'http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}'

    # 요구사항에 맞도록 이곳의 코드를 수정합니다.
    response = requests.get(url).json()
    return response


# 아래 코드는 수정하지 않습니다.
if __name__ == '__main__':
    api_key = 'API_KEY'
    result = get_weather()
    pprint(result)

 

 

ex3. 서울의 현재 날씨 중 온도만 출력하기

  • 기본적으로 캘빈(K) 온도 반환
  • 섭씨 온도 = (캘빈 온도 - 273.15)
import requests
from pprint import pprint

# 문제3. B번에서 얻는 결과를 활용하여, KEY 값들을 한글로 변경한 딕셔너리를 반환하도록 구성합니다.
# KEY 에 해당하는 한글 KEY 값들은 다음과 같습니다.
    # feels_like : '체감온도',
    # humidity : '습도',
    # pressure : '기압',
    # temp : '온도',
    # temp_max : '최고온도',
    # temp_min : '최저온도',
    # description : '요약',
    # icon : '아이콘',
    # main : '핵심’
    # id : ‘식별자’

def get_weather():
    api_key = "APIKEY"
    city = "Seoul,KR"
    url = f'http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}'

    # 요구사항에 맞도록 이곳의 코드를 수정합니다.
    response = requests.get(url).json()
    k_temp = response['main']['temp']
    c_temp = k_temp - 273.15
    print(f'캘빈 온도: {k_temp}K\n섭씨 온도: {c_temp:.2f}°C')


# 아래 코드는 수정하지 않습니다.
if __name__ == '__main__':
    result = get_weather()

[실행 결과]

캘빈 온도: 269.91K
섭씨 온도: -3.24°C

 

 

ex4. 서울의 현재 날씨에 대한 설명(description) 데이터만 출력하기

import requests
from pprint import pprint

# 문제4. C번의 데이터를 활용하여, 섭씨 온도 데이터를 추가합니다.

def get_weather():
    api_key = "APIKEY"
    city = "Seoul,KR"
    url = f'http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}'

    # 요구사항에 맞도록 이곳의 코드를 수정합니다.
    response = requests.get(url).json()
    description = response['weather'][0]['description']
    res = '날씨 설명: ' + description
    return res


# 아래 코드는 수정하지 않습니다.
if __name__ == '__main__':
    result = get_weather()
    pprint(result)

[실행 결과]

'날씨 설명: clear sky'

 

 

 

 

 

[Project] 파이썬을 이용한 API 데이터 수집

A. 데이터 추출- Key 값 출력하기

전체 정기예금의 응답을 json 형태로 변환 후 Key값만 출력하도록 구성

import pprint
import requests

# 전체 정기예금의 응답을 json 형태로 변환하여 key 값만 출력하시오.
# 공식문서의 요청변수와 예제 요청결과(JSON) 부분을 참고합니다.
# [힌트] 아래와 같은 순서로 데이터를 출력하며 진행합니다.
# 1. 응답을 json 형식으로 변환합니다.
# 2. key 값이 "result" 인 데이터에 모든 정보가 담겨 있습니다.
# 3. key 값이 "result" 인 데이터의 key 값만 출력합니다.

def get_deposit_products():
    api_key = "API KEY"
    url = 'http://finlife.fss.or.kr/finlifeapi/depositProductsSearch.json'
    params = {
        'auth': api_key,
        'topFinGrpNo': '020000',
        'pageNo': 1
    }
    
    # 응답을 json 형태로 변환
    response = requests.get(url, params = params).json()
    ret = response['result'].keys()
    return ret
    
# 아래 코드는 수정하지 않습니다.
if __name__ == '__main__':
    # json 형태의 데이터 반환
    result = get_deposit_products()
    # prrint.prrint(): json 을 보기 좋은 형식으로 출력
    pprint.pprint(result)

 

 

B. 데이터 추출- 전체 정기예금 상품 리스트

응답 중 정기예금 상품 리스트 정보만 출력하도록 구성

import pprint
import requests

# 전체 정기예금 상품 리스트를 출력하시오.
# 공식문서의 요청변수와 예제 요청결과(JSON) 부분을 참고합니다.
# [힌트] 아래와 같은 순서로 데이터를 출력하며 진행합니다.
# 1. 응답을 json 형식으로 변환합니다.
# 2. key 값이 "result" 인 데이터를 출력합니다.
# 3. 위의 결과 중 key 값이 "baseList" 인 데이터를 출력합니다.

def get_deposit_products():
    api_key = "API KEY"
    url = 'http://finlife.fss.or.kr/finlifeapi/depositProductsSearch.json'
    params = {
        'auth': api_key,
        'topFinGrpNo': '020000',
        'pageNo': 1
    }

    # 응답을 json 형태로 변환
    response = requests.get(url, params = params).json()
    ret = response['result']['baseList']
    return ret
    
# 아래 코드는 수정하지 않습니다.
if __name__ == '__main__':
    # json 형태의 데이터 반환
    result = get_deposit_products()
    # prrint.prrint(): json 을 보기 좋은 형식으로 출력
    pprint.pprint(result)

 

 

C. 데이터 가공- 전체 정기예금 옵션 리스트

응답 중 정기예금 상품들의 옵션 리스트를 출력하도록 구성

JSON 구조

import pprint
import requests

# 응답 중 정기예금 상품들의 옵션 리스트를 출력하도록 구성합니다.
# 이 때, 원하는 데이터만 추출하여 새로운 리스트를 만들어 반환하는 함수를 작성하시오.
# [힌트] 아래와 같은 순서로 데이터를 출력하며 진행합니다.
# 1. 응답을 json 형식으로 변환합니다.
# 2. key 값이 "result" 인 데이터를 출력합니다.
# 3. 위의 결과 중 key 값이 "optionList" 인 데이터를 변수에 저장합니다.
# 4. 3번에서 저장된 값을 반복하며, 원하는 데이터만 추출 및 가공하여 결과 리스트에 저장합니다.

def get_deposit_products():
    api_key = "API KEY"
    url = 'http://finlife.fss.or.kr/finlifeapi/depositProductsSearch.json'
    params = {
        'auth': api_key,
        'topFinGrpNo': '020000',
        'pageNo': 1
    }

    # 응답을 json 형태로 변환
    response = requests.get(url, params = params).json()
    option_data = response['result']['optionList']

    #di = {}
    option_list = []
    for data in option_data:
        di = {}
        di['금융상품 코드'] = data['fin_prdt_cd']
        di['저축 금리'] = data['intr_rate']
        di['저축 기간'] = data['save_trm']
        di['저축 금리 유형'] = data['intr_rate_type']
        di['저축 금리 유형명'] = data['intr_rate_type_nm']
        di['최고 우대금리'] = data['intr_rate2']
        option_list.append(di)

    print(option_list)
    
# 아래 코드는 수정하지 않습니다.
if __name__ == '__main__':
    # json 형태의 데이터 반환
    result = get_deposit_products()
    # prrint.prrint(): json 을 보기 좋은 형식으로 출력
    pprint.pprint(result)

[출력 예시]

 

 

D. 데이터 가공- 새로운 값을 만들어 반환하기

import pprint
import requests

# 상품과 옵션 정보들을 담고 있는 새로운 객체를 만들어 반환하시오.
# [힌트] 상품 리스트와 옵션 리스트를 금융상품 코드를 기준으로 매칭할 수 있습니다.
# [힌트] 아래와 같은 순서로 데이터를 출력하며 진행합니다.
# 1. 응답을 json 형식으로 변환합니다.
# 2. key 값이 "result" 인 데이터를 변수에 저장합니다.
# 3. 2번의 결과 중 key 값이 "baseList" 인 데이터를 변수에 저장합니다.
# 4. 2번의 결과 중 key 값이 "optionList" 인 데이터를 변수에 저장합니다.
# 5. 3번에서 저장된 변수를 순회하며, 4번에서 저장된 값들에서 금융 상품 코드가 
#     같은 모든 데이터들을 가져와 새로운 딕셔너리로 저장합니다.
#     저장 시, 명세서에 맞게 출력되도록 저장합니다.
# 6. 5번에서 만든 딕셔너리를 결과 리스트에 추가합니다.

def get_deposit_products():
    api_key = "API KEY"
    url = 'http://finlife.fss.or.kr/finlifeapi/depositProductsSearch.json'
    params = {
        'auth': api_key,
        'topFinGrpNo': '020000',
        'pageNo': 1
    }

    # 응답을 json 형태로 변환
    response = requests.get(url, params = params).json()
    base_data = response['result']['baseList']
    option_data = response['result']['optionList']
    # base_data를 순회하며 option_data의 금융상품코드가 같은 데이터를
    # 모두 가져와 새로운 딕셔너리로 저장
    print(type(base_data))
    res_list = []
    res_data = []
    for data_b in base_data:
        res_di = {}
        for data_o in option_data:
            if(data_b['fin_prdt_cd'] == data_o['fin_prdt_cd']):
                di = {}
                di['저축 금리 유형'] = data_o['intr_rate_type']
                di['저축 금리 유형명'] = data_o['intr_rate_type_nm']
                di['저축 기간'] = data_o['save_trm']
                di['저축 금리'] = data_o['intr_rate']
                di['최고 우대금리'] = data_o['intr_rate2']
                res_data.append(di)
        res_di['금리 정보'] = res_data
        res_di['금융 상품명'] = data_b['fin_prdt_nm']
        res_di['금융회사 명'] = data_b['kor_co_nm']
        res_list.append(res_di)
       
    print(res_list)
  
if __name__ == '__main__':
    # json 형태의 데이터 반환
    result = get_deposit_products()
    # prrint.prrint(): json 을 보기 좋은 형식으로 출력
    pprint.pprint(result)

[출력 예시]

 

 

 

 

+ 참고

유효성 검사
https://jsonlint.com/
JSON Viewer
https://jsonviewer.stack.hu/

JSON Viewer를 통해 구조를 파악하도록 하자..!