Python 3에서 공공데이터포털(https://data.go.kr/)의 기상청 위성영상 조회 서비스(https://data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15058167)와 기상청 레이더 관측 자료 조회 서비스(https://data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15057166)에 접근하는 샘플 코드이다. 각 API 문서에 나와 있는 Python 3 샘플 코드는 urllib을 사용하도록 구현되어 있어서 requests로 구현했다.
기상청 위성영상 조회 서비스 API 샘플
import requests from datetime import datetime import xml.etree.ElementTree as ET key = '' params = { 'ServiceKey': key, 'pageNo': '1', 'numOfRows': '10', 'dataType': 'XML', 'sat': 'G2', 'data': 'ir105', #적외영상(ir105) 가시영상(vi006) 수증기영상(wv069) 단파적외영상(sw038) RGB 컬러(rgbt) RGB 주야간합성(rgbdn) 'area': 'ko', 'time': datetime.now().strftime("%Y%m%d") } def download(url, filename='result.png'): r = requests.get(url) with open(filename, 'wb') as f: f.write(r.content) def parse_xml(xml): return [dict([(j.tag, (j.text or list(filter(lambda l: l, [k.text for k in j.iter()])))) for j in i]) for i in ET.fromstring(xml)] r = requests.get('http://apis.data.go.kr/1360000/SatlitImgInfoService/getInsightSatlit', params=params) result = parse_xml(r.text) #가장 최근 이미지의 URL을 받아옴 url = result[1]['items'][-1] #가장 최근 이미지 다운로드 download(url)
레이더 관측 자료 조회 서비스 API 샘플
import requests from datetime import datetime import xml.etree.ElementTree as ET key = '' params = { 'ServiceKey': key, 'pageNo': '1', 'numOfRows': '10', 'dataType': 'XML', 'data': 'CMP_WRC', 'time': datetime.now().strftime("%Y%m%d") } def download(url, filename='result.png'): r = requests.get(url) with open(filename, 'wb') as f: f.write(r.content) def parse_xml(xml): return [dict([(j.tag, (j.text or list(filter(lambda l: l, [k.text for k in j.iter()])))) for j in i]) for i in ET.fromstring(xml)] r = requests.get('http://apis.data.go.kr/1360000/RadarImgInfoService/getCmpImg', params=params) result = parse_xml(r.text) #가장 최근 이미지의 URL을 받아옴 url = result[1]['items'][-1] #가장 최근 이미지 다운로드 download(url)
각 코드에 API key를 넣고 돌리면 아래와 같은 이미지가 다운로드된다.
두 API 모두 JSON 구현에 문제가 있는데, JSON으로 API 데이터를 요청하면 결과값이 정상적인 JSON 배열이 아니라 string으로 만들어진 JSON 데이터로 반환된다. 때문에 비록 Python에서는 XML에 비해 JSON 데이터를 다루는 것이 더 편리하지만 XML 요청으로 구현했다.