Vo
#Value Object: 값을 담을 클래스

class BusVo:#버스 노선 정보 담을 클래스
    def __init__(self, busId=None,busNm=None,stStat=None,edStat=None,term=None,firstTm=None,lastTm=None,corpNm=None):
        self.busRouteId=busId
        self.busRouteNm=busNm
        self.stStationNm=stStat
        self.edStationNm=edStat
        self.term=term
        self.firstBusTm=firstTm
        self.lastBusTm=lastTm
        self.corpNm=corpNm

    def __str__(self):
        res = ''
        res += 'bus id: ' + self.busRouteId
        res += '\nbus name: ' + self.busRouteNm
        res += '\nstart station: ' + self.stStationNm
        res += '\nend station: ' + self.edStationNm
        res += '\nterm: ' + self.term
        res += '\nfirst bus time: ' + self.firstBusTm
        res += '\nlast bus time: ' + self.lastBusTm
        res += '\ncorp name: ' + self.corpNm
        return res

class PointVo:
    def __init__(self, no=None, gps_x=None, gps_y=None):
        self.no = no
        self.gps_x = gps_x
        self.gps_y = gps_y

    def __str__(self):
        return 'no: '+self.no+' ('+ self.gps_x + ' , '+ self.gps_y + ')'


class StationVo:
    def __init__(self, seq=None, stat=None, id=None):
        self.seq=seq
        self.stationNm=stat
        self.arsId=id

    def __str__(self):
        return 'seq: '+self.seq+' / station name: '+self.stationNm+ ' / ars id:'+self.arsId

 

 

 

 

SERVICE


getRouteInfoItem(노선ID): 리턴값은 BUS_VO 객체 한개 반환

  1) 노선기본정보항목조회(URL:getRouteInfoItem): 
=> 버스 노선ID를 입력받는다 
=> OPEN API에 URL(getRouteInfoItem)로 요청보냄 
=> 요청 응답(XML: 이 파일은 버스 정보가 담겨있음)을 받으면 파싱을 해서 BUS_VO에 저장할 값들만 추출 
=> 추출한 정보를 BUS_VO에 담는다
=> BUS_VO 리턴


getRoutePathList(노선ID): 경로 묶음. POINT_VO객체들을 리스트에 담아서 반환

   2) 노선경로목록조회(URL:getRoutePathList)
=> 버스 노선ID를 입력받는다 
=> OPEN API에 URL(getRoutePathList)로 요청보냄
=> 요청 응답(XML: 경유하는 정류소의 좌표정보가 담겨있음)을 받으면 파싱을 해서 POINT_VO에 저장할 값들만 추출
=> 추출한 정보를 POINT_VO에 담아서 리스트에 담는다(정류소 좌표가 여러개)
=>리스트 반환


getBusRouteList(버스명): 찾아진 버스정보를 BUS_VO 객체로 만들어서 리스트에 담아서 반환

 3) 노선번호목록조회(URL: getBusRouteList)
=> 버스명 입력받는다(100번 입력하면 이름에 100이 들어간 모든 버스 검색. 여러개 검색됨)
=> OPEN API에 URL(getBusRouteList)로 요청보냄
=> 요청 응답(XML: 이 파일은 버스 정보가 담겨있음)을 받으면 파싱을 해서 BUS_VO에 저장할 값들만 추출 
=> 추출한 정보를 BUS_VO에 담고 이를 리스트에 담는다(버스 여러개 검색됨)
=>리스트 반환


getStaionsByRouteList(노선ID): 찾아진 이 노선의 정거역을 STATION_VO 객체로 만들어 리스트에 담아서 반환

   4) 노선별경유정류소목록조회(URL: getStaionsByRouteList)
=> 버스 노선ID를 입력받는다 
=> OPEN API에 URL(getStaionsByRouteList)로 요청보냄
=> 요청 응답(XML: 경유하는 정류소의 다양한 정보가 담겨있음)을 받으면 파싱을 해서 STATION_VO에 저장할 값들만 추출
=> 추출한 정보를 STATION_VO에 담아서 리스트에 담는다(정류소 여러개가 검색됨)
=>리스트 반환

 

import requests
from bs4 import BeautifulSoup
import bus_info.vo as vo

class BusService:
    def __init__(self):
        self.url = 'http://ws.bus.go.kr/api/rest/busRouteInfo/%s?ServiceKey=%s&%s=%s'
        self.apiKey = 'BYgs6%2FjSL0du1z8yK4GxYdW1SepukkJ0gXtUP3tGUQpjThEU4JeQKRlspdSnxTWcjia6U6r5oPxW%2F7tK7HZ2sg%3D%3D'

    def getRouteInfoItem(self, busId):
        url = self.url%('getRouteInfo', self.apiKey, 'busRouteId', busId)
        print(url)
        html = requests.get(url).text #url 에 웹 요청
        root = BeautifulSoup(html, 'lxml-xml')  # 파서의 종류를 xml로 지정
        code = root.find('headerCd').get_text()
        msg = root.find('headerMsg').get_text()
        print('처리결과:', msg)
        if code == '0':
            busRouteId = root.find('busRouteId').get_text()
            busRouteNm = root.find('busRouteNm').get_text()
            stStationNm = root.find('stStationNm').get_text()
            edStationNm = root.find('edStationNm').get_text()
            term = root.find('term').get_text()
            firstBusTm = root.find('firstBusTm').get_text()
            lastBusTm = root.find('lastBusTm').get_text()
            corpNm = root.find('corpNm').get_text()

            return vo.BusVo(busRouteId, busRouteNm, stStationNm, edStationNm, term, firstBusTm, lastBusTm, corpNm)

    #노선id를 전달하면 노선의 경로를 (x,y)
    def getRoutePathList(self, busId):
        url = self.url % ('getRoutePath', self.apiKey, 'busRouteId', busId)
        print(url)
        html = requests.get(url).text  # url 에 웹 요청
        root = BeautifulSoup(html, 'lxml-xml')  # 파서의 종류를 xml로 지정
        code = root.find('headerCd').get_text()
        msg = root.find('headerMsg').get_text()
        print('처리결과:', msg)
        paths=[]
        if code == '0':
            itemList = root.select('itemList')
            for item in itemList:
                no = item.find('no').get_text()
                x = item.find('gpsX').get_text()
                y = item.find('gpsY').get_text()
                paths.append(vo.PointVo(no, x, y))

            return paths

    def getBusRouteList(self, busName):
        url = self.url % ('getBusRouteList', self.apiKey, 'strSrch', busName)
        print(url)
        html = requests.get(url).text  # url 에 웹 요청
        root = BeautifulSoup(html, 'lxml-xml')  # 파서의 종류를 xml로 지정
        code = root.find('headerCd').get_text()
        msg = root.find('headerMsg').get_text()
        print('처리결과:', msg)
        bus = []
        if code == '0':
            itemList = root.select('itemList')
            for item in itemList:
                busRouteId = item.find('busRouteId').get_text()
                busRouteNm = item.find('busRouteNm').get_text()
                stStationNm = item.find('stStationNm').get_text()
                edStationNm = item.find('edStationNm').get_text()
                term = item.find('term').get_text()
                firstBusTm = item.find('firstBusTm').get_text()
                lastBusTm = item.find('lastBusTm').get_text()
                corpNm = item.find('corpNm').get_text()

                bus.append(vo.BusVo(busRouteId, busRouteNm, stStationNm, edStationNm, term, firstBusTm, lastBusTm, corpNm))
            return bus

    def getStaionsByRouteList(self, busId):
        url = self.url % ('getStaionByRoute', self.apiKey, 'busRouteId', busId)
        print(url)
        html = requests.get(url).text  # url 에 웹 요청
        root = BeautifulSoup(html, 'lxml-xml')  # 파서의 종류를 xml로 지정
        code = root.find('headerCd').get_text()
        msg = root.find('headerMsg').get_text()
        print('처리결과:', msg)
        stations = []
        if code == '0':
            itemList = root.select('itemList')
            for item in itemList:
                seq = item.find('seq').get_text()
                stationNm = item.find('stationNm').get_text()
                arsId = item.find('arsId').get_text()
                stations.append(vo.StationVo(seq, stationNm, arsId))
            return stations

 

 

 

 

import bus_info.service as binfo

def main():
    bservice = binfo.BusService()#busservice 객체 생성

    vo = bservice.getRouteInfoItem('100100124')
    if vo == None:
        print('검색안됨')
    else:
        print(vo)


    '''
    bus = bservice.getBusRouteList('0017')
    if bus == None:
        print('없는 버스 이름')
    else:
        for b in bus:
            print(b)

    paths = bservice.getRoutePathList('100100124')
    if paths == None:
        print('없는 노선')
    else:
        for p in paths:
            print(p)
            
        stations = bservice.getStaionsByRouteList('100100124')
    if stations == None:
        print('없는 버스 이름')
    else:
        for s in stations:
            print(s)
    '''
main()

 

 

+ Recent posts