오늘은 기본기 단계의 마지막 수업으로 OpenAPI를 사용하는 방법을 알아보자.
서울 열린데이터 광장은 회원가입만 하면 무료로 다양한 데이터를 활용할 수 있는 오픈API를 제공한다.
이전에 배운 크롤링 방법들을 사용하면 딱히 어렵지 않다.
'서울시 병의원 위치 정보'와 '서울시 코로나19 백신 예방접종 현황' 두가지에 대한 데이터를 코랩으로 표와 그래프로 만들어 볼 것이다.
<서울 열린데이터 광장>
- 연구, 관리, 서비스 제공 등 서울시 시정활동 과정에서 수집된 다양한 데이터 존재
- 환경, 교통, 인구 등의 데이터, 보건 등 다양한 분야 데이터 존재
- 쉽게 검색이 가능하고 자유롭게 사용 가능하며, 재사용 가능
- 데이터에 대한 라이선스 정보를 함께 게시하고 있어 데이터 사용에 문제가 되지 않도록 함.
- 개인별로 Key를 발급 받아야함
- 저작관 정보 관련 url :https://data.seoul.go.kr/etc/openInfo.do
[Part 1] 서울시 병의원 위치 정보
서울시의 병원 주소, 분류, 응급실여부, 약도, 기관명, 진료시간, 대표전화, 경위도 등에 대한 정보가 있다.
그 중에서 원하는 데이터 몇개만 뽑아보자.
1. request url 이용하여 데이터 가져오기
import requests
import json
import pandas as pd
Key = "발급받은 키"
start_page = 1
last_page = 500
url = f"http://openapi.seoul.go.kr:8088/{Key}/json/TbHospitalInfo/{start_page}/{last_page}/"
html = requests.get(url)
data = html.json()
data
2. 원하는 정보 추출하기
위에서 데이터를 가져왔을 때, 가장 첫줄에서 'TbHospitalInfo'와 'row'를 가져온다.
hospital = data["TbHospitalInfo"]["row"]
hospital
DUTYADDR, DUTYDIV 같은건 OpenAPI 페이지에 들어가면 아래와 같이 해당하는 출력값을 볼 수 있다.
3. 리스트에 정보 정리하기
information_ls = []
for i in hospital:
information_dict={}
information_dict["기관명"] = i["DUTYNAME"]
information_dict["병원분류명"] = i["DUTYDIVNAM"]
information_dict["간이약도"] = i["DUTYMAPIMG"]
information_dict["주소"] = i["DUTYADDR"]
information_ls.append(information_dict)
information_ls
이처럼 출력값을 해당 출력 설명으로 바꿔주고, 필요한 데이터값만 가져와 dict에 넣었다.
4. pandas를 이용하여 정보 정리하기
테이블로 만들어보자.
table = pd.DataFrame.from_dict(information_ls, orient="columns")
table
5. 데이터를 표로 저장
table.to_csv("./병위원 위치정보.csv")
[Part 2] 서울시 코로나19 예방접종 현황
이번에는 데이터를 가져와서 표가 아닌 그래프로 만들어볼 것이다.
우선, 코랩에서는 한글 데이터가 깨지기 때문에 폰트 변화코드를 가져와야 한다.
# 나눔바름고딕폰트로 변환하는 코드
# 코랩에서 한글 코드가 깨질 경우 사용
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
가져오고 나서 '런타임 > 런타임 다시 시작' 하고 이어가는거 잊지 말기!
이제부터 순서는 이전 실습과 같다.
1. request url 이용하여 데이터 가져오기
import requests
import json
import pandas as pd
Key = "발급 받은 키"
start_page = 1
last_page = 50
url = f"http://openapi.seoul.go.kr:8088/{Key}/json/tvCorona19VaccinestatNew/{start_page}/{last_page}/"
html = requests.get(url)
data = html.json()
data
2. 원하는 정보 추출하기
이번에도, 가장 첫줄에서 'tvCorona19VaccinestatNew'와 'row'를 가져온다.
datas = data["tvCorona19VaccinestatNew"]["row"]
datas
3. 리스트에 정보 정리하기
information_ls = []
for i in datas:
information_dict = {}
information_dict["접종일"] = i["S_VC_DT"]
information_dict["당일 1차접종자 수"] = i["FIR_INC1"]
information_dict["당일 2차접종자 수"] = i["SCD_INC1"]
information_dict["당일 3차접종자 수"] = i["ADD_INC1"]
information_dict["당일 4차접종자 수"] = i["FOUR_INC1"]
information_dict["당일 동절기접종자 수"] = i["WINTER_INC1"]
information_ls.append(information_dict)
information_ls
4. pandas를 이용하여 정보 정리하기
table = pd.DataFrame.from_dict(information_ls, orient="columns")
table
그리고 테이블 정보를 확인해보자.
table.info()
5. '접종일' 타입을 날짜로 바꾸기
근데 우선, index 0 ~ 14번까지는 날짜의 형태가 아니라 object이라는 것을 볼 수 있다.
따라서 0 ~ 14번의 데이터는 지우도록 하자.
table2 = table.drop(labels=range(0,15))
그리고 나서 날짜 타입으로 바꾸기!
table2["접종일"] = pd.to_datetime(table2["접종일"])
table2의 정보를 확인해보면 접종일의 타입이 datetime64[ns]으로 바뀐 것을 확인할 수 있다.
6. 그래프 만들기
import matplotlib.pyplot as plt
plt.rc("font", family="NanumBarunGothic")
plt.plot(table2["접종일"], table2["당일 1차접종자 수"],
table2["접종일"], table2["당일 2차접종자 수"],
table2["접종일"], table2["당일 3차접종자 수"],
table2["접종일"], table2["당일 4차접종자 수"],
table2["접종일"], table2["당일 동절기접종자 수"]
)
plt.legend(["당일 1차접종자 수", "당일 2차접종자 수", "당일 3차접종자 수", "당일 4차접종자 수", "당일 동절기접종자 수"])
plt.show()
※ 해당 카테고리는 딥노이드, 오픈놀, 앙트비에서 주최하는 '<스타트업 유니버시티: DX Challenge 교육> AI+X 역량 강화 트랙'에 대한 기록입니다.
'[AI+X 역량 강화] 인공지능 > 1) 기본기: 파이썬, 데이터 수집' 카테고리의 다른 글
[파이썬]#12 동적 크롤링 실습 // 구독한 네이버 뉴스 크롤링 (0) | 2023.09.01 |
---|---|
[파이썬]#11 정적 크롤링 실습 // 네이버 뉴스, 서울특별시 코로나19 크롤링 (1) | 2023.08.31 |
#10 웹크롤링, Open API란? (0) | 2023.08.30 |
#9 데이터 수집 이론 및 활용 // 사례, 데이터3법, 비식별화 (1) | 2023.08.27 |
#8 파이썬 기초 6 // Pandas 라이브러리 (0) | 2023.08.27 |