얼마 전 공적 마스크 실시간 재고확인을 위한 공공 API가 오픈되었습니다. 간단히 API를 호출하여 재고를 나타내는 방법을 파이썬을 이용하여 구현해보도록 하겠습니다.
순서
- API를 통한 데이터 로드
Folium
을 이용한 지도 표기 (라이브러리 사용법은 여기에서 확인가능)
API 호출 코드 설명
공공 API 활용은 공공데이터포털에서 상세히 확인할 수 있습니다. 그 중에서도 공적 마스크 재고는 여기에서 확인하실 수 있습니다.
API페이지에서 상세 조회가 가능하며, 이 포스팅에서는 그 중
/storesByGeo/json
주소를 통해 데이터를 받는 것으로 진행합니다.원하는 위도/경도 및 반경을 쿼리값으로 넣어 호출하면, 그에 해당하는 약국리스트와 재고량 및 업데이트 시간 등을 반환해줍니다. (코드에서는 사당역 위도/경도를 넣었습니다.)
반환된 데이터는 json 형태로 되어 있으며, 각 항목별로 리스트에 추가합니다.
데이터가 필드값이 아예 없는 경우가 있어서, 예외처리를 해줬습니다.
Folium
코드 설명circle
를 이용해 각 약국별 위도/경도 정보를 원으로 나타냈습니다.재고량에 따라 정부에서 권고한대로 색상표기를 해줬습니다. 색상은
colorSelection
이라는 함수를 만들어 사용했습니다.원 클릭 시, 해당 약국에 대한 정보를 보여주기 위해
popUp
을 띄우고, 재고량은transformToNum
함수를 통해 표기했습니다.
코드 실행 시, folium 맵에 약국 좌표들이 나타나는 것을 볼 수 있습니다. 또한 점 클릭 시, 해당 약국에 대한 상세 정보를 확인할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | def colorSelection(text): if text == 'empty': color = '#8C8C8C' elif text == 'few': color = '#FF0000' elif text == 'some': color = '#FFBB00' elif text == 'plenty': color = '#2F9D27' else: color = '#000000' return color def transformToNum(text): if text == 'empty': number = '0~1개' elif text == 'few': number = '2~29개' elif text == 'some': number = '30~99개' elif text == 'plenty': number = '100개 이상' else: number = '불분명' return number import requests import folium # 사당역 중심에서 15 zoom으로 시작. tiles는 기호에 따라 설정 37.392132, 126.957943 m = folium.Map((37.392132, 126.957943), tiles='Cartodb Positron', zoom_start= 15) URL = 'https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/storesByGeo/json' # 초기에는 사당역 중심, 반경 3키로 이내 검색 params = {'lat': 37.476578, 'lng': 126.981625, 'm': 3000} response = requests.get(URL,params=params) # 전체 검색된 약국의 수. print(response) total_pages = response.json()["count"] store = response.json()["stores"] # 리스트 초기화 addr = [] lat = [] lng = [] name = [] remain_stat = [] remain_number = [] stock_at = [] created_at = [] # 검색된 내용을 리스트에 담기 for i in range(len(store)): if len(store[i]) == 9: if store[i]["remain_stat"] is None: remain_stat.append("재고 불분명") remain_number.append("재고 불분명") else: remain_stat.append(store[i]["remain_stat"]) remain_number.append(transformToNum(store[i]["remain_stat"])) if store[i]["addr"] is None: addr.append(store[i]["error"]) else: addr.append(store[i]["addr"]) if store[i]["lat"] is None: lat.append(0) else: lat.append(store[i]["lat"]) if store[i]["lng"] is None: lng.append(0) else: lng.append(store[i]["lng"]) if store[i]["name"] is None: name.append("이름 없음") else: name.append(store[i]["name"]) if store[i]["stock_at"] is None: stock_at.append("입고시간 없음") else: stock_at.append(store[i]["stock_at"]) if store[i]["created_at"] is None: created_at.append("업데이트 시간 없음") else: created_at.append(store[i]["created_at"]) else: print("정보가 이상함. 서버문제.") for i in range(len(lat)): folium.Circle( location = [lat[i], lng[i]], radius = 20, color = colorSelection(remain_stat[i]), fill = 'crimson', popup=folium.Popup('<strong>' + name[i]+'</strong><br>'+ '재고수량: ' + remain_number[i] + '<br>' + '입고시간: ' + stock_at[i] + '<br>' + '업데이트: ' + created_at[i], parse_html=False, max_width = 300) ).add_to(m) m | cs |
'Developer > Python' 카테고리의 다른 글
[Python] Matplotlib 이벤트 핸들링 (마우스 이벤트, 키보드 이벤트) (0) | 2020.07.30 |
---|---|
[파이썬] Pyinstaller, cx_Freeze 사용법 (exe 파일 생성) (0) | 2020.07.29 |
Python 지도 라이브러리, Folium 사용법 (0) | 2020.01.04 |
[Python] 웹스크랩핑하기 - Selenium을 통한 크롬 브라우저 제어 (260) | 2019.05.26 |
[Python] 웹스크랩핑하기 - link주소 따오기 (attrib) (254) | 2019.05.24 |
댓글