[mini_project] 버스 시간표 계산 프로그램 제작기 - 2

    Api 테스트는 가볍게 당일만에 끝내고 응답데이터 파싱해서 어떻게 다루고 저장할지 생각하려고 했다
    하지만 json만 다뤄보다가 xml 유형은 처음이라 생각보다 조금 더 걸렸다.

    환경변수 이용하기

    코드 관리와 github 업로드를 위해 key값 등을 환경변수로 등록하여 사용해야 한다

    from dotenv import load_dotenv
    
    load_dotenv()
    keycode_decoding = os.environ.get('keycode_encoding')
    
    # /.env
    # keycode_encoding = 'my_code'
    # key = value

    pip install python-dotenv을 통해 설치하고 .env파일을 만들어 내용을 위 주석처럼 등록했다.
    load_dotenv()를 통해 환경변수 로드를 한번 해주고 등록된 변수를 get으로 찾아왔다.

    API 테스트

    def getBusStationList(key, keyword):
        url = 'http://apis.data.go.kr/6410000/busstationservice/getBusStationList'
        params ={'serviceKey' : key, 'keyword' : keyword }
        return requests.get(url, params=params)
    
    # 신분당선강남역 버스정류장 번호 22009
    response = getBusStationList(keycode_decoding, '22009')
    root = ET.fromstring(response.text)
    bus_station_info_list = []
    for child in root.find('msgBody'):
        temp_dict = {}
        for a in child:
            temp_dict[a.tag] = a.text
        bus_station_info_list.append(temp_dict)
    pprint(bus_station_info_list)

    기본적인 구성은 공공데이터 페이지에 나와있어서 동일한 방식으로 호출을 해보았다.
    위 응답결과로 들어온 내용은 아래와 같다

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <response>
        <comMsgHeader/>
        <msgHeader>
            <queryTime>2023-01-23 12:34:45.504</queryTime>
            <resultCode>0</resultCode>
            <resultMessage>정상적으로 처리되었습니다.</resultMessage>
        </msgHeader>
        <msgBody>
            <busStationList>
                <centerYn>Y</centerYn>
                <districtCd>1</districtCd>
                <mobileNo> 22009</mobileNo>
                <regionName>서울</regionName>
                <stationId>121000009</stationId>
                <stationName>신분당선강남역(중)</stationName>
                <x>127.02835</x>
                <y>37.49615</y>
            </busStationList>
            <busStationList>
                <centerYn>N</centerYn>
                <districtCd>2</districtCd>
                <mobileNo> 22009</mobileNo>
                <regionName>구리</regionName>
                <stationId>221000122</stationId>
                <stationName>담터농협</stationName>
                <x>127.1152333</x>
                <y>37.6409</y>
            </busStationList>
        </msgBody>
    </response>

    원하는 내용들이 3단계 안으로 들어가서 내용을 가져와야 해서 for문과 find 등을 이용해서 값을 꺼냈다
    .tag는 엘리먼트(ex.stationName)의 이름을 가져오고 .text는 내용(ex. 신분당선강남역(중))을 가져온다는 것을 알아냈다

    데이터 연계

    버스 정류장 데이터 조회 API는 keyword 방식이라 정류소명 혹은 정류소 번호를 통해 찾는 반면
    다른 API에선 노선의 아이디, 정류장 아이디를 요구해서 버스 정류장을 통해 데이터를 가지고 와서 DB에서 보관하고
    거기서 얻은 정보를 통해 다른 API에 사용할 파라미터를 넣어야 할 것 같다
    xml 내용을 보면 알 수 있듯 정류장 ID(stationId)와 정류장 번호(mobileNo)는 다른 항목으로 관리되고 있었다

     

     

    GitHub - realight0316/customize_bus_data: 공공데이터 API를 이용한 버스 데이터 수집 및 개인 활용

    공공데이터 API를 이용한 버스 데이터 수집 및 개인 활용. Contribute to realight0316/customize_bus_data development by creating an account on GitHub.

    github.com

     

    xml 구성과 파싱방법을 검색하면서 chatGPT를 이용해 보았는데 너무 편리했다
    진짜 구글보다 빠르고 보기좋게 정리해 주어서 좋았다
    대화형식의 질문과 답변이 이루어지기때문에 이전 답변에 대한 연계질문도 된다는 점이 굉장히 신기하고 유용했다

    댓글