ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 공공데이터(json) 끌어다 쓰기
    C# 예제 공부일기 2020. 7. 29. 20:35

    data.go.kr

     

    공공데이터 포털

    국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제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}}}

     

     

    http://json.parser.online.fr/

     

    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"])
    
    
    

Designed by Tistory.