반응형

안녕하세요~! 오늘은 공공데이터 openAPI의 xml을 Pandas DataFrame으로 변환하여 보도록 하겠습니다.
json에서 DataFrame으로의 변환은 여기를 클릭해서 확인해 주세요 :)

step1. 데이터 활용신청하기

공공데이터 포털

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

위 사이트에 접속 후 로그인하여 주세요.
여기서 '코로나'를 검색해 주세요.
그 후 스크롤 다운을 하셔서 아래의 내용을 찾으신 후 API 활용신청을 해 주세요.

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

 

공공데이터활용지원센터_보건복지부 코로나19 시·도발생 현황

코로나19감염증으로 인한 시.도별 신규확진자,신규사망자,격리중인환자수,격리해제환자수등에 대한 현황자료 (이 제공자료는 관련 발생 상황에 대한 정보를 신속 투명하게 공개하기 위한 것으

www.data.go.kr

또는 위의 링크를 클릭하셔도 됩니다 :)
활용신청을 했다면 마이페이지에 들어가 주세요 :)

오픈 API > 개발계정> 공공데이터 활용지원센터_보건복지부 코로나19 시.도 발생 현황을 클릭해 주세요.

그 후 상세설명 클릭하여 요청 값 및 출력 값(컬럼)을 확인해 주세요.
각각의 컬럼 값에 어떤 내용이 있는지 확인하기 위해서 꼭 필요하기 때문에 잘 읽어주세요.

스크롤 다운을 하면 아래의 샘플코드> Python을 클릭하여 코드를 참고하여 xml을 불러오면 됩니다.

 

step2. API를 사용하여 xml 불러오기

이제부터 데이터를 요청하는 코드를 작성해 보도록 하겠습니다.

# 모듈 import
import requests
import pprint

#인증키 입력
encoding = '발급받은 인코딩 인증키를 복사하여 붙여넣기 해 주세요.'
decoding = '발급받은 디코딩 인증키를 복사하여 붙여넣기 해 주세요.'

#url 입력
url = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19SidoInfStateJson'
params ={'serviceKey' : decoding , 
'pageNo' : '1', 
'numOfRows' : '10', 
'startCreateDt' : '2020', 
'endCreateDt' : '20211103' }

response = requests.get(url, params=params)

# xml 내용
content = response.text

# 깔끔한 출력 위한 코드
pp = pprint.PrettyPrinter(indent=4)
#print(pp.pprint(content))

위의 내용까지는 전 게시글의 내용과 비슷합니다.
서비스키에 들어갈 수 있는 인증키로는 인코딩과 디코딩이 있는데 인코딩으로 실행하였을 때 오류가 나서 디코딩 인증키를 넣어 요청하였습니다.

step3. xml을 DataFrame으로 변환하기

xml 문서는 <item>안에 각 값이 태그 형식<>으로 들어 있습니다.
이 점을 이용해 뷰티플수프를 이용하여 파싱해보도록 하겠습니다.

### xml을 DataFrame으로 변환하기 ###
from os import name
import xml.etree.ElementTree as et
import pandas as pd
import bs4
from lxml import html
from urllib.parse import urlencode, quote_plus, unquote

## 각 컬럼 값 ## (포털 문서에서 꼭 확인하세요)
"""
SEQ : 게시글번호(국내 시도별 발생현황 고유값)
CREATE_DT: 	등록일시분초
DEATH_CNT: 	사망자 수
GUBUN: 	시도명(한글)
GUBUN_CN: 	시도명(중국어)
gubunEn: 시도명(영어)
INC_DEC: 전일대비 증감 수
ISOL_CLEAR_CNT: 격리 해제 수
QUR_RATE: 10만명당 발생률
STD_DAY: 기준일시
UPDATE_DT: 수정일시분초
DEF_CNT: 확진자 수
ISOL_ING_CNT: 격리중 환자수
OVER_FLOW_CNT: 해외유입 수
LOCAL_OCC_CNT: 지역발생 수

""" 

#bs4 사용하여 item 태그 분리

xml_obj = bs4.BeautifulSoup(content,'lxml-xml')
rows = xml_obj.findAll('item')
print(rows)

출력:

위의 내용만으로 한 눈에 어떤 정보가 있는지 보기 힘들기 때문에 데이터 프레임으로 만들기 전 이에 필요한
각각의 행값, 열 이름값, 데이터값을 추출하는 코드를 작성해 보겠습니다.

# 각 행의 컬럼, 이름, 값을 가지는 리스트 만들기
row_list = [] # 행값
name_list = [] # 열이름값
value_list = [] #데이터값

# xml 안의 데이터 수집
for i in range(0, len(rows)):
    columns = rows[i].find_all()
    #첫째 행 데이터 수집
    for j in range(0,len(columns)):
        if i ==0:
            # 컬럼 이름 값 저장
            name_list.append(columns[j].name)
        # 컬럼의 각 데이터 값 저장
        value_list.append(columns[j].text)
    # 각 행의 value값 전체 저장
    row_list.append(value_list)
    # 데이터 리스트 값 초기화
    value_list=[]

여기서 name_list는 열 이름들을 가지고 있고, row_list는 한 행의 값을 가지고 있습니다.
이제 위 변수들에 저장된 내용을 가지고 DataFrame으로 만들어 보겠습니다.

#xml값 DataFrame으로 만들기
corona_df = pd.DataFrame(row_list, columns=name_list)
print(corona_df.head(19))

가끔 데이터 프레임을 만들 때  Assertion Error가 나는 경우가 있는데 이때는 columns를 사용하지 마시고 df를 만들면 됩니다.

#xml값 DataFrame으로 만들기
#Assertion Error가 난 경우
corona_df = pd.DataFrame(row_list)
# 이후에 컬럼을 설정해 주세요.

출력:

깔끔하게 데이터프레임으로 만들어짐을 확인할 수 있습니다 :)
추가로 만들어진DataFrame을 csv파일로 저장하고 싶다면 아래의 코드를 추가하시면 됩니다.

#DataFrame CSV 파일로 저장
corona_df.to_csv('corona_kr.csv', encoding='utf-8-sig')

 

전체 코드
# 모듈 import
import requests
import pprint


#인증키 입력
encoding = '발급받은 인코딩 인증키를 복사하여 붙여넣기 해 주세요.'
decoding = '발급받은 디코딩 인증키를 복사하여 붙여넣기 해 주세요.'

#url 입력
url = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19SidoInfStateJson'
params ={'serviceKey' : decoding , 'pageNo' : '1', 'numOfRows' : '10', 'startCreateDt' : '2020', 'endCreateDt' : '20211103' }

response = requests.get(url, params=params)

# xml 내용
content = response.text

# 깔끔한 출력 위한 코드
pp = pprint.PrettyPrinter(indent=4)
#print(pp.pprint(content))

### xml을 DataFrame으로 변환하기 ###
from os import name
import xml.etree.ElementTree as et
import pandas as pd
import bs4
from lxml import html
from urllib.parse import urlencode, quote_plus, unquote

## 각 컬럼 값 ## (포털 문서에서 꼭 확인하세요)
"""
SEQ : 게시글번호(국내 시도별 발생현황 고유값)
CREATE_DT: 	등록일시분초
DEATH_CNT: 	사망자 수
GUBUN: 	시도명(한글)
GUBUN_CN: 	시도명(중국어)
gubunEn: 시도명(영어)
INC_DEC: 전일대비 증감 수
ISOL_CLEAR_CNT: 격리 해제 수
QUR_RATE: 10만명당 발생률
STD_DAY: 기준일시
UPDATE_DT: 수정일시분초
DEF_CNT: 확진자 수
ISOL_ING_CNT: 격리중 환자수
OVER_FLOW_CNT: 해외유입 수
LOCAL_OCC_CNT: 지역발생 수

""" 

#bs4 사용하여 item 태그 분리

xml_obj = bs4.BeautifulSoup(content,'lxml-xml')
rows = xml_obj.findAll('item')
print(rows)
"""
# 컬럼 값 조회용
columns = rows[0].find_all()
print(columns)
"""

# 각 행의 컬럼, 이름, 값을 가지는 리스트 만들기
row_list = [] # 행값
name_list = [] # 열이름값
value_list = [] #데이터값

# xml 안의 데이터 수집
for i in range(0, len(rows)):
    columns = rows[i].find_all()
    #첫째 행 데이터 수집
    for j in range(0,len(columns)):
        if i ==0:
            # 컬럼 이름 값 저장
            name_list.append(columns[j].name)
        # 컬럼의 각 데이터 값 저장
        value_list.append(columns[j].text)
    # 각 행의 value값 전체 저장
    row_list.append(value_list)
    # 데이터 리스트 값 초기화
    value_list=[]

#xml값 DataFrame으로 만들기
corona_df = pd.DataFrame(row_list, columns=name_list)
###assertion error의 경우###
###corona_df = pd.DataFrame(row_list)
print(corona_df.head(19)) 

#DataFrame CSV 파일로 저장
corona_df.to_csv('corona_kr.csv', encoding='utf-8-sig')

 

코드 파일

corona_DataFrame.py
0.00MB

참고 사이트

Python (파이썬) 공공데이터 수집 (Open API - XML)

 

Python (파이썬) 공공데이터 수집 (Open API - XML)

공공데이터포털의 특징은 자료를 활용을 요약하자면 1. 회원 가입 후 '사용자 인증키'를 생성해야한다. 2. 이후 원하는 데이터를 '활용 신청'을 해서 승인이 떨어지고 활용 권한을 획득해야한다

greendreamtrre.tistory.com

 

마무리

저번에는 json -> DataFrame 하는 방법을 공유하였고
이번에는 xml -> DataFrame 하는 방법을 공유하였습니다.
다음 시간에는 위에서 만든 corona_df를 가지고 bar_chart_race로 시각하여 보도록 하겠습니다 ^ㅇ^
이해 가지 않는 내용이나 질문이 있으면 댓글로 남겨 주세요 :)

반응형
반응형

[Python] 공공데이터 포털의 OPEN API 사용 방법의 2부 지금 시작하도록 하겠습니다.

저번에는 공공데이터 포털의 open API 신청 방법 및 파이썬 코드 확인방법까지 알아보았습니다.

오늘은 파이썬으로 어떻게 하면 open API를 사용해 데이터를 불러올 수 있는지 알아보도록 합시다.

 

step1. 공공데이터 포털 접속 API 확인
공공데이터 포털 사이트: https://www.data.go.kr

위의 사이트에 접속 후 로그인을 해 줍니다.

마이페이지 > 오픈API > 개발계정

접속 후 1부에서 신청한 전국CCTV 표준데이터를 클릭해줍니다.

여기서 확인을 클릭해 주고

미리보기를 클릭해주면,

위와 같이 미리보기 창이 뜹니다. 거기서 빨간색 박스 표시를 한 url을 복사해줍니다.

그러면 아래와 같이 url이 나타납니다.

http://api.data.go.kr/openapi/tn_pubr_public_cctv_api?serviceKey=인증키&pageNo=1&numOfRows=100&type=xml

여기서 본인의 인증키를 입력하고 페이지시작(pageNo), 한번에 출력되는 행 갯수(numOfRows), json또는xml타입(type)을 원하는 대로 입력하면 됩니다.

이 url을 이용하여 파이썬으로 데이터를 불러와 보겠습니다.

저는 numOfRows = 10 , type =json 으로 설정하여 url을 사용하겠습니다.

http://api.data.go.kr/openapi/tn_pubr_public_cctv_api?serviceKey=인증키&pageNo=1&numOfRows=10&type=json

 

step2. 라이브러리 import 및 url입력
# 라이브러리 import
import requests
import pprint
import json

# url 입력
url = 'http://api.data.go.kr/openapi/tn_pubr_public_cctv_api?serviceKey=개인인증키입력&pageNo=1&numOfRows=10&type=json'

# url 불러오기
response = requests.get(url)

#데이터 값 출력해보기
contents = response.text

url을 불러오고 데이터 값을 출력해 보면

이렇게 출력이 됩니다. 한 눈에 보기 어려우니 예쁘게 출력해주는 pprint 라이브러리를 사용하여 출력해 봅시다.

# 데이터 결과값 예쁘게 출력해주는 코드
pp = pprint.PrettyPrinter(indent=4)
print(pp.pprint(contents))

그럼 위와 같이 예쁘게 출력이 됩니다.

step3. 문자열을 json으로 변경하기

여기서 위의 문자열을 json으로 변경해 줍시다.

#문자열을 json으로 변경
json_ob = json.loads(contents)
print(json_ob)
print(type(json_ob)) #json타입 확인

이제 json으로변경이 됐고 dict 타입임을 확인할 수 있습니다.

step4. 필요한 내용만 남기기

위를 보면 데이터의 내용에서 response 키 값의 body, body 속에 items 가 있고 우리가 원하는 정보가 거기 모두 들어있음을 확인할 수 있습니다. 이를 확인 후 아래와 같이 items내용만 꺼내보도록 합시다.

# 필요한 내용만 꺼내기
body = json_ob['response']['body']['items']
print(body)

그럼 이렇게 items의 내용만 출력이 됩니다.

step5. Dataframe으로 변환하기

이제 마지막 단계입니다. 위에서 작성한 body 변수에 저장된 내용을 pandas를 활용하여 Dataframe으로 만들어 줍니다.

# pandas import
import pandas as pd

# Dataframe으로 만들기
dataframe = pd.json_normalize(body)

print(dataframe)

그럼 이렇게 깔끔하게 DataFrame으로 저장된 것을 확인할 수 있습니다.

이것을 토대로 분석을 진행하시면 됩니다^o^

전체코드
#라이브러리 import
import requests
import pprint
import json

# url 입력

url = 'http://api.data.go.kr/openapi/tn_pubr_public_cctv_api?serviceKey=개인인증키입력&pageNo=1&numOfRows=10&type=json'

response = requests.get(url)

contents = response.text

# 데이터 결과값 예쁘게 출력해주는 코드
pp = pprint.PrettyPrinter(indent=4)
print(pp.pprint(contents))

## json을 DataFrame으로 변환하기 ##

#문자열을 json으로 변경
json_ob = json.loads(contents)
print(type(json_ob)) #json타입 확인

# 필요한 내용만 꺼내기
body = json_ob['response']['body']['items']
print(body)

# pandas import
import pandas as pd

# Dataframe으로 만들기
dataframe = pd.json_normalize(body)

print(dataframe)

 

마무리

1부에 이어 2부에서는 파이썬 코드로 어떻게 데이터를 불러오는지 알아보았습니다.

다른 자료들도 위의 방법을 적용하여 즐겁게 분석 하시길 바랍니다. ;-)

 

+10/14 json->dataframe으로 변환하는 코드 수정

반응형
반응형
API란?

API(Application Programming Interface)는 응용 프로그램에서 데이터를 주고받기 위한 방법을 말한다. 어떤 사이트에서 필요한 데이터를 공유받고 싶을 때 어떻게 정보를 요청(request)할지, 그리고 제공받을 수 있는 데이터의 정보에 대한 규격들을 통틀어 API라고 한다. 또한 이러한 내용을 문서화한 것을 'API 규격서'라고 한다.

 

공공데이터 포털 API 이용하기
step1. 공공데이터 포털 사이트 접속 및 로그인/회원가입
공공데이터 포털 사이트: https://www.data.go.kr

 

step2. 공공데이터 포털에서 필요한 자료 검색 및 활용 신청하기

이번 포스팅에서는 공공데이터 포털의 cctv API 자료를 신청하여 보겠다.

CCTV 오픈 API는 [인기 데이터] > 5번 [전국 CCTV표준 데이터]에서 찾을 수 있었다.

다른 필요한 자료가 있으면 그 자료를 검색해서 신청하면 된다.

화면의 우측 상단의 [활용신청]을 클릭한다.

신청하면 위와 같이 활용 목적 선택이 나오는데 해당 사항에 체크 후 간단하게 목적을 작성해 준다.

시스템 유형은 일반에 체크한다. 어떤 API는 [시스템 유형]에 [일반]/[서버 구축] 2가지가 나오는 경우가 있는데 DB를 구축할 때는 [서버 구축]에 체크해주면 된다.

상세 기능정보에 모두 체크하고 라이선스 [동의합니다]에 체크 후 활용신청을 클릭하면 된다.

그러면 신청 완료 메시지와 함께 1~2시간 후 API를 사용할 수 있다고 안내가 나간다.

데이터에 따라 1~2일 시간이 걸릴 수 있으니 이점 참고하자.

step3. 마이페이지에서 신청한 API 확인

마이페이지> 오픈 API> 개발계정에 접속하면 위와 같이 신청 승인된 CCTV표준 데이터가 나타난다.

이렇게 되면 오픈API 신청은 완료된다.

 

step4. 신청한 오픈API 사용하기

위의 CCTV 표준 데이터를 클릭하면 "개발계정 상세보기"가 아래와 같이 나타난다.

위와 같이 페이지가 나타나는데 아래 서비스 정보에서는 인증키를 확인할 수 있다.(위의 인증키가 꼭 있어야 이용 가능하다.)

인증키가 발급이 되지 않았을 때는 마이페이지> 인증키 발급현황에서 발급/재발급 가능하니 참고하자.

기본 설명에 [상세 설명]을 클릭하여 아래와 같이 요청 변수(Request Parameter) 등을 확인하자.

항목이 어떤 의미인지 명세되어 있다.

각각의 항목이 어떤 것인지를 알아야 활용이 가능하므로 숙지해 놓는 것이 좋다.

그 상태에서 아래로 스크롤을 내리면 위와 같은 샘플 코드가 나타난다. 거기서 필요한 프로그래밍 언어를 선택하면

샘플 코드가 나타나니 참고하면 된다. 아래의 '서비스 키'에 본인의 인증키를 입력하여 사용하면 된다.

 

위 샘플 코드의 url에 인증키를 넣고 미리보기를 하면 아래와 같이 내용이 나타난다.

마무리

오늘 간단히 공공데이터 오픈 API 사용법을 알아보았다.

cctv 데이터 말고도 다른 공공데이터들이 많으니 프로젝트시에 참고하면 도움이 많이 될 것 같다.

 

다음에는 네이버 API를 이용하여 크롤링하는 법을 포스팅할 예정이다.

질문은 댓글로 작성 바랍니다 :-)

반응형

+ Recent posts