끄적거림

[API]기상청 api로 데이터 가져오기 2 in Python(feat. 동네예보 - 초단기실황) 본문

Python

[API]기상청 api로 데이터 가져오기 2 in Python(feat. 동네예보 - 초단기실황)

Signing 2020. 2. 29. 18:00
728x90
반응형

 

 

 

1. 활용신청

아래의 URL로 접속하여 활용신청을 한다.

https://www.data.go.kr/dataset/15000099/openapi.do

 

공공데이터포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Dataset)와 Open API로 제공하는 사이트입니다.

www.data.go.kr

 

동네예보 조회서비스 API 활용 신청

원하는 서비스에 해당하는 "활용신청" 버튼을 클릭한다.

※ 이때, 참고문서의 "기상청18_동네예보+조회서비스_오픈API활용가이드.zip"을 다운 받는다.

request할 때의 parameter값과 결과값에 대한 코드 정보가 들어있다.

 

 

 

 

2. 지역 좌표 추출

1번에서 가이드를 다운로드 받게 되면 "기상청18_동네예보 조회서비스_오픈API활용가이드_격자_위경도.xlsx"라는 파일을 얻을 수 있다.

기상청18_동네예보 조회서비스_오픈API활용가이드_격자_위경도.xlsx

이 X,Y 좌표들이 나중에 request를 날릴때 parameter값으로 필요하기 때문에 이 excel 파일을 읽어온다.

import pandas as pd

xylist = pd.read_csv("C:/Users/..경로../xylist.csv", encoding='CP949')
uniq_xylist = xylist[['격자 X', '격자 Y']].drop_duplicates()   # 중복 좌표 제거

나는 이 파일을 R로 읽어서 따로 CSV파일로 만들었다.

(왼) 원래 좌표표 (오른) 중복을 제거한 좌표표

 

 

3. Call Back URL, 인증키

 

Call Back URL은 첨부되어 있던 가이드에 나와 있기도 하고, 그림과 같이 마이페이지로 들어가면 인증키와 URL을 확인할 수 있다.

※ 여기서 말하는 인증키는 API키, 서비스키, 사용자키 등등 많은 용어로 불리기도 한다.

 

 

4. 코딩

 

from urllib.request import urlopen
from urllib.parse import urlencode, unquote, quote_plus
import urllib
import requests
import json
import pandas as pd

# Setting for URL parsing
CallBackURL = 'http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtNcst'
params = '?' + urlencode({
    quote_plus("serviceKey"): "~~",      # 인증키
    quote_plus("numOfRows"): "10",          # 한 페이지 결과 수 // default : 10
    quote_plus("pageNo"): "1",              # 페이지 번호 // default : 1
    quote_plus("dataType"): "JSON",         # 응답자료형식 : XML, JSON
    quote_plus("base_date"): "20200225",    # 발표일자 // yyyymmdd
    quote_plus("base_time"): "0600",        # 발표시각 // HHMM, 매 시각 40분 이후 호출
    quote_plus("nx"): "60",                # 예보지점 X 좌표
    quote_plus("ny"): "127"                 # 예보지점 Y 좌표
})

# URL parsing
req = urllib.request.Request(CallBackURL + unquote(params))

# Get Data from API
response_body = urlopen(req).read() # get bytes data

# Convert bytes to json
data = json.loads(response_body)

# Result
res = pd.DataFrame(data['response']['body']['items']['item'])

res 변수를 보면 알겠지만 category 코드로 적혀있다. 이 코드에 대한 정보는 가이드 문서 끝쪽에 위치해 있으니 이를 활용하여 정보를 얻어야한다.

 

 

 

앞전에 2번에서 좌표값을 읽어왔으니 이를 변수화 하여 loop를 돌려 원하는만큼의 지역에 대한 정보를 받아올 수 있다. 자동화시키는 프로세스는 나중에 다루는 걸로....

 

 

728x90
반응형
Comments