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()
'파이썬이 제일 쉽다면서요' 카테고리의 다른 글
python+ #버스 정보 APP(2) UI (0) | 2021.07.13 |
---|---|
python+Mysql #회원 관리 프로그램(2) Menu,Main (0) | 2021.06.21 |
python+Mysql #회원 관리 프로그램(1) Vo,Dao,Service (0) | 2021.06.21 |
python+MySQL #DB 연결 (0) | 2021.06.21 |
python #접근제어 Private (0) | 2021.06.14 |