개요
요즘 일교차가 심해 기온 그래프를 그려보려고 한다.
날씨 API 중 가장 많이 사용되는 OpenWeatherMap을 쓰려다가, 무료 계정은 단기 예보 API를 사용할 수 없다는 것을 깨닫고 불편함을 감수하며 기상청 API를 사용하기로 했다.
기상청 API는 상당히 불편하게 만들어놨다. 기본 리턴 값이 XML타입에다가, JSON 형식도 개떡같고 호출도 귀찮지만, 무료라서 쓸 이유는 충분하다고 생각한다.
API 요청 날리기
기상청 API는 공공데이터포털을 통해 제공된다. 귀찮지만 회원가입을 하고 API 신청을 해야 인증 토큰을 얻을 수 있다.
그리고 다음 코드로 요청을 날렸는데…….
now = datetime.now(KST)
base_date = now.strftime("%Y%m%d)
response = requests.get(
"https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst",
params={
'serviceKey': API_KEY,
'pageNo': 1,
'numOfRows': 1000,
'dataType': 'JSON',
'base_date': base_date,
'base_time': "0500",
'nx': LAT,
'ny': LNG,
},
)
다음과 같은 응답이 날아왔다.
{"response":{"header":{"resultCode":"01","resultMsg":"APPLICATION_ERROR"}}}
형식을 하라는대로 다 맞춰서 했는데 왜 안될까?
그렇게 몇 시간 동안 삽질한 결과, 기상청 API는 위도/경도를 사용하지 않고 자체적으로 나눈 행정 구역 단위를 쓴다고 한다. ㅋ
그래서 사용 설명서서를 다운받아 행정구역이 포함된 엑셀 파일로 내가 원하는 위치의 x, y 좌표값을 제대로 입력하니 해당 위치의 날씨를 받아올 수 있었다.
{
"response": {
"header": {
"resultCode": "00",
"resultMsg": "NORMAL_SERVICE"
},
"body": {
"dataType": "JSON",
"items": {
"item": [
{
"baseDate": "20240609",
"baseTime": "0500",
"category": "TMP",
"fcstDate": "20240609",
"fcstTime": "0600",
"fcstValue": "17",
"nx": 55,
"ny": 127
}
]
},
"pageNo": 1,
"numOfRows": 1,
"totalCount": 809
}
}
}
보기만 해도 머리가 아픈 구조이지만, 나는 포기하지 않고 데이터들을 정리해서 온도만 뽑아냈다.
그리고 추출한 온도 값만 활용하여 그래프를 그릴 수 있었다.
굳이 콘솔로 그래프를 그린 이유는 멋져보여서다.
내가 배운 것
사용설명서를 읽자.