Python 언어를 이용하여 공공데이터포털에서 제공하는 오픈API를 이용한 테스트를 해보겠습니다.
공공데이터포털에서 제공하는 API를 사용하는 방법들은 아래 블로그를 참고하면 되겠습니다.
ㅇ 공공데이터포털 오픈API 활용 : 관광지정보-소개정보서비스
관광지정보-소개정보서비스 API에서 제공하는 기능은 아래와 같이 6가지가 있었습니다.
- getTourSpotCategory : 관광지 분류 목록 조회
- getTourSpotList : 관광지 분류별 관광지 목록 조회
- getTourSpotInfo : 소개정보 조회
- getTourSpotLocation : 교통/약도 정보 조회
- getTourSpotRelate : 주변 정보 데이터 선택 처리
- getTourSpotGallery : 갤러리 조회
위 API를 호출하는 URI는 사전에 정리하였고 Python 으로 REST API를 호출하는 코드를 작성하고 URI를 변경하면서 제공하는 기능을 테스트 할 수 있겠습니다.
테스트 기본 코드
Python으로 REST API를 요청하는 기본 코드는 아래와 같습니다.
urllib 라이브러리를 사용하였습니다.
import urllib import json from pprint import pprint ServiceKey = "서비스 Key" url = "REST API 호출 주소" request = urllib.request.Request(url) response = urllib.request.urlopen(request) rescode = response.getcode() if(rescode==200): response_body = response.read() print(response_body.decode('utf-8')) dict = json.loads(response_body.decode('utf-8')) pprint(dict) else: print("Error Code:" + rescode)
위 기본 코드를 간단하게 설명을 하면 아래와 같습니다.
ServiceKey = "서비스 Key" url = "REST API 호출 주소"
URI를 만들기 위해 사용할 ServiceKey와 url 변수를 선언합니다.
ServiceKey는 공공데이터포털 사이트에서 발급받은 키를 넣으면 되고 url은 제공하는 기능별로 호출 주소가 다르기 때문에 API 가이드를 확인하고 url를 정의하면 됩니다.
url의 경우 사전에 정리를 해두었기 때문에 ‘공공데이터포털 오픈API 활용 : 관광지정보-소개정보서비스‘ 를 참고하면 되겠습니다.
import urllib request = urllib.request.Request(url) response = urllib.request.urlopen(request) rescode = response.getcode() if(rescode==200): response_body = response.read() print(response_body.decode('utf-8')) else: print("Error Code:" + rescode)
urllib 라이브러리를 사용하기 위하여 urllib를 import 합니다.
HTTP Request 메시지를 만들고 urllib.request.urlopen() 함수를 이용하여 API를 호출합니다.
API를 호출하면 response 메시지가 응답되고 그중에 HTTP 응답 코드를 rescode에 넣어두게 코딩하였습니다.
이유는 HTTP 호출이 성공(응답코드 = 200)일 경우 응답 데이터를 가져와서 활용하기 위함입니다.
if문을 이용하여 응답코드가 ‘200’일 경우 response.read() 함수를 이용하여 응답한 데이터를 읽어와서 출력을 합니다.
만약 응답 코드가 200이 아닐 경우는 request의 응답이 비정상일 것이고 해당하는 응답코드를 출력하게 됩니다.
이 응답 코드를 확인하여 문제의 원인을 확인할 수 있겠습니다.
import json from pprint import pprint dict = json.loads(response_body.decode('utf-8')) pprint(dict)
API 호출과는 직접적인 연관은 없으나 제공되는 Json 형식의 데이터를 dictionary 형태로 변환하고 좀 더 보기 편하게 하기 위하여 pprint() 함수를 사용할 수 있습니다.
위 코드에 print()와 pprint() 함수를 이용하여 출력하는 구문이 있기 때문에 차이점을 확인할 수 있을 것입니다.
이제 위 코드를 이용하여 공공데이터포털에서 제공하는 API들을 요청해보고 데이터를 확인해 보겠습니다.
참고로 위 기본 코드에서 url 변수만 변경하면서 테스트를 수행하면 되겠습니다.
관광지정보-소개정보서비스 API 호출 테스트
(1) getTourSpotCategory : 관광지 분류 목록 조회
url = "http://openapi.jejutour.go.kr:8080/openapi/service/TourSpotInfoService/getTourSpotCategory?serviceKey=" + ServiceKey + "&numOfRows=100 &_type=json"
관광지 분류 목록을 조회하는 API입니다.
API 요청시의 url 중에 numOfRows라는 파라메터가 있는데 이 파라메터는 요청할 Row 수를 지정하는 파라메터입니다.
numOfRows를 지정하지 않으면 Default로 10개의 Row만 응답을 주게 됩니다. NumOfRows를 적당히 설정하고 호출해 보면 다양한 정보들을 확인 할 수 있겠습니다.
{"response":{"header":{"resultCode":"0000","resultMsg":"OK"},"body":{"items":{"item":[{"caId":"FD","caName":"맛집"},{"caId":"FD01","caName":"향토음식"},{"caId":"FD02","caName":"한식"},{"caId":"FD03","caName":"양식"},{"caId":"FD04","caName":"일식"},{"caId":"FD05","caName":"중식"},{"caId":"FD06","caName":"뷔페"},{"caId":"FD07","caName":"아시아\/기타"},{"caId":"FD08","caName":"카페"},{"caId":"FD09","caName":"채식·할랄"},{"caId":"LD","caName":"숙박"},{"caId":"LD01","caName":"호텔"},{"caId":"LD02","caName":"리조트\/콘도"},{"caId":"LD03","caName":"휴양펜션"},{"caId":"LD04","caName":"모텔\/여관"},{"caId":"LD05","caName":"펜션\/민박"},{"caId":"LD06","caName":"게스트하우스"},{"caId":"SP","caName":"쇼핑"},{"caId":"SP01","caName":"관광특산품점"},{"caId":"SP02","caName":"면세점"},{"caId":"SP03","caName":"재래시장"},{"caId":"SP04","caName":"오일시장"},{"caId":"SP05","caName":"기타샵"},{"caId":"TU","caName":"관광지"},{"caId":"TU01","caName":"산"},{"caId":"TU02","caName":"오름"},{"caId":"TU03","caName":"해수욕장"},{"caId":"TU04","caName":"섬속의섬"},{"caId":"TU05","caName":"동굴"},{"caId":"TU06","caName":"폭포\/계곡"},{"caId":"TU07","caName":"휴양림\/수목원"},{"caId":"TU08","caName":"자연절경"},{"caId":"TU09","caName":"유적지\/사적지"},{"caId":"TU11","caName":"테마공원\/공연장"},{"caId":"TU12","caName":"박물관\/전시관"},{"caId":"TU13","caName":"미술관\/도서관"},{"caId":"TU14","caName":"캠핑장"},{"caId":"TU15","caName":"온천\/찜질방"},{"caId":"TU16","caName":"골프"},{"caId":"TU17","caName":"수렵\/활쏘기"},{"caId":"TU18","caName":"ATV\/카트"},{"caId":"TU19","caName":"승마"},{"caId":"TU20","caName":"해양스포츠"},{"caId":"TU21","caName":"패러글라이딩\/기타"},{"caId":"TU22","caName":"체육시설"},{"caId":"TU23","caName":"회의시설"}]},"numOfRows":100,"pageNo":1,"totalCount":46}}}
(2) getTourSpotList : 관광지 분류별 관광지 목록 조회
url = "http://openapi.jejutour.go.kr:8080/openapi/service/TourSpotInfoService/getTourSpotList?serviceKey=" + ServiceKey + "&CAT=TU02&numOfRows=100&_type=json"
관광지 분류별 관광지 목록을 조회하는 API입니다.
이 API를 사용하기 위해서는 관광지 분류를 파라메터에 필수로 입력하여 요청해야 합니다.
이 파라메터명은 CAT으로 (1)관광지 분류 목록 조회 후, 확인한 정보를 활용하여야 합니다.
여기에서는 ‘TU02’ 값을 활용하여 오름 관광지 목록을 요청해 보겠습니다.
{"response":{"header":{"resultCode":"0000","resultMsg":"OK"},"body":{"items":{"item":[{"tmName":"가마오름","tmSeq":405},{"tmName":"가메창 (암메)","tmSeq":622},{"tmName":"가문이오름(감은이오름)","tmSeq":525},{"tmName":"가새기오름","tmSeq":492},{"tmName":"가세오름","tmSeq":382},{"tmName":"가시오름 (가스름, 加時岳)","tmSeq":406},{"tmName":"각시바우오름","tmSeq":348},{"tmName":"갈마못(갈뫼못)","tmSeq":623},{"tmName":"감낭오름","tmSeq":300},{"tmName":"감은이오름","tmSeq":526}]},"numOfRows":10,"pageNo":1,"totalCount":322}}}
(3) getTourSpotInfo : 소개정보 조회
url = "http://openapi.jejutour.go.kr:8080/openapi/service/TourSpotInfoService/getTourSpotInfo?serviceKey=" + ServiceKey + "&SEQ=310&numOfRows=100&_type=json"
관광지의 상세정보(관광지명, 관광지소개 등)를 조회하는 API입니다.
이 API를 사용하기 위해서는 위에서 조회한 관광지 목록의 관광지 코드(smSeq) 값을 SEQ라는 파라메터에 필수로 입력하여 요청해야 합니다.
{"response":{"header":{"resultCode":"0000","resultMsg":"OK"},"body":{"item":{"tmDescript":"유네스코 세계자연유산인 거문오름은 돌과 흙이 유난히 검은색으로 음산한 기운을 띠는 데에서 유래되었고, 어원적으로는 신령스러운 산이란 뜻을 가지고 있다. \n2009년 환경부 선정 생태관광 20선, 2010년 환경부․문화체육관광부 선정 한국형 생태관광 10대 모델에 뽑힌 대표적인 생태관광지이다.\n\n《 이용안내 》\n탐방출발 시간 : 09:00 ~ 13:00\n\n탐방인원\n• 1일 400명 (평일, 휴일 구분 없음. 단, 화요일은 휴식의 날 운영)※ 1월1일, 설날과 그 다음날(2일간), 추석(1일)은 휴식일로 탐방 불가※ 기상악화시 전면 통제\n\n탐방예약\n• 전화예약 및 인터넷 예약 1일전 오후 5시까지 사전 예약\n\n문의\n• 064)710-8981\n\n탐방시 주의사항\n• 사전예약자는 탐방안내소에서 출입증을 받고 해설사 안내에 따라 탐방한다.\n• 무단으로 출입하거나, 출입증 없이 탐방시에는 퇴장조치 및 문화재보호법에 따라 처벌된다.\n• 앞트임샌들(등산용샌들) 착용시에는 탐방이 금지된다.\n• 양산, 우산, 스틱, 아이젠 사용은 거문오름 훼손방지를 위해 금지된다.\n• 음식물 반입은 금지된다.\n\n","tmName":"거문오름(UNESCO 세계자연유산)"}}}}
(4) getTourSpotLocation : 교통/약도 정보 조회
url = "http://openapi.jejutour.go.kr:8080/openapi/service/TourSpotInfoService/getTourSpotLocation?serviceKey=" + ServiceKey + "&SEQ=310&numOfRows=100&_type=json"
이 API는 파라메터에 입력한 관광지에 대한 교통/약도(교통정보, 약도이미지 등)를 조회하는 API입니다.
{"response":{"header":{"resultCode":"0000","resultMsg":"OK"},"body":{"items":{"item":{"tmDirection":"제주특별자치도 제주시 조천읍 선교로 569-36(선흘리 478)","tmMapimage":"http:\/\/www.jejutour.go.kr\/apps\/data\/tour\/e4be4cdbd29ffe0878cf4663cb71fcb4.jpg","tmName":"거문오름(UNESCO 세계자연유산)"}},"numOfRows":100,"pageNo":1,"totalCount":1}}}
(5) getTourSpotRelate : 주변 정보 데이터 선택 처리
url = "http://openapi.jejutour.go.kr:8080/openapi/service/TourSpotInfoService/getTourSpotRelate?serviceKey=" + ServiceKey + "&SEQ=310&numOfRows=100&_type=json"
이 API는 파라메터에 입력한 관광지 주변에 관광지들을 조회하는 API입니다.
주변 관광지의 관광지 번호, 관광지명, 좌표 등을 제공합니다.
{"response":{"header":{"resultCode":"0000","resultMsg":"OK"},"body":{"items":{"item":[{"mpX":126.71762085,"mpY":33.4440193176,"tmName":"부소악 (부소오름)","tmSeq":702},{"mpX":126.710501611,"mpY":33.4561612277,"tmName":"나무 카페","tmSeq":24},{"mpX":126.709949,"mpY":33.44633,"tmName":"부대악","tmSeq":327},{"mpX":126.7029764,"mpY":33.4591928,"tmName":"거문오름식품","tmSeq":1167},{"mpX":126.694244,"mpY":33.44837,"tmName":"민오름(조천읍)","tmSeq":325},{"mpX":126.714439,"mpY":33.478278,"tmName":"웃밤(웃바매기,웃밤오름,上栗岳)","tmSeq":481},{"mpX":126.7061921,"mpY":33.4727191,"tmName":"나뛰르독채펜션","tmSeq":1363},{"mpX":126.700664,"mpY":33.467833,"tmName":"우진제비 (우전제비, 牛鎭山)","tmSeq":624},{"mpX":126.684771,"mpY":33.451572,"tmName":"대천이오름 (大川岳)","tmSeq":430},{"mpX":126.702876,"mpY":33.430339,"tmName":"까끄래기","tmSeq":329}]},"numOfRows":10,"pageNo":1,"totalCount":1283}}}
(6) getTourSpotGallery : 갤러리 조회
url = "http://openapi.jejutour.go.kr:8080/openapi/service/TourSpotInfoService/getTourSpotGallery?serviceKey=" + ServiceKey + "&SEQ=310&numOfRows=100&_type=json"
이 API는 파라메터에 입력한 관광지의 이미지 등을 조회하는 API입니다.
위에 테스트한 관광지 코드(310)는 제공되는 이미지가 없는지 응답한 데이터가 없는 것 같습니다.
마치며
위 코드를 이용하여 공공데이터포털에서 제공하는 관광지 기본 정보를 제공받을 수 있었습니다.
관광지 목록과 기본적인 정보를 Json 형식의 데이터로 제공받아 Json 데이터를 파싱하여 필요한 정보를 추출하여 사용할 수 있겠습니다.