노트1/Python

[Python] 공공데이터 포털의 OPEN API 사용법 (xml > 데이터프레임 변환, xmltodict)

Paige09 2021. 12. 10. 17:10

 

 

활용신청을 하고 나면 아래와 같은 창이 뜨는데,

오픈 API를 처음 사용할 때는 이 창을 무시하고 닫아버려서 '왜 계속 오류가 나지?' 했었다.

팝업창을 습관적으로 닫아버려서 놓친 부분.

 

 

마이페이지에서 '승인되어 활용 중인 단계'로 조회되고, 인증키가 보이더라도 활용신청 직후에는 이용이 어려울 수 있다.

안내된 대로 최소 1시간에서 24시간 이후 이용할 수 있다.

 

 

 

 

다음으로 상세설명 페이지 하단의 샘플 코드를 참고.

 

 

 

 

인증키 위치 :  마이페이지 > 개발계정 > 상세페이지 내 '서비스 정보'

인코딩 인증키로 실행해서 오류가 나면 디코딩 인증키로 시도.

 

 

import requests
import xmltodict

url = 'http://www.culture.go.kr/openapi/rest/publicperformancedisplays/period'
params ={'serviceKey' : '발급받은 인증키',
         'CallBackURI' : '',
         'MsgBody' : '',
         'from' : '20210101',
         'to' : '20211201'}
response = requests.get(url, params=params).content
xmlObj = xmltodict.parse(response)
# print(xmlObj)

 

참고)

서버에 HTTP 요청을 보내고(urllib/requests) Response에 접근하기(requests.content/requests.text)

 

 

 

처음 API를 공부하려고 보던 가이드 글에는

xml 문서는 <item>안에 각 값이 태그 형식<>으로 들어 있습니다.

이 점을 이용해 뷰티플수프를 이용하여 파싱 해보도록 하겠습니다.

라고 적혀있었는데....

 

<item>이 없는데요??? 8ㅅ8

 

... 다시 구글링 해보고

https://tosuccess.tistory.com/150 글을 참고해서 시도했다.

xmltodict 라이브러리 이용.

 

 

allData = xmlObj['response']['msgBody']['perforList']
print(allData)

 

allData 

allData[0] 

allData[0].items() 출력해보면서 내용 파악.

 

 

 

이제 데이터프레임으로 변환하기.

 

import pandas as pd

df_cols = []
for key, val in allData[0].items():
    df_cols.append(key)

print(df_cols) #컬럼 확인

 

컬럼은 데이터포털 페이지에서도 확인 가능.

 

df_rows = {}
out_df = []
out_df = pd.DataFrame(out_df, columns=df_cols)

for i in range(len(allData)):
    for key, val in allData[i].items():
        df_rows[key] = val
    out_df = out_df.append(df_rows, ignore_index=True)

print(out_df)
out_df = out_df.drop(columns = ['thumbnail','gpsX','gpsY'])
print(out_df) # 보고싶은 컬럼만
# csv 저장하려면
out_df.to_csv('파일명.csv', encoding='utf-8')