ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 날씨예보 API 접근법 및 파이썬 활용 코드
    Python 2022. 8. 16. 01:51

    기상청에서는 공공 데이터 포털(https://www.data.go.kr/)을 통해서 많은 유용한 정보들을 제공하고 있습니다.

    여기서 많은 데이터들을 openAPI로써 받아올 수 있는데요.

     

    이번 포스팅에서 이 날씨예보 API를

    1. 파이썬으로 얻어오고,
    2. 간단한 응용 코드도 한 번 만들어보겠습니다.

    (파이썬 코드로 바로 보고싶으신 분은 인증키 부분만 확인하신 후 바로 4를 보시면 됩니다.)

     

    1. 공공데이터포탈에서 초단기예보 접속

    주의) 파일데이터와 openAPI는 다릅니다.

    CSV로 제공되는 파일 데이터가 아닌 XML / JSON으로 제공되는 openAPI를 선택해주세요.

    https://www.data.go.kr/data/15084084/openapi.do

     

    필요한 것은 3가지입니다.

    1. data.go.kr 포탈에 로그인합니다.
    2. 기상청 단기예보 조회 서비스 API에 들어가서 활용신청합니다.
    3. API 데이터 해석을 위해 참고문서를 다운로드합니다.

    3의 참고문서 다운로드는 선택이지만, 활용을 위해서 다운로드를 권해드립니다. 설명이 공공기관에서 작성한 것 치고 상당히 잘 되어있습니다.

     

    2. 인증키 확인하기

    인증키는 왜 쓸까?

    openAPI는 말 그대로 열려있는 API기 때문에 나쁜 사람들로부터 보호하기 위해(무제한 접속 요청을 걸어서 서버를 다운시키거나 하는 등의 공격에 대한 최소한의 대비) 인증키를 받습니다.

    인증키는 공공데이터포털에서 회원가입하신 후, 원하는 서비스에서 활용신청을 하시면 발급받을 수 있습니다.

    여기서는 1에서의 기상청 단기예보 조회 서비스에 활용신청하시면 됩니다.

    인증키 확인

     

    위 그림에서 가려놓은 인증키를 잠시 후 openAPI 접근 때 사용합니다.

     

    3. openAPI에 일단 접속해보기

    1에서 참고문서를 확인해보면 apis.data.go.kr에 접속하는 요청 예제를 확인할 수 있습니다.

    openAPI 활용 가이드

    위 요청메시지에서 각 항목의 뜻은 아래 표에서 확인할 수 있습니다.

     

    API 요청 항목

    참고 1)

    pageNo는 뭔지 헷갈릴 수 있습니다.

    예를 들면, 지금 요청하는 API 사이트에서 생성하는 데이터 수는 60개입니다.

    낙뢰여부, 강수량, 기온 등 10가지 항목을 1시간마다 6시간어치씩 생성하여 6*10 = 60개를 생성합니다.

    여기서 만일 numOfRows=10, pageNo=1이면 API 사이트에서 생성하는 60개 기준 첫 10개를 return하여 보여주고

    numOfRows=20, pageNo=2이면 API 사이트에서 생성하는 60개 기준 21~40번째 데이터를 보여주게 됩니다.

     

    편하게 생각하면 이 API는 데이터를 불러올 때  numOfRows=60, pageNo=1을 하면 요청에 대한 전체 데이터를 한 번에 얻을 수 있습니다.

     

    참고 2)

    nx와 ny는 경도/위도와는 다른 개념으로 1의 참고문서의 엑셀파일에서 우리나라 행정구역별 nx, ny값을 확인하실 수 있습니다.

     

    위 요청 메시지의 "serviceKey=인증키" 부분을 2에서의 인증키로 바꿔넣은 다음, 이 url을 인터넷 창에 집어넣고 접속하면 아래와 같은 텍스트가 나타납니다.

    !한 가지 더!

    url 마지막에 &dataType=JSON을 넣어주세요.

    이렇게 데이터가 나타나는데, 이걸 이제 파이썬으로 불러와서 가공해보겠습니다.

     

    4. 파이썬으로 불러와서 강수량 데이터 추출하기

    from urllib.request import urlopen
    import json
    url = "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst" + \
        "?serviceKey=???" + \
        "&numOfRows=60&pageNo=1" + \
        "&base_date=20200000&base_time=0030&nx=61&ny=125&dataType=JSON"
    # TODO:
    # serviceKey는 data.go.kr에서 확인
    # base_date는 현재 시각 기준 3일까지만 제공됨에 유의(오늘이 8월 10일이면 8월 8, 9, 10일)
    # base_time은 30분에 리뉴얼돼서 0030~2330으로
    answer = urlopen(url).read()
    data = json.loads(answer)
    rain = dict()
    for item in data["response"]["body"]["items"]["item"]:
        if item["category"] == "RN1":
            rain[item["fcstTime"]] = item["fcstValue"]
    for k, v in rain.items():
        print("{}시에 예상 강수량 {}".format(k, v))

    아래 표는 위 코드에 대한 설명입니다.

    코드 설명

    참고로 data로 표현된 응답 데이터 dictionary는 데이터 뿐만 아니라 요청 형태, 응답 타입 등에 대한 데이터도 포함되어있기 때문에 dictionary상 꽤 구석에 들어있습니다.

     

    위 코드의 실행결과는 아래와 같습니다.

     

    본 포스팅의 기상청 날씨예보(단기예보) 활용 과정에 대한 설명은 아래 유튜브에서도 확인하실 수 있습니다.

    https://www.youtube.com/watch?v=HoXWa3rsmxE 

     

    댓글

Designed by Tistory.