본문으로 바로가기
반응형

공공 데이터 활용

 

공공데이터 신청하기

 

 공공데이터 포털은 공공기관이 생성 또는 취득하여 관리하고 있는 공공데이터를 한 곳에서 제공하는 통합 창구이다. 파일데이터, 오픈API, 시각화 등 다양한 방식으로 제공하고 있으며, 누구라도 쉽고 편리한 검색을 통해 원하는 공공데이터를 빠르고 정확하게 찾을 수 있다.

 

공공데이터 포털을 활용하여 온습도 센서 없이 날씨를 확인할 수 있는 방법에 대해서 알아보도록 하자.

 첫째, 인터넷 익스플로러 11버전에만 정상작동하기때문에 익스플로러로만 사용해야한다. 라즈베리파이가 아닌 데스크탑이나 노트북으로 진행해야한다.

 둘째, 사용할 공공데이터를 신청하고 승인받는다. 

 셋째, JSON 데이터 타입을 이해해야한다. JSON은 Int, String, Object, Array 4가지 데이터 타입으로 이루어져있다.

 넷째, 파이썬을 이용하여 JSON 데이터를 공공데이터로부터 받아올 수 있는지에 대한 코드 이해가 필요하다.

 

 

우선 인터넷 익스플로러를 이용하여 공공데이터 포털에 접속한 후, 회원가입을 진행한다.

www.data.go.kr/

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

회원가입을 완료했다면 '동네예보정보조회서비스' 를 검색한다.

 

밑으로 내려서 오픈API 탭이 있을 것이다. 클릭하고 정확히 검색어와 일치하는 API를 찾는다.

오른쪽의 활용신청을 클릭

 

활용목적을 작성하고 이미지처럼 작성하고 라이선스에 동의하고 활용신청을 클릭

 

저작자 표시 동의는 필수이다

 

 

 

 

활용신청을하면 자동으로 새 창이 열리면서. 자동으로 승인되어있는 것을 확인할 수 있다. 클릭해서 열어보자.

 

클릭하자마자 뜨는 창에 서비스 정보에 일반 인증키가 있을 것이다. 복사해두자.

 

스크롤을 조금 내려서 활용신청 상세기능정보의 초단기실황조회 미리보기에 확인을 클릭

 

 

확인버튼을 누르면 바로 밑에 요청변수 창이 새로 뜰 것이다. 서비스키에는 방금 복사해둔 일반 키를 붙여넣기해주고, 값을 채워넣어준다.

표를 작성하고 미리보기를 클릭

ServiceKey : 서비스 정보에서 받은 일반 인증키

base_data : 발표 일자(최근 24시간 데이터만 제공된다.)

base_time : 발표 시각(02, 05, 08, 11, 14, 17, 20, 23시에 발표)

nx : 예보지점 x좌표값(같이 제공되는 엑셀에서 확인 가능.)

ny : 예보지점 y좌표값(같이 제공되는 엑셀에서 확인 가능.)

numOfRows : 한 페이지 결과 수(높으면 많은 값이 한번에 온다..)

pageNo : 페이지 번호

_type : 받는 값이다. 기본은 xml이나, json이 조금 더 편해서 json으로 받는다.

 

nx, ny는 동네예보 지점 좌표(위도,경도)로써, 아래 링크에서 엑셀파일을 다운받아서 본인 동네의 좌표를 찾아볼 수 있다.

https://data.kma.go.kr/community/board/detailBoard.do?bbrdTypeNo=4&pgmNo=59&bbrdNo=7525

 

기상자료개방포털[소통과참여:자유게시판]

자유게시판은 사용자 여러분께서 서로 다양한 의견을 공유할 수 있는 공간입니다. 만약 기상자료개방포털 이용에 대한 문의 사항이 있으시면, Q&A 게시판에 글을 남겨주시기 바랍니다. 자료값 �

data.kma.go.kr

 

 

 

미리보기 버튼을 클릭하면 새로운 창이뜨면서 아래 이미지와 같은 XML 데이터가 출력된다.

 

표시한 부분을 대략적으로 보자면, 날짜 : 20200729, 사상구 괘법동의 위치인 (nx 96, ny 75)의 온도는 23.8도이다.

 

카테고리의 3글자의 단어가 밑의 표와 같으니 참고하도록 하자.

 

 

 

이번엔 JSON으로 데이터를 얻어보자.

dataType을 XML -> JSON으로 바꿔주고 미리보기버튼을 클릭하면 다운 받을 수 있다.

 

 

 

XML, JSON의 데이터를 얻었으면 비쥬얼스튜디오에 출력되있을 것이다. 아래 사이트에 접속해서 JSON 데이터를 좌측 Input창에 붙여넣어준다.

 

https://jsonparseronline.com/

 

Json Parser Online - Best tool to Beautify JSON online

JSON PARSER ONLINE lets you parse JSON string into a pretty and colorful JSON tree view. It parse JSON String and converts it into a human readable format string.

jsonparseronline.com

 

복잡했던 JSON 코드가 보기좋게 번역되었다


 

 

이제 이 상태로 놔두고, 포털에서 제공해주는 샘플코드를 이용해보자.

 

파이썬을 활용하여 온습도 확인

마이 페이지에서 동네예보정보조회서비스를 클릭해서 상세설명을 클릭

동네예보조회서비스를 클릭

 

방금 봤던 기본 정보, 서비스정보창이 뜰것이다. 기본정보의 상세설명을 클릭

 

상세기능에서 목록에 초단기실황조회를 선택하고 조회를 클릭

 

조회를 클릭한 다음에, 스크롤을 내려서 샘플코드의 Python을 클릭해서 샘플 코드를 얻자.

위 샘플코드에서 데이터를 요청하기 위해 사용 중인 모듈이 urllib2이다. 하지만 requests라는 강력한 모듈이 있기 때문에 잘 사용하지 않는다. 

 

requests는 데이터 전송 시 딕셔너리 형태, urllib는 인코딩하여 바이너리 형태로 전송한다.

그리고 존재하지 않는 페이지 요청시 requests는 에러를 띄우지 않지만 urllib는 에러를 발생시킨다.

 

 

requests문을 활용해서 우리 동네의 날씨를 알아보자

 

VNC를 이용하기위해 PuTTY를 라즈베리파이와 연결하고 디렉터리와 파일을 생성한다.

webapps

   -ch06

     -weather

       -weather_test.py                   

 

 

weather_test.py   파일에 vi편집기를 실행하고 밑의 코드를 작성한다.

from urllib.parse import urlencode, unquote
import requests
import json

url = "http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtNcst"
queryString = "?" + urlencode(
{
  "ServiceKey": unquote("kjlFy8y0eoQPFXlX9w7PcT40tvtkm7tq1OlGDdV%2F7ZFhjgVA3dCZqhbfR0znksHKzQ5fBH9ZnoQuWMflcBPWoQ%3D%3D"),
  "base_date": "20200729",
  "base_time": "1000",
  "nx": 96, #사상구 괘법동
  "ny": 75,
  "numOfRows": "10",
  "pageNo": 1,
  "dataType": "JSON"
}
)
queryURL = url + queryString
response = requests.get(queryURL)
print("=== response json data start ===")
print(response.text)
print("=== response json data end ===")
print()

r_dict = json.loads(response.text)
r_response = r_dict.get("response")
r_body = r_response.get("body")
r_items = r_body.get("items")
r_item = r_items.get("item")

result = {}
for item in r_item:
        if(item.get("category") == "T1H"):
                result = item
                break
for item in r_item:
        if(item.get("category") == "RN1"):
                result2 = item
                break

print("=== response dictionary(python object) data start ===")
print(result.get("baseTime")[:-2] +" temp : " + result.get("obsrValue") + "C")
print(result2.get("baseTime")[:-2] +" rain : " + result2.get("obsrValue") + "mm")
print("=== response dictionary(python object) data end ===")
print()

 여기서 for문의 카테고리에 주목할 필요가 있다. 3글자 단어들은 위에서 봤다시피 아래의 표에 따라서 result값이 item에 저장된다.  

 for문을 하나 더 늘리면, 밑에 print를 하나 더 추가해서 필요한 정보를 하나 더 출력할 수 있다.

python weather_test.py 실행화면

 

반응형