# 부록 A: 기상청 자료 받기

기상청에서는 다양한 기상관측 자료를 홈페이지를 통해서 제공하고 있다. 특히 과거관측자료는 수문 및 관개 분야에서 주 입력자료로 활용된다.

하지만 기상청에서 제공하는 과거일별관측자료는 1년 단위로 1개의 측후소에 대하여, 1개의 관측자료를 테이블 형태로 제공한다. 그래서 지역시스템공학과 및 농공학에 기반을 둔 유사학과에서 연구실 막내가 의례적으로 하는 일 중 하나가 기상청 자료를 받아서 엑셀로 저장하는 일이다. 내가 학교를 다니던 10년이 넘는 시간동안 계속 되어온 풍습이 최근 몇년 동안 바뀌었을 것이라고 생각하진 않는다.

이러한 문제의식에서 기상청 과거일별자료를 좀 더 쉽게 받을 수 있는 서비스를 만들어보면 좋겠다고 생각했고, 관련 내용은 농공학회 56권 6호에 실린 "데이터 로딩 자동화를 위한 RESTful 웹서비스 개발 -일별 기상자료 처리를 중심으로-" 논문을 참고하기 바란다. 비록 4년이나 된 논문이나, 여러분이 처한 사정은 크게 달라지지 않았을 것이므로, 여전히 도움이 될 것이다.

# 간단한 API 사용법

이미 교수님을 통해서 몇번 사용해 보았을 것으로 생각된다. 물론 위에 써놓은 논문은 찾아보지 않았을 것도 잘 안다. 안 읽어도 상관 없으니, 일단 계속 진행해보자.

측후소 119번 (수원)의 2011년부터 2015년까지의 기상 자료를 확인해보자. 브라우저를 열고 아래 주소를 쓰면 된다.

https://api.taegon.kr/station/119/?sy=2011&ey=2015&format=html

자 그러면, 2014년부터 최근 날짜까지 기상자료를 구하려면 어떻게 해야할까?

https://api.taegon.kr/station/119/?sy=2014&ey=2018&format=html

무엇을 바꾸었는지 눈치챘는가? 측후소 번호(119)와 시작연도(sy=2014), 끝연도(ey=2018)만 원하는대로 바꿔주면 된다.

이렇게 보이는 파일은 엑셀에서 웹자원 불러오기 기능을 이용하여 그대로 이용할 수 있다. 하지만 우리는 프로그래밍에서 다루기 쉬운 파일을 배웠다. 바로 CSV 파일이다.

위에서 설명하지 않는 나머지 한 인자 (format=html)대신 format=csv를 써보자. 방금 브라우저에서 본 결과가 파일로 다운받아지는 것을 확인할 수 있을 것이다. 사실 이만큼만 해도 꽤 편리해진 것이 사실이다. 하지만 여기까지 하려고 이런 걸 만든 건 아니다.

# 모든 측후소 최근 5년간 자료 받기

이런식으로 웹 주소를 통해 서비스를 제공하는 형태를 Open API 혹은 RESTful API라고 한다. 보다 정확히 말하자면, 여기서 소개한 서비스는 HTTP API라고 쓰는 게 적확하지만, 보고서나 제안서에 쓰기에는 앞서 기술한 단어가 훨씬 유용하다.

어쨌거나 API라고 하는 것은 프로그램 간에 서로 자료를 주고 받기 위한 약속이라는 의미이다. 즉 사람이 쓰기 편하게 만든 것이 아니라, 프로그램이 쓰기 편하게 만든 약속이라는 것이다. 그래서 우리가 배운 프로그래밍 지식을 활용하면, 모든 측후소의 최근 5년간 자료를 받는데, 코드 수십 줄로 해결할 수 있게 되는 것이다.

각설하고 코드부터 살펴보자.

import requests
import os

def main():
    station_ids = [90, 95]
    output_dir = "../../output/python101/weather/"
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    url = 'https://api.taegon.kr/stations/{}/?sy=2014&ey=2018&format=csv'
    for st_id in station_ids:
        download_url = url.format(st_id)
        r = requests.get(download_url)
        with open(output_dir + "{}.csv".format(st_id), 'wb') as f:
            f.write(r.content)

if __name__ == "__main__":
    main()

이 코드가 전부이다. 예제로 측후소 리스트는 2개만 적어두었는데, 전체 리스트를 만드는 방법은 여러번 설명하였으므로 생략한다. 파일을 쓸 디렉토리를 설정하고, 해당 디렉토리가 없을 때는 만들도록 하였다. 그 다음은 앞서 소개한 API 주소를 지정하고 있다. 모든 인자는 동일하고, 측후소 번호만 바뀌게 되므로, 수정할 곳을 하나만 지정하였다.

for 문에서는 앞서 리스트로 준 측후소를 차례대로 넘겨주면서, download_url이라는 주소를 만들고, 이 주소에 접속하여 자료를 받는다. requests.get() 부분이 웹을 통해서 자료를 받는 부분이고, 받은 자료는 메모리에 올라가 있으므로, 이를 지정한 파일에 저장하기 위하여 f.write()를 실행하고 있다. 이게 전부이다.

여기서, requests 모듈이 깔려있지 않다고 에러가 날 수 있는데, PyCharm에서 파일>설정 (Ctrl+Alt+S)를 들어가서, 왼쪽 항목 중 "Project: .."로 시작하는 항목 바로 아래 "Project Interpreter"를 선택한다. 그러면 설치면 모듈을 확인할 수 있는데, 오른쪽의 "+"버튼을 이용하여 모듈을 설치하면 된다.

Last Updated: 6/15/2022, 10:24:45 AM