프로그래밍 정보공유

공공데이터포털 Open API 사용하기 下 - 코드 예시

student513 2019. 12. 28. 13:30

이전 시간에서 숙지한 명세서 읽는 법을 통해 

 

파이썬으로 API를 출력하도록 해본다.

 

오늘의 목표는

 

노선 번호로 검색하여 / 그 노선의 버스가 경유하는 정류소 목록 뽑기 이다.

 

왜 슬러시로 두 부분으로 나눴을까?

 

'노선 번호로 검색하여'와 '그 노선의 버스가 경유하는 정류소 목록 뽑기'

 

총 두 개의 API를 사용할 것이기 때문이다. 

 

하나의 API가 모든 정보를 전부 제공해준다면 정말 편리하겠지만

 

보통 공공데이터포털의 API간에 관계가 서로 의존적이기 때문에 

 

어떤 API에서 얻은 값이 다른 API의 입력값으로 요구되는 경우가 많다.

 

후자인 그 노선의 버스가 경유하는 정류소 목록 뽑기의 파라미터부터 확인하자

 

인증키는 본인만 알고 있어야 한다.

아무래도 우리가 필요로 하는 정보는 노선정보조회 서비스라는 API에서 찾을 수 있는 것 같다.

 

실행을 눌러보니 필요로 하는 파라미터는 busRouteId이다.

 

busRouteId라는 녀석을 입력해준다면 노선별 경유 정류소 목록을 뱉어준다는 것이다.

 

busRouteId라는 변수는 아무래도 정류소ID를 뜻하나보다.

 

그럼 이 busRouteId를 어디서 찾을 수 있을까?

 

바로 busRouteId를 뱉어내는 API에서 찾을 수 있을 것이다.

 

바로 우리의 첫 번째 목표인 '노선 번호로 검색하여'를 해결할 시간이다.

 

이전 글에서 사용한 정류소 명칭 검색 API를 활용하자.

import datetime
import urllib.request

def get_request_url(url):
    req = urllib.request.Request(url)
    try: 
        response = urllib.request.urlopen(req)
        if response.getcode() == 200:
            print ("[%s] Url Request Success" % datetime.datetime.now())
            return response.read().decode('utf-8')
    except Exception as e:
        print(e)
        print("[%s] Error for URL : %s" % (datetime.datetime.now(), url))
        return None
	# 사용할 API의 Call back URL
   	end_point = "http://ws.bus.go.kr/api/rest/busRouteInfo/getBusRouteList"
    
	# 해당 API가 필요로 하는 파라미터 : 인증키와 검색어
	parameters = "?ServiceKey=" + "내 인증키 넣는 자리"
	end_point = end_point + parameters + "&strSrch=" + "110" # 110번 버스를 검색하고 싶다
	retData = get_request_url(end_point)
    
	print(retData)

<출력 결과>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceResult>
	<comMsgHeader/>
    	<msgHeader>
        	<headerCd>0</headerCd>
        	<headerMsg>정상적으로 처리되었습니다.</headerMsg>
        	<itemCount>0</itemCount>
        </msgHeader>
        <msgBody>
        	<itemList>
            	<busRouteId>100100016</busRouteId>
                <busRouteNm>110A고려대</busRouteNm>
                <corpNm>대진여객  02-916-3312</corpNm>
                <edStationNm>정릉</edStationNm>
                <firstBusTm>20191228040000</firstBusTm>
                <firstLowTm>              </firstLowTm>
                <lastBusTm>20191228224000</lastBusTm>
                <lastBusYn> </lastBusYn>
                <lastLowTm>20150717224000</lastLowTm>
                <length>36.9</length>
                <routeType>3</routeType>
                <stStationNm>정릉</stStationNm>
                <term>8</term>
                </itemList>
                

만약 성공한다면 이와 같은 출력결과를 확인할 수 있을 것이다. 

 

이중에 busRouteId가 보인다.

 

API에서 중요한 것이 데이터 파싱(parsing)이라는 과정인데,

 

분명 여러분은 저 모든 변수에 대한 정보가 필요하지는 않을 것이다. 

 

busRouteId만 한 번 뽑아내보자

 

XML 데이터 형식을 Dict형식으로 변환하는게 파이썬 사용자로서는 데이터 관리가 용이할 것이기 때문에

 

우선 dict형으로 데이터를 변환해보겠다.

 

	
    import xmltodict
    import json
    
    # retData는 위에서 API로 받아온 XML데이터
    retData = get_request_url(url)
    
    # data라는 dict형에 retData를 복사해줌
    asd = xmltodict.parse(retData)
    json_type = json.dumps(asd)
    data = json.loads(json_type)
    
    for i in range(len(data['ServiceResult']['msgBody']['itemList'])):
    	dictData_1 = data['ServiceResult']['msgBody']['itemList'][i]['busRouteId']

요런 식으로 dictData_1이라는 dict형에 busRouteId만 쏙 뽑아다 저장하였다.

 

 

이제 이 busRouteId를 getStationsByRouteList에 고대로 넘겨주면 되겠다.

 

def function(busRouteId):
    end_point = "http://ws.bus.go.kr/api/rest/busRouteInfo/getStaionByRoute"
    
    parameters = "?ServiceKey=" + "내 인증키"
    parameters += "&busRouteId=" + str(busRouteId)
    url = end_point + parameters
    
    retData = get_request_url(url)
    
    asd = xmltodict.parse(retData)
    json_type = json.dumps(asd)
    data = json.loads(json_type)
    
    return data

대애충 요런식의 function을 짜준다면

 

반환되는 data에는 특정 버스 노선이 경유하는 정류소 목록을 뽑을 수 있을 것이다.

 

여기까지 공공데이터포털의 Open API 사용방법에 대하여 알아보았다.

 

궁금한 점은 댓글로 물어봐주신다면 감사하겠다.