[API 활용법] 기상청, 공공 데이터 포털

Lightman·2021년 11월 8일
3

REAL GAME ♟️

목록 보기
1/2
post-thumbnail

기상청 API로 데이터 불러오기

기상청 API는 다른 API와 마찬가지로 Sample Code를 있는 그대로 실행하면 오류가 난다. 기상청 API를 사용하는 절차와 수정된 코드를 알아보자.

기상청 API 사용절차

① 데이터 신청하기

오늘 사용할 데이터는 기상청_지상(종관, ASOS) 시간자료 조회서비스로 특정 기간 동안 매 시간의 날씨를 불러올 수 있는 데이터의 API이다.

그림으로 살펴보기

  • 데이터를 검색하자.
  • 활용신청을 하자.
  • 그럼 마이페이지에 다음과 같은 화면이 생긴다.
  • API를 사용하기 위해 인증키 발급현황에서 인증키를 확인하자.
  • 다시 기상청_지상(종관, ASOS) 시간자료 조회서비스로 돌아가 상세설명으로 들어가자.

② API 사용법 확인하기

상세설명 페이지의 상세기능 탭 에서 간략한 API 사용법을 확인할 수 있다.

그림으로 살펴보기

  • 목록 : 원하는 데이터 종류를 선택하자. 여기서는 하나 뿐이다.
  • 바로 아래에 요청주소가 있다. 이 urlrequest를 날려야한다!
  • 요청변수: 이때 requesturl과 함께 전달될 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을 전달하는 방법을 선택하자.
  • 보통 Encoding으로 인한 오류이므로 params를 적절하게 Encoding 해주어야 한다.
  • 무엇보다 요청변수에 있는 대소문자를 확인하자. 종종 오타가 있는 Sample을 주기도 한다.
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

끝.

profile
현직 데이터 분석가 / 데이터 과학의 정도를 따라 🚲 / About DEV DA ML

1개의 댓글

comment-user-thumbnail
2021년 11월 18일

후레렐

답글 달기