티스토리 뷰

회사 바로 앞에 버스 정류장이 있는데, 퇴근해서 내려가 보면 눈앞에서 떠나는 버스..

요즘은 버스가 정류장을 떠나면 잘 세워주지도 않죠?

- 안전을 위해 당연한 거죠?


그래서 이제는 버스의 도착 시간을 미리 알아야겠다는 생각이 들었습니다

사실 버스 홈페이지나 국토부 등에서 정보를 쉽게 구할 수는 있는데, 로그인이나 웹페이지 여는 것조차 

우리에겐 귀찮습니다.

- (검은 바탕에 흰 글씨)터미널이 눈에 더 익는 것도 사실이고 ^^;;


일단 웹에서 제공하는 서비스를 웹페이지 개발자 모드로 분석하고 PHP에서 curl 하기로 했습니다

결과는 XML이기 때문에 그에 맞게 parsing 했습니다.


소스는 아래와 같습니다.



리눅스 터미널에서 실행은.. 대략 이렇게 하면 되겠죠?

while [ 1 ] ;do clear;php bus.php;sleep 5;done


출력 결과는 아래와 같습니다.

 ---------------------------------

|  Bus : 143  

|   1) 4분32초후[2번째 전]  

|   2) 4분58초후[2번째 전]  

 ---------------------------------

|  Bus : 350  

|   1) 7분39초후[3번째 전]  

|   2) 21분33초후[7번째 전]  

 ---------------------------------

|  Bus : 2413  

|   1) 11분57초후[6번째 전]  

|   2) 27분31초후[16번째 전]  

 ---------------------------------

|  Bus : 3422  

|   1) 6분25초후[3번째 전]  

|   2) 18분26초후[7번째 전]  

 ---------------------------------

Wed May 25 16:44:49 KST 2016


이제는 버스를 눈앞에서 놓치지 말고 잘 타서 즐거운 퇴근 길이 되어야겠습니다. 

혹시 코드 사용하실 분들은 코드 앞 부분 $url에서 strBusNumber의 값만 버스 정류소 번호로 변경해주면 되겠습니다.





댓글
  • 프로필사진 유승주 멋진소스 너무좋습니다!! 2016.06.12 02:54
  • 프로필사진 BlogIcon Jaeyeon Baek 좋은 답변 감사합니다 :) 2016.06.12 10:22 신고
  • 프로필사진 chopa 궁금한게 있는데. 위 URL은 어디서 찾으신거에요??
    서울대중교통 사이트를 가도 xml 제공? 그런말이 없는데..
    2016.06.13 13:09
  • 프로필사진 BlogIcon Jaeyeon Baek 서울대중교통에서 버스 조회 시에 호출되는 페이지를 뒤져서 찾았습니다 :) 2016.06.13 15:00 신고
  • 프로필사진 jeehoonii 혹시 경기버스 도착정보를 제공하는 URL을 알 수 있을까요?
    부탁드리겠습니다..
    2017.03.20 16:27
  • 프로필사진 BlogIcon Jaeyeon Baek 잘 모르지만, 구체적으로 말씀해주시면 도움 드릴 수 있도록 노력하겠습니다.

    경기버스 전체에 대한 리스트가 필요하신건가요? 아니면 조회할 수 있는 기본 URL이 필요하신건가요?
    2017.03.20 17:58 신고
  • 프로필사진 jeehoonii 본문글과 같이 PHP나 다른 언어로 버스도착정보를 찾을 수 있는 URL 을 원하거든요..
    본문에 있는 URL에서 경기버스정류소의 고유번호를 입력해 봤는데 정확하지가 않네요..ㅠ
    서울은 정확한데..
    2017.03.20 18:19
  • 프로필사진 BlogIcon Jaeyeon Baek 본문은 서울버스 기준이라서 경기버스에 동일하게 사용은 안됩니다. 표준 없이 웹 페이지 만든 개발자가 달라서 포맷도 다르죠 :-)
    /* 경기버스 주석에서 개발자 이름도 발견 됨... */

    아래 소스를 참고해서 해보세요.
    https://gist.github.com/jybaek/bd26a5c0208ea2be982c025b67ac6669

    경기버스는 어떤 의도인지 잘 모르겠는데 정류장 번호를 한번 파싱해서 다른 값을 얻어 사용합니다. 그래서 쿼리를 두 번 사용하는 방식으로 크롤러 샘플을 만들었습니다.
    json 형태로 결과가 나오는데 json파서 사용해서 다듬어야 할 겁니다.

    도움이 되셨기를...
    2017.03.21 11:05 신고
  • 프로필사진 jeehoonii 정말 감사합니다~
    좋은 하루 되세요~~ ^^
    2017.03.21 11:21
  • 프로필사진 BlogIcon Jaeyeon Baek 감사합니다. 좋은 하루 되세요 :-) 2017.03.21 14:14 신고
  • 프로필사진 jeehoonii 안녕하세요..
    예전에 윗 댓글에서 경기버스 도착정보에 대하여 질문한 사람입니다.
    이제야 소스를 분석해 봤는데요..
    재연님 말처럼 경기버스 사이트는 일단 stationNo(49540)를 먼저 받아서 다시 stationID(222001670)로 변환시켜서 사용하네요..
    그래서 두번 파싱이 필요한데요...
    문제는 두번 파싱을 통해서 받은 결과 데이터에서 버스번호가 직접 안나오고 여기도 vehId1 과 같이 일단 ID 값만 얻을 수 있습니다.ㅠㅠ
    이 값을 이용해서 버스번호 정보를 찾으려고 하는데 방법을 모르겠네요...ㅠㅠ
    vehid1 값을 이용해서 거꾸로 파싱을 해야 하는지...
    이 부분을 해결할 수 있는 방법을 알려주시면 정말 감사하겠습니다..
    2017.05.18 13:52
  • 프로필사진 BlogIcon Jaeyeon Baek 추가적인 쿼리가 필요할 수도 있겠네요, 작업하신 부분에 대한 소스 공유해주시면 같이 봐드리기 수월할 것 같습니다.

    제가 당장은 뭔가 할 수 있는 상황이 아니라서요 (...)
    2017.05.18 14:20 신고
  • 프로필사진 jeehoonii 제가 작성하는 프로그램은 PHP가 아니고 파이썬 입니다.
    파이썬 환경이 없으시면 실행해보실수가 없겠네요..ㅠㅠ
    어쨌든 문법이 간단하기 때문에 보시면 금방 이해가 되실겁니다.
    아래의 소스를 실행시키면 결과가 json 형태로 결과가 나오는데 이게 위에서 말씀드린대로 버스번호가 안나오고 vehid1 과 같이 ID만 나오거든요..
    확인해주시면 감사하겠습니다..

    import json
    import requests

    from bs4 import BeautifulSoup

    def spider():

    base_urlt = "http://www.gbis.go.kr/gbis2014/schBusAPI.action?cmd=searchAllJson&searchKeyword=49540&pageOfRoute=1&pageOfBus=1&pageOfSubway=1&pageOfPOI=1&searchGubun=undefined"



    #storing all the information including headers in the variable source code
    source_code=requests.get(base_urlt)
    data = json.loads(source_code.text)
    #print(data)
    busstation = data["result"]["busStation"]["list"]
    stationID = busstation[0]["stationId"]
    print(stationID)

    base_url = "http://www.gbis.go.kr/gbis2014/schBusAPI.action?cmd=searchBusStationJson&stationId=" + stationID

    source_code1=requests.get(base_url)
    data1 = json.loads(source_code1.text)
    print(data1)



    spider()
    2017.05.18 15:25
  • 프로필사진 BlogIcon Jaeyeon Baek 돌려보았는데요, routeName 가 버스 번호인 것 같은데 확인해 보시겠어요?

    plateNo가 번호판인데 검색해보면 대략적으로 버스번호 확인 가능한 것 같네요.

    그리고 python으로 이런 출력을 할 때는 아래처럼 pprint를 사용하시는게 정신 건강에 좋습니다.

    import pprint
    ...
    pp = pprint.PrettyPrinter(indent=4)
    print pp.pprint(data1)
    2017.05.18 17:38 신고
  • 프로필사진 jeehoonii 그러네요..ㅠㅠ
    routeName 이 맞네요.. 제가 그걸 왜 못봤을까요..ㅠㅠ
    그리고 pprint에 대한 정보도 알게되었네요..
    정말 감사합니다~~ ^^
    2017.05.19 14:01
  • 프로필사진 BlogIcon Jaeyeon Baek 저의 보람이군요. :-) 감사합니다. 2017.05.19 19:43 신고
댓글쓰기 폼