Finn.ian
article thumbnail

[์ถœ์ฒ˜ : stratascratch]

 

๐Ÿผ : ๊ธฐ์ƒ์ฒญ_๋‹จ๊ธฐ์˜ˆ๋ณด((๊ตฌ)_๋™๋„ค์˜ˆ๋ณด) Open API ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, Open API๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ตณ์ด ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๊ณต์งœ๋กœ ์ œ๊ณต๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์„œ ์ด๋ฅผ ํ™œ์šฉํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

STEP1. ๋ฐ์ดํ„ฐ ํ™œ์šฉ ์‹ ์ฒญํ•˜๊ธฐ

์šฐ์„ , ์•„๋ž˜ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํฌํ„ธ์—์„œ ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ์ง„ํ–‰ํ•ด์•ผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. (ํšŒ์›๊ฐ€์ž… ~ ๋กœ๊ทธ์ธ๊นŒ์ง€ ์ง„ํ–‰ Go!) 

 

๊ณต๊ณต๋ฐ์ดํ„ฐ ํฌํ„ธ

๊ตญ๊ฐ€์—์„œ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผใ€Ž๊ณต๊ณต๋ฐ์ดํ„ฐ์˜ ์ œ๊ณต ๋ฐ ์ด์šฉ ํ™œ์„ฑํ™”์— ๊ด€ํ•œ ๋ฒ•๋ฅ (์ œ11956ํ˜ธ)ใ€์— ๋”ฐ๋ผ ๊ฐœ๋ฐฉํ•˜์—ฌ ๊ตญ๋ฏผ๋“ค์ด ๋ณด๋‹ค ์‰ฝ๊ณ  ์šฉ์ดํ•˜๊ฒŒ ๊ณต์œ •ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๊ณต๋ฐ์ดํ„ฐ(Datase

www.data.go.kr

 

๊ฒ€์ƒ‰์— '๊ธฐ์ƒ์ฒญ'์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์•„๋ž˜ ์ œ๋ชฉ๊ณผ ๊ฐ™์ด ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ํ™œ์šฉํ•˜๋ ค๋Š” ์˜คํ”ˆ API๊ฐ€ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ์ธก ํ•˜๋‹จ 'ํ™œ์šฉ์‹ ์ฒญ'์„ ํด๋ฆญํ•ด์š”~

๊ธฐ์ƒ์ฒญ_๋‹จ๊ธฐ์˜ˆ๋ณด((๊ตฌ)_๋™๋„ค์˜ˆ๋ณด) ์กฐํšŒ์„œ๋น„์Šค ์˜คํ”ˆ API ๊ฒ€์ƒ‰

์‹ ์ฒญ ์™„๋ฃŒ ํ›„ '๋งˆ์ดํŽ˜์ด์ง€ > ๋ฐ์ดํ„ฐํ™œ์šฉ > Open API > ํ™œ์šฉ์‹ ์ฒญ ํ˜„ํ™ฉ' ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋ฉด ์•„๋ž˜ [์Šน์ธ] ๋œ ๊ฑด์„ ํด๋ฆญํ•ด์ฃผ์„ธ์š”.

 

์˜คํ”ˆAPI ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์ดํŽ˜์ด์ง€

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ๊ณ„์ • ์ƒ์„ธ๋ณด๊ธฐ๊ฐ€ ๋œจ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ๊ธฐ๋ณธ์ •๋ณด ์นธ์˜ '์ƒ์„ธ์„ค๋ช…'์„ ํด๋ฆญํ•˜์—ฌ Request Parameter์™€ Response Parameter ํ™•์ธํ•˜๊ธฐ!

 

 

 

STEP2. API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

  • ๊ฐœ๋ฐœํ™˜๊ฒฝ : Jupyter Notebook / Python3.10.4 / VSCode
# 1. ํ•„์š”ํ•œ module๋ถ€ํ„ฐ importํ•˜๊ธฐ
import requests

# 2. url ์ž…๋ ฅ
url = '${Endpoint}?serviceKey=${์„œ๋น„์Šคํ‚ค}&pageNo=1&numOfRows=1000&dataType=JSON&base_date=20240316&base_time=0630&nx=55&ny=127'

# 3. url ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
response = requests.get(url)

# 4. response ๊ฐ์ฒด์—์„œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑ
data = response.json()

# 5. json ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•œ ๊ฒƒ์„ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ!
# ์ถœ๋ ฅํ•˜๋ฉด ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ!
print(data)

 

์œ„์˜ ์ถœ๋ ฅ๋ฌผ์„ ๋ดค์„ ๋•Œ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ์Œ..์šฐ์„  ๋ฐ์ดํ„ฐ๋Š” ๋ฐ›์•„์˜จ ๊ฑด ์•Œ๊ฒ ๋Š”๋ฐ JSON ํ˜•ํƒœ์ธ์ง€ ๋ˆˆ์œผ๋กœ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์•„ ์•„๋ž˜ ์ฝ”๋“œ ์ถ”๊ฐ€ํ•˜์—ฌ ์ถœ๋ ฅ!

# ํŒŒ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
# ๋‹จ, ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ json Moduel์„ import ํ•ด์ฃผ์–ด์•ผ ํ•จ!
json_api = json.dumps(data, indent=4)

# ๋ฐ์ดํ„ฐ๊ฐ’ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ
print(json_api)

indent๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ๋ณธ json ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ!

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์™”์œผ๋ฉด ๋ฐ์ดํ„ฐ๋Š” ์ž˜ ๊ฐ€์ง€๊ณ  ์˜จ ์ƒํ™ฉ์ด๋‹ˆ, ์ด์ œ DataFrame์„ ์ž…ํ˜€์ฃผ์ž!

# ํŒ๋‹ค์Šค๋กœ ๋ฐ์ดํ„ฐ ๊ฐ์‹ธ์ฃผ๊ธฐ 
fcstInfo_df = pd.DataFrame(data['response']['body']['items']['item'])

# ๋ฐ์ดํ„ฐ๊ฐ€ ํŒ๋‹ค์Šค๋กœ ์ž˜ ์ถœ๋ ฅ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
print(fcstInfo_df)

 

print(fcstInfo_df) ๊ฐ’์ด ์‹คํ–‰๋์„ ๋•Œ ๊ฒฐ๊ณผ๊ฐ’!

์ด๋ ‡๊ฒŒ Open API๋ฅผ python ์ฝ”๋“œ๋กœ ๊ฐ„๋‹จํžˆ ํ™œ์šฉํ•˜์—ฌ ์ถœ๋ ฅํ•ด๋ณด์•˜๋‹ค. ๊ณต๊ณต๋ฐ์ดํ„ฐ ํ™ˆํŽ˜์ด์ง€์—๋Š” ํ…Œ๋งˆ๋ณ„, ๊ตญ๊ฐ€์ค‘์ ๋ฐ์ดํ„ฐ ๋“ฑ ๋‹ค์–‘ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋‹ˆ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํฌํ„ธ ๋‚ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ํ™œ์šฉํ•ด๋ณด์ž!

 

dataType์ด XML์ธ ๊ฒฝ์šฐ๋Š” ๋‹ค์ŒํŽธ์— ์ž‘์„ฑ ์˜ˆ์ •์ด๋‹ค.

 

ํ‘œ Header๊ฐ€ ์ข€ ๋” ์ž˜๋ณด์ด๋„๋ก ์•„๋ž˜ ์ถ”๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฒจ๋ถ€ํ•ด๋†จ๋‹ค!

๋”๋ณด๊ธฐ

Add Python Code 

# ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ import
import requests
# import json
import pandas as pd

# url ์ž…๋ ฅ
url = '${Endpoint}?serviceKey=${์„œ๋น„์Šคํ‚ค}&pageNo=1&numOfRows=1000&dataType=JSON&base_date=20240316&base_time=0630&nx=55&ny=127'

# url ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
response = requests.get(url)

# response ๊ฐ์ฒด์—์„œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑ
data = response.json()

# data ๋ณ€์ˆ˜๊ฐ€ json ํ˜•ํƒœ๋กœ ์ž˜ ์ถœ๋ ฅ๋˜๋Š”์ง€ ํ™•์ธ
# print(data)

# data ๊ฒฐ๊ณผ๊ฐ’
# {'response': {'header': {'resultCode': '00', 'resultMsg': 'NORMAL_SERVICE'}
# , 'body': {'dataType': 'JSON', 'items': {'item': [{'baseDate': '20240316', 
# 'baseTime': '0630', 'category': 'LGT', 'fcstDate': '20240316', 'fcstTime': '0700', 'fcstValue': '0', 
# 'nx': 55, 'ny': 127}, {'baseDate': '20240316', 'baseTime': '0630', 'category': 'LGT', 'fcstDate': '20240316',
# ....

# 2์ฐจ์› ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ๋งŒ๋“ค์–ด๋ณด์ž!
# ์šฐ์„  ๊ฐ Key๋ณ„๋กœ ๋นˆ ๋ฆฌ์ŠคํŠธ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ฃผ์ž
baseDate_list = []
baseTime_list = []
category_list = []
fcstDate_list = []
fcstTime_list = []
fcstValue_list = []
nx_list = []
ny_list = []

for temps in data['response']['body']['items']['item']:
    baseDate_list.append(temps['baseDate'])
    baseTime_list.append(temps['baseTime'])
    category_list.append(temps['category'])
    fcstDate_list.append(temps['fcstDate'])
    fcstTime_list.append(temps['fcstTime'])
    fcstValue_list.append(temps['fcstValue'])
    nx_list.append(temps['nx'])
    ny_list.append(temps['ny'])

# list๊ฐ€ ์ž˜ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํ™•์ธ
# print(baseDate_list)
# print(category_list)
# print(fcstTime_list)
# print(nx_list)

# list์— ์ž˜ ๋“ค์–ด๊ฐ€๋ฉด ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ!
Fcast_df = pd.DataFrame({
    'baseDate' : baseDate_list,
    'baseTime' : baseTime_list,
    'category' : category_list,
    'fcstDate' : fcstDate_list,
    'fcstTime' : fcstTime_list,
    'fcstValue' : fcstValue_list,
    'nx' : nx_list,
    'ny' : ny_list
})

# ํ™•์ธ!
display(Fcast_df)

 

์ถœ๋ ฅ๊ฐ’

 

profile

Finn.ian

@Finn_

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!

๊ฒ€์ƒ‰ ํƒœ๊ทธ