본문 바로가기

Python

파이썬으로 기상청 API 호출하기 동네예보정보조회서비스

동네예보정보조회서비스는 공공데이터포털에서 제공하는 동네의 날씨 정보 API다.

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

 

공공데이터포털

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

www.data.go.kr

사이트 접속 후 회원가입, 로그인을 해야 한다.

API를 받아내려면 로그인하고 요청을 해야 한다.

로그인을 하고 동네예보정보조회 서비스 Open API에 접속하면 활용신청 버튼이 있다.

양식을 작성하고 신청한다.

몇시간 또는 며칠 정도의 시간이 지난 후 공공데이터 포털의 마이페이지에 들어가보면 [승인] 동네예보정보조회서비스가 있다.

들어가 보면 일반 인증키가 써있다.

파란색 실행 버튼을 누르면 창이 생기는데 servicekey를 입력하고 base_date에 오늘 날짜!!!를 입력한다.

 

미리보기를 누르면 창이 뜨면서 날씨 정보가 나온다.

 

여기까지는 서비스 키를 받아서 API 요청 후 샘플로 데이터를 응답받는 부분이다.

 

파이썬 코드로 API를 호출해본다.

 

위도 경도는 구글 지도에서 원하는 지역에 마우스를 갖다 대고 우클릭해서 "이곳이 궁금한가요?"를 선택하면 된다.

그럼 요래 나온다. 하단의 위도 경도를 클릭해서 왼쪽에 나오는 위도 경도 값을 복사하거나 일일이 입력해서 x, y좌표로 변환해야 한다.

https://fronteer.kr/service/kmaxy

이 사이트에 들어가서 위도 경도를 입력하면 x, y좌표가 나오게 된다.

아니면 계산하는 코드가 있긴 하다.

 

아무튼 x가 60, y가 125면 서초역 주변을 의미한다.

파이썬 파일을 하나 만들고 다음 코드를 넣는다.

변경해줘야할 부분이 있다.

1. get_sky_info 함수에서 습도, 강수량, 구름정보 등등 다양한 정보를 뽑아낼 수 있는데 여기선 구름 정보만 뽑아냈다. 그러므로 JSON 응답값에서 자신이 원하는 정보를 key로 접근해서 뽑아내야 한다... 화이팅!

2. get_weather() 함수에서 service_key는 반드시 아까 발급받은 key로 바꿔줘야 한다. 문자열이어야 한다.

3. nx, ny는 위도 경도가 아닌!! 위도 경도를 변환해서 나온 x, y좌표이다. 반드시 원하는 지역의 x, y좌표를 구해내서 넣어줘야 한다.

 

지금 위 사항만 변경하고 실행하면 숫자가 출력된다. 1은 맑음, 2는 구름조금, 3은 구름많음, 4는 흐림이다.

아래 코드를 활용하고 싶다면 1.번에서 언급한대로 응답값에서 자신이 원하는 값을 뽑아내는 수고를 해야 한다. 별로 어렵지 않다. 

import json
from datetime import datetime
from urllib.request import urlopen


def get_sky_info(data):
    try:
        weather_info = data['response']['body']['items']['item']
        if weather_info[3]['category'] == 'SKY':
            return weather_info[3]['fcstValue']
        elif weather_info[5]['category'] == 'SKY':
            return weather_info[5]['fcstValue']
    except KeyError:
        print('API 호출 실패!')


def get_base_time(hour):
    hour = int(hour)
    if hour < 3:
        temp_hour = '20'
    elif hour < 6:
        temp_hour = '23'
    elif hour < 9:
        temp_hour = '02'
    elif hour < 12:
        temp_hour = '05'
    elif hour < 15:
        temp_hour = '08'
    elif hour < 18:
        temp_hour = '11'
    elif hour < 21:
        temp_hour = '14'
    elif hour < 24:
        temp_hour = '17'

    return temp_hour + '00'


def get_weather():
    service_key = 'Insert Your ServiceKey!!!'
    now = datetime.now()
    now_date = now.strftime('%Y%m%d')
    now_hour = int(now.strftime('%H'))

    if now_hour < 6:
        base_date = str(int(now_date) - 1)
    else:
        base_date = now_date
    base_hour = get_base_time(now_hour)

    num_of_rows = '6'
    base_date = base_date
    base_time = base_hour
    nx = str(60)
    ny = str(125)
    _type = 'json'
    api_url = 'http://newsky2.kma.go.kr/service/SecndSrtpdFrcstInfoService2/ForecastSpaceData?serviceKey={}' \
              '&base_date={}&base_time={}&nx={}&ny={}&numOfRows={}&_type={}'.format(
        service_key, base_date, base_time, nx, ny, num_of_rows, _type)

    data = urlopen(api_url).read().decode('utf8')
    json_data = json.loads(data)
    sky = get_sky_info(json_data)
    return sky


weather = get_weather()
print(weather)

'Python' 카테고리의 다른 글

파이썬 코드 예제 사이트  (0) 2020.04.10
pip3 사용하기  (0) 2020.03.08
파이썬 질문  (0) 2019.07.21
.pyc란 무엇인가?  (0) 2019.07.21
파이참에서 DB 브라우저 켜기  (0) 2019.07.20