관리 메뉴

솜씨좋은장씨

[Python]연안 여객터미널 실시간 운항정보 API 활용기 본문

Programming/Python

[Python]연안 여객터미널 실시간 운항정보 API 활용기

솜씨좋은장씨 2019. 9. 13. 19:22
728x90
반응형

1. 활용하게 된 계기

태풍이 오기 직전이었던 2019년 8월 11일 토요일 냉면투어를 위해 백령도로 향했던 필자는 태풍으로 인하여

 

예상치 못한 일에 봉착한 적이 있었습니다.

바로 태풍의 북상으로 인한 먼 바다 풍랑주의보로 인하여 선박 운항을 하지 않는다는!!!!!!

 

청천벽력과 같은 내용의 문자가 날아왔던 것입니다.

 

아니 이럴수가, 1박 2일로 짧게 계획 했던 여행은 그렇게 3박 4일의 긴 여행으로 변하였습니다.

 

여러 선박회사와 연안여객터미널로 연락하여 배가 출항하는지 여부를 확인하던 차에 머리에 스치고 갔던 것이

 

오픈 API였습니다.

 

미세먼지 정보를 알려주는 미세먼지 API처럼 선박 운항 관련 정보를 제공하는 API도 있지 않을까?

 

바로 공공데이터포털에 접속하여 검색하여보니

국제 및 연안 여객 터미널 실시간 운항정보를 XML형식으로 제공하는 API가 있었습니다.

 

연안여객터미널 실시간 운항정보국제여객터미널 실시간 운항정보, 총 2가지의 정보를 제공하는 API였습니다.

 

저는 그 중 인천과 백령도 사이의 선박들의 운항정보를 알고 싶었으므로 

 

연안여객터미널 실시간 운항정보를 활용신청하였습니다.

 

2. 활용 방법

따로 어플리케이션을 만들거나 웹서비스를 개발하지는 않았습니다.

 

Colab 또는 Jupyter notebook에서 python의 requests 라이브러리를 사용하여 API에 데이터를 요청한 후

 

API에서 제공한 xml데이터xmltodict라이브러리를 사용하여 OrderedDict형태로 받아왔으며

 

받아온 데이터를 출력하여 실시간 백령도행 선박의 출항여부를 확인했습니다.

 

xmltodict는 내부모듈이 아닌 설치가 필요한라이브러리 입니다.

 

따라서 설치를 하지 않으면 아래와 같은 오류가 날 수 있습니다.

 



위와 같이 ModuleNotFoundError: No module named 'xmltodict'오류가 난다면

Google Colab일 경우

 ! pip install xmltodict 

Jupyter Notebook일 경우

 $ pip install xmltodict

명령어로 설치를 해주면 됩니다.

 

앞서 설명한 내용의 코드는 다음과 같습니다.

 

만약 이 코드를 활용할 시, 코드에서 인증키 부분은 api인증키로 바꿔두었으니 아래의 링크를 참고하여 개개인의 인증키를 받아 복사/붙여넣기하여 사용하기 바랍니다.

 

인증키 발급 방법은 아래 링크를 참고하기 바랍니다.

 

공공데이터포털 API 사용하기!

1. 공공데이터 포털 홈페이지 접속 공공데이터포털 국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유&bul..

somjang.tistory.com

import requests
import xmltodict

url = "https://opendata.icpa.or.kr/OpenAPI/service/ipaFerryNavigatInfo/getDmstcNvgList?"

api_key = "api인증키"

api_key_decode = requests.utils.unquote(api_key)

parameters = {"ServiceKey":api_key_decode, "numOfROws":10, "pageNo":1}

req = requests.get(url, params = parameters)

xml_data = xmltodict.parse(req.text)

infomations = xml_data['GetDmstcNvgListResponse']['body']['item']['GetDmstcNvgListVO']

for data in infomations:
    if data['alocname'] == "백령도":
        print("기항지명 : {}".format(data['alocname']))
        print("인천항 출발시간 : {}".format(data['starttime']))
        print("기항지 도착시간 : {}".format(data['alocarvltime']))
        print("기항지 출발시간 : {}".format(data['alocstarttime']))
        print("인천항 도착시간 : {}".format(data['arvltime']))
        print("운항정보 : {}".format(data['nvginfoname']))
        print("항로명 : {}".format(data['ruteName']))
        print("선명 : {}".format(data['shipname']))
        print("선사명 : {}".format(data['wtorcmpname']))
        print("")        

위의 코드를 실행하면 결과는 아래와 같이 나오게 됩니다.

기항지명 : 백령도
인천항 출발시간 : 08:30
기항지 도착시간 : 선사문의
기항지 출발시간 : 13:30
인천항 도착시간 : 17:30
운항정보 : 정상운항
항로명 : 백령항로
선명 : 코리아킹호
선사명 : 고려고속훼리(주)

기항지명 : 백령도
인천항 출발시간 : 11:20
기항지 도착시간 : 선사문의
기항지 출발시간 : 16:20
인천항 도착시간 : 20:20
운항정보 : 정상운항
항로명 : 백령항로
선명 : 하모니플라워호
선사명 : (주)에이치해운

기항지명 : 백령도
인천항 출발시간 : 13:00
기항지 도착시간 : 선사문의
기항지 출발시간 : 07:00
인천항 도착시간 : 11:50
운항정보 : 정상운항
항로명 : 백령항로
선명 : 옹진훼미리호
선사명 : 고려고속훼리(주)

 

덕분에 실시간으로 확인하여 다시 뜨는 배중 가장 빠른배를 타고 복귀하였습니다.

 

열심히 공부해서 이런 API를 활용한 서비스 개발도 해보고자합니다.

Comments