코로나 데이터 오픈 API로 가져오기

Dahee Lee
9 min readJun 1, 2021

--

끝나긴 끝나는 건지 모르겠는…코..로..나..

이제와서 기록해보는 공공데이터포탈의 오픈 API로 코로나 데이터 가져오기를 기록해 본다.

Photo by Myriam Jessier on Unsplash

데이터는 공공데이터포털에서 가져올 수 있고

실제로 ‘코로나'를 키워드로 검색해보면 총 123건의 다~양한 코로나 관련 데이터를 제공하고 있다.

2021.06 기준

시도해 본 데이터는 코로나19 시·도발생 현황으로 해당 데이터를 가져오는 방법을 기록해 보도록 하겠다. (다른 데이터도 url만 다를뿐 동일하게 적용하면 된다)

  1. 먼저 아래 링크에서 활용신청을 하고 키를 발급 받는다.

https://www.data.go.kr/data/15043378/openapi.do

2. 발급받은 키를 확인한다. (일반 인증키 사용)

3. 파이썬에서 필요한 패키지를 불러 온다.

from urllib.parse import urlencode, quote_plus, unquote
import requests
import json
import xmltodict
import pandas as pd

4. URL에 필요한 키와 파라미터 값을 넣어 호출해 본다.

여기서 필요한 파라미터 값들은 위 활용신청 하는 페이지에서 좀 더 자세하게 확인할 수 있다.

key = '발급받은 키'url = f'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19SidoInfStateJson?serviceKey={key}&'queryParams = urlencode({ quote_plus('pageNo') : '1', quote_plus('numOfRows') : '10', quote_plus('startCreateDt') : '20200201', quote_plus('endCreateDt') : '20210531' })res = requests.get(url + queryParams)
print(res)

5. Dictionary 형식으로 변환한다.

# 문자열 XML을 JSON 형식으로 변환합니다.
res_json = xmltodict.parse(res.text)
# 변환된 JSON 형식을 Dictionary 문자열로 변환합니다.
res_dict = json.dumps(res_json)
# Dictionary 문자열을 파이썬의 Dictionary 형식으로 변환합니다.
data = json.loads(res_dict)
len(data['response']['body']['items']['item']) #8005개

6. 필요한 컬럼을 리스트로 먼저 만들어 놓는다.

컬럼 정보는 아래와 같다.

createDt_list = []
deathCnt_list = []
defCnt_list = []
gubun_list = []
incDec_list = []
isolClearCnt_list = []
isolIngCnt_list = []
localOccCnt_list = []
overFlowCnt_list = []
qurRate_list = []
seq_list = []
stdDay_list = []
updateDt_list = []

6. 딕셔너리에서 아이템 개수만큼 반복문을 돌려 필요한 데이터를 위에서 만든 리스트에 저장한다.

종종 데이터가 안들어 있어 에러가 발생하기도 하여 try catch로 감싸서 진행했다.

for i in range(len(data['response']['body']['items']['item'])):  
try : createDt_list.append(data['response']['body']['items']['item'][i]['createDt'])
except KeyError : createDt_list.append('')

try : deathCnt_list.append(data['response']['body']['items']['item'][i]['deathCnt'])
except KeyError : deathCnt_list.append('')

try : defCnt_list.append(data['response']['body']['items']['item'][i]['defCnt'])
except KeyError : defCnt_list.append('')

try : gubun_list.append(data['response']['body']['items']['item'][i]['gubun'])
except KeyError : gubun_list.append('')

try : incDec_list.append(data['response']['body']['items']['item'][i]['incDec'])
except KeyError : incDec_list.append('')

try : isolClearCnt_list.append(data['response']['body']['items']['item'][i]['isolClearCnt'])
except KeyError : isolClearCnt_list.append('')

try : isolIngCnt_list.append(data['response']['body']['items']['item'][i]['isolIngCnt'])
except KeyError : isolIngCnt_list.append('')

try : localOccCnt_list.append(data['response']['body']['items']['item'][i]['localOccCnt'])
except KeyError:localOccCnt_list.append('')

try : overFlowCnt_list.append(data['response']['body']['items']['item'][i]['overFlowCnt'])
except KeyError:overFlowCnt_list.append('')

try: qurRate_list.append(data['response']['body']['items']['item'][i]['qurRate'])
except KeyError:qurRate_list.append('')

try: seq_list.append(data['response']['body']['items']['item'][i]['seq'])
except KeyError:seq_list.append('')

try: stdDay_list.append(data['response']['body']['items']['item'][i]['stdDay'])
except KeyError: stdDay_list.append('')

try: updateDt_list.append(data['response']['body']['items']['item'][i]['updateDt'])
except KeyError: updateDt_list.append('')

7. 위 리스트들로 데이터프레임을 만들고 저장한다.

dataframe = pd.DataFrame()
dataframe['createDt'] = createDt_list
dataframe['deathCnt'] = deathCnt_list
dataframe['defCnt'] = defCnt_list
dataframe['gubun'] = gubun_list
dataframe['incDec'] = incDec_list
dataframe['isolClearCnt'] = isolClearCnt_list
dataframe['isolIngCnt'] = isolIngCnt_list
dataframe['localOccCnt'] = localOccCnt_list
dataframe['overFlowCnt'] = overFlowCnt_list
dataframe['qurRate'] = qurRate_list
dataframe['seq'] = seq_list
dataframe['stdDay'] = stdDay_list
dataframe['updateDt'] = updateDt_list
dataframe.to_excel('코로나 19 감염 시도 현황.xlsx', index=False)

진행하면서 어려웠던 점은

  • key 에러 (인코딩 문제)
  • 반복문 에러 (데이터가 비어있는 문제)

위 2가지 였는데… 이번에 배웠으니 API로 다른 데이터 가져올 때는 잘 넘어갈 수 있을 것이라는 것에 의의를 둬본다.

다음은 해당 파이썬 파일을 배치로 돌려 자동으로 데이터를 업데이트할 수 있도록 해보아야 겠다!

--

--