-
공공데이터(json) 끌어다 쓰기C# 예제 공부일기 2020. 7. 29. 20:35
공공데이터 포털
국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase
data.go.kr
공공데이터 포털에서 제공하는 동네 예보 조회 서비스를 Json으로 받아서 python으로 처리해봤다.
동네예보 조회 서비스 활용신청 (신청하려면 로그인이 필수다.)
신청에 성공한후 마이페이지를 보면 아래와 같이 일반인증키를 긁어서 복사해놓는다.
그 아래로 내려간다.
서비스키에 공개키를 입력하고 datatype은 JSON 날짜와 시간을 바꿔준뒤 예보지점의 X값과 Y값은
data.kma.go.kr/community/board/detailBoard.do?bbrdTypeNo=4&pgmNo=59&bbrdNo=7525
기상자료개방포털[소통과참여:자유게시판]
자유게시판은 사용자 여러분께서 서로 다양한 의견을 공유할 수 있는 공간입니다. 만약 기상자료개방포털 이용에 대한 문의 사항이 있으시면, Q&A 게시판에 글을 남겨주시기 바랍니다. 자료값 �
data.kma.go.kr
여기서 엑셀파일로 찾아보면 된다. 미리보기를 눌러보자.
위와같은 JSON형식의 데이터들이 나오는데 안예쁘니
{"response":{"header":{"resultCode":"00","resultMsg":"NORMAL_SERVICE"},"body":{"dataType":"JSON","items":{"item":[{"baseDate":"20200729","baseTime":"1800","category":"PTY","nx":99,"ny":75,"obsrValue":"0"},{"baseDate":"20200729","baseTime":"1800","category":"REH","nx":99,"ny":75,"obsrValue":"98"},{"baseDate":"20200729","baseTime":"1800","category":"RN1","nx":99,"ny":75,"obsrValue":"0.5"},{"baseDate":"20200729","baseTime":"1800","category":"T1H","nx":99,"ny":75,"obsrValue":"23.1"},{"baseDate":"20200729","baseTime":"1800","category":"UUU","nx":99,"ny":75,"obsrValue":"0"},{"baseDate":"20200729","baseTime":"1800","category":"VEC","nx":99,"ny":75,"obsrValue":"175"},{"baseDate":"20200729","baseTime":"1800","category":"VVV","nx":99,"ny":75,"obsrValue":"1"},{"baseDate":"20200729","baseTime":"1800","category":"WSD","nx":99,"ny":75,"obsrValue":"1"}]},"pageNo":1,"numOfRows":10,"totalCount":8}}}
Json Parser Online
json.parser.online.fr
여기 들어가서 JSON을 붙여넣기 하면
아름답게 보여준다.
이 JSON을 python코드에서 제어할 예정이다.
# Python 샘플 코드 # from urllib2 import Request, urlopen from urllib import urlencode, quote_plus url = 'http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtNcst' queryParams = '?' + urlencode({ quote_plus('ServiceKey') : '서비스키', quote_plus('ServiceKey') : '-', quote_plus('pageNo') : '1', quote_plus('numOfRows') : '10', quote_plus('dataType') : 'XML', quote_plus('base_date') : '20151201', quote_plus('base_time') : '0600', quote_plus('nx') : '18', quote_plus('ny') : '1' }) request = Request(url + queryParams) request.get_method = lambda: 'GET' response_body = urlopen(request).read() print response_body
해당 사이트에서 제공하는 python코드는 위와 같다.
from urllib.parse import urlencode, unquote import requests import json url = "http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtNcst" queryString = "?" + urlencode( { "ServiceKey" : unquote("공개키"), "base_date" : "20200729", "base_time" : "1500", "nx" : 99, "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) print("=== response dictionary(python object) data start ===") print(r_dict) print("=== response dictionary(python object) 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 print("=== response dictionary(python object) data start ===") print(result.get("baseTime")[:-2] +"시 온도는 " + result.get("obsrValue") + "도 입니다") print(result.get("baseDate")) print(result.get("category")) print(result.get("nx")) print("=== response dictionary(python object) data end ===") print()
JSON을 제공하는 웹서버의 URL과 그 안에 매개변수를 넣고 합쳐서 URL을 통해서 조회하면 JSON이 쭉 출력된다. 여기서 unquote하는 이유는 공개키를 제공해줄때 일반 인증키(UTF-8) 로 제공해주는데 이것은 인코딩된 문자열이다. 이 문자열을 디코딩해주기 위해 unquote를 사용했다. 그리고 그 밑에 requests.get(queryURL)이 있는데 해당 url로 접속해서 정보를 받아온 것을 response에 저장한다. response에는 JSON 데이터가 쭉 있을 것이다. 이 데이터를 r_dict에 저장한다. r_dict에서 response내부의 데이터를 r_response에 저장한다. 또 그내부에서 body내부의 데이터를 r_body에 저장한다. 다시 body 내부의 items데이터를 r_items에 저장하고 마지막으로 items안에 item들을 전부 r_item에 저장한다.
item들 중에서 데이터베이스라고 가정했을 때, 기본키는 category이다. 나머진 똑같다. 이 카테고리중 온도를 나타내는
카테고리는 T1H이다. 이 아이템을 result에 저장하고 하나씩 빼서 출력한다.
배열에 저장된 형태는 딕셔너리같이 저장되어 있어서, baseDate를 내놓으라고하면 20200729를 반환하는 형식이다.
시험
from urllib.parse import urlencode, unquote import requests import json url = "http://apis.data.go.kr/1360000/VilageFcstInfoService/getUltraSrtNcst" queryString = "?" + urlencode( { "ServiceKey" : unquote("jTixihCauC99iJsKIQ6kbyT4BPl0axqixVHGiuAaIiYAuJs272o5T0lZlry9hYEc0kwTNITZlLuRpt7B2pX1yQ%3D%3D"), "base_date" : "20200730", "base_time" : "1700", "nx" : 99, "ny" : 75, "numOfRows" : "10", "pageNo" : 1, "dataType" : "JSON", } ) queryURL = url + queryString response = requests.get(queryURL) 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={} result_status={} for item in r_item: result=item result_status.setdefault(result.get("category"),result.get("obsrValue")) print("부산광역시 해운대구 중동 초단기 동네예보 결과입니다.") print("==== 날짜 : "+result.get("baseDate")[:-4]+"년"+result.get("baseDate")[4:-2]+"월"+result.get("baseDate")[6:]+"월"+"==== 시각 : " + result.get("baseTime")[:-2]+"시") print("강우형태 : "+result_status["PTY"]) print("습도 : "+result_status["REH"]+" %") print("1시간 강수량 : " +result_status["RN1"]+" mm") print("기온 : "+result_status["T1H"] +" ℃") print("동서바람성분 : " +result_status["UUU"]+" m/s") print("남북바람성분 : " + result_status["VVV"]+" m/s") print("풍향 : "+result_status["VEC"]) print("풍속 : "+result_status["WSD"])
'C# 예제 공부일기' 카테고리의 다른 글
RaspberryPi : 파이썬 MariaDB 서버 커넥션 (0) 2020.07.30 RaspberryPi : MariaDB 설치 및 활용 (0) 2020.07.30 소켓 프로그래밍 (네트워크) #2 (0) 2020.07.29 소켓 프로그래밍 (네트워크) #1 (0) 2020.07.29 쿼리의 결과를 새로운 객체 컬렉션으로 저장하는 방법 (0) 2020.07.28