반응형

이번 글은 버스 관련 앱 서비스를 만드는 프로젝트에서 파이썬을 통해 RESTful API 정보를 가져오는 방법에 대하여 포스팅하고자 합니다. 모두의 버스 : UNIBUS라는 이름은 서비스할 앱 이름입니다.

현재까지 기획한 내용은 앱 실행 시사용자들에게 지도에서 내 주변에서 가까운 정류장들을 보여주고 검색을 통해서 해당 정류장을 통과하는 버스 번호, 도착할 버스 예정 시간도 표시해주는 서비스를 구현하는 것입니다.

 

먼저 파이썬을 실행시키기 전 API 정보가 어떤 식으로 저장되어 있는지에 대해 설명하자면,

↓공공데이터 포털 사이트 주소↓

www.data.go.kr/

 

공공데이터 포털

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

www.data.go.kr

공공데이터 포털사이트에서 검색어로 '버스'를 검색해도 되고 상단 데이터 찾기에서 데이터 목록을 클릭하여도 됩니다.

 

공공데이터 포털의 API의 경우 이용하기 위해서는 로그인 후 활용신청을 할 수 있고 활용신청 후 1~2시간 정도 지나야 API로 정보들을 조회할 수 있습니다.

 

발급받자마자 사용하는 경우 위처럼 에러가 발생한다. 2~3시간정도 지나면 잘 뜨는것을 확인할 수 있다.

 

 

그럼 간단하게 노선정보조회 서비스를 통해 특정 노선이 경유하는 정류소 목록을 출력해보는 방법을 알아봅시다. 

 

 

활용신청을 하였다면 마이페이지에서 노선정보조회 서비스를 클릭합니다.

해당화면에서 일반 인증키를 메모장에 저장해둡니다. 그리고 상세 설명을 클릭합니다.

 

해당화면에서 활용 가이드 docx 문서는 꼭 다운받아두도록 합시다.

문서에는 해당 API 이용 시 서비스 key가 필요하며 서비스 유형은 REST, 데이터 포맷은 XML이라고 나옵니다.

 

 

상세 기능 목록도 나옵니다.  노선별 경유 정류소 목록 조회를 하기 위해 getStationsByRouteList 상세 기능 명세로 이동해줍시다.

 

요청 메시지로 노선 ID를 보내면 응답 메시지로 정류소 이름을 조회할 수 있다고 나와있습니다. 그리고 좀 내리다 보면 아래와 같이 요청 / 응답 메시지 예제가 나옵니다.

http://ws.bus.go.kr/api/rest/busRouteInfo/getRouteInfo?ServiceKey=인증키&busRouteId=100100112

URL 뒷부분에 100100112는 노선 ID(busRouteNm)로 721번 버스입니다.
그리고 아까 메모해두었던 일반 인증키를 위의 URL에서 '인증키'라는 부분을 지우고 대입시켜서 주소창에 복붙 합니다.

 

721번 버스 경유지를 확인해보니 올바른 정보를 조회한 것을 알 수 있습니다.

 

이제 이러한 정보들을 파이썬으로 가져오는 작업을 해보면,

import requests, xmltodict, json
import pandas as pd

key = "일반 인증키" # 일반 인증키 라는 부분을 지우고 대입하시면 됩니다. ex) key = "2@dfg3#dafgrt$"
url = "http://ws.bus.go.kr/api/rest/busRouteInfo/getStaionByRoute?ServiceKey={}&busRouteId=100100112".format(key)

content = requests.get(url).content # GET요청
dict=xmltodict.parse(content) # XML을 dictionary로 파싱
#파싱은 어떤 페이지(문서, html 등)에서 내가 원하는 데이터를 특정 패턴이나 순서로 추출해 가공하는 것

jsonString = json.dumps(dict['ServiceResult']['msgBody']['itemList'], ensure_ascii=False) # dict을 json으로 변환
jsonObj = json.loads(jsonString) # json을 dict으로 변환

for i in range(len(jsonObj)):
    print(jsonObj[i]['stationNm']) # stationNm : 정류소명

721번 버스는 90개의 정류소를 경유하며 파이썬에 모든 정류소 목록이 정상적으로 출력된 것을 확인할 수 있었습니다.

 

 

위의 코드에서

jsonString = json.dumps(dict['ServiceResult']['msgBody']['itemList'], ensure_ascii=False) # dict을 json으로 변환
jsonObj = json.loads(jsonString) # json을 dict으로 변환

for i in range(len(jsonObj)):
    print(jsonObj[i]['stationNm']) # stationNm : 정류소명

 이런 식으로 코딩한 이유는 XML구조가 아래와 같은 구조를 가지기 때문에 dict['ServiceResult']['msgBody']['itemList'] 부분을 json으로 변환하고 다시 json으로 변환했습니다. 그리고 여러 개의 itemList에서 stationNm정보(정류소명)를 추출하여 출력을 합니다.

 

721번 버스가 아닌 다른 버스를 조회하고 싶다면

100100112가 아닌 다른 노선 ID로 조회할 수 있습니다. 이번에는 100100118로 조회를 해보겠습니다.

여기서 알 수 있는 정보는 753번 버스는 선진운수종점에서 첫차가 04:10, 막차가 22:21이고 상도동 방향이며 GPS X, Y 값은 (126.9108067748, 37.6141782523)으로 나옵니다.

 

 

이러한 데이터들을 이용하여 앱에서 정류소명을 입력 시 API를 통해 정류소의 ID, 해당 정류소를 지나는 버스노선 ID, 도착 예정시간, 첫차 막차시간 등등 여러 가지 정보를 알 수 있게 됩니다. 

반응형

+ Recent posts