본문 바로가기
[AI+X 역량 강화] 인공지능/1) 기본기: 파이썬, 데이터 수집

[파이썬]#13 OpenAPI 크롤링 실습 // 서울 열린데이터 광장, 표와 그래프 만들기

by 'here' 2023. 9. 2.

오늘은 기본기 단계의 마지막 수업으로 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 역량 강화 트랙'에 대한 기록입니다.