기상청 API는 다른 API와 마찬가지로 Sample Code를 있는 그대로 실행하면 오류가 난다. 기상청 API를 사용하는 절차와 수정된 코드를 알아보자.
오늘 사용할 데이터는 기상청_지상(종관, ASOS) 시간자료 조회서비스
로 특정 기간 동안 매 시간의 날씨를 불러올 수 있는 데이터의 API이다.
인증키
를 확인하자.기상청_지상(종관, ASOS) 시간자료 조회서비스
로 돌아가 상세설명
으로 들어가자.상세설명
페이지의 상세기능
탭 에서 간략한 API 사용법을 확인할 수 있다.
요청주소
가 있다. 이 url
로 request
를 날려야한다!요청변수
: 이때 request
에 url
과 함께 전달될 parameter
들은 다음과 같다. (필수와 옵션)출력변수
: 그럼 다음과 같은 출력을 줄 것이다. (테이블 후략)# Python 샘플 코드 #
import requests
url = 'http://apis.data.go.kr/1360000/AsosHourlyInfoService/getWthrDataList'
params ={'ServiceKey' : '[서비스키]',
'pageNo' : '1', 'numOfRows' : '10',
'dataType' : 'XML', 'dataCd' : 'ASOS', 'dateCd' : 'HR',
'startDt' : '20100101', 'startHh' : '01',
'endDt' : '20100601', 'endHh' : '01',
'stnIds' : '108' }
response = requests.get(url, params=params)
print(response.content)
위 샘플 코드를 그대로 적용하면 오류가 난다. 공공 데이터 OpenAPI로 제공되는 API는 REST API
인 경우가 많다. 이 경우 단순히 url
을 입력해 해당 위치로 접근하는 방법을 택하고 있는 것으로 보인다. 따라서 진행 중 문제가 생긴다면 url
을 어떻게 생성할지에 착안하면 된다.
요청변수
를 포함하여 내가 원하는 url
의 형태를 결정하자.http://apis.data.go.kr/1360000/AsosHourlyInfoService/getWthrDataList?ServiceKey=[서비스키]&pageNo=1&numOfRows=10&dataType=JSON&dataCd=ASOS&dateCd=HR&startDt=20181229&startHh=01&endDt=20191130&endHh=01&stnIds=108
requests.get
이 작동하지 않는다면 urllib.request.Request
에 직접 url
을 전달하는 방법을 선택하자.params
를 적절하게 Encoding 해주어야 한다.from urllib.request import urlopen
from urllib.parse import urlencode, unquote, quote_plus
import urllib
import requests
import json
import pandas as pd
# Setting for URL parsing
url = 'http://apis.data.go.kr/1360000/AsosHourlyInfoService/getWthrDataList'
enKey = '[서비스키]'
params = f'?{quote_plus("ServiceKey")}={enKey}&' + urlencode({
quote_plus("pageNo"): "1", # 페이지 번호 // default : 1
quote_plus("numOfRows"): "10", # 한 페이지 결과 수 // default : 10
quote_plus("dataType"): "JSON", # 응답자료형식 : XML, JSON
quote_plus("dataCd"): "ASOS",
quote_plus("dateCd"): "HR",
quote_plus("startDt"): "20181229",
quote_plus("startHh"): "01",
quote_plus("endDt"): "20191130",
quote_plus("endHh"): "01",
quote_plus("stnIds"): "108"
})
# URL parsing
req = urllib.request.Request(url + params)
# Get Data from API
response_body = urlopen(req).read() # get bytes data
response_body
# # Convert bytes to json
data = json.loads(response_body)
data
# Result
res = pd.DataFrame(data['response']['body']['items']['item'])
res
후레렐