728x90

06.파이썬(python) 오픈api json파일 가져오기

 

요즘 많은 공공데이터들을 json파일로 공개를 하고 있습니다.

csv파일로 다운로드를 받을수 있게 해 놓는 경우도 있지만 json으로만 공개하는 경우도 많기 떄문에

파이썬을 통해 json파일을 파싱하는 법에 대해서 알아보겠습니다.

 

kobis라는 영화진흥위원회 오픈api를 파싱해 볼건데

http://www.kobis.or.kr/kobisopenapi/homepg/apiservice/searchServiceInfo.do

위 링크를 들어가면 회원가입을 해서 key값을 따로 받지 않아도 json url을 통해 접근이 가능하기 때문에

이 곳의 영화목록 데이터를 사용하겠습니다.

 

위 페이지 가장 아래쪽에 xml과 json이라고 써있는 url이 있는데 저희는 json파일을 사용할 것이기 떄문에

json에 있는 url을 복사해서 가져오겠습니다.

 

그전에 먼저 파싱에 필요한 패키지부터 import해야합니다.

import 후 movieURL에 복사해둔 url을 넣어주겠습니다. 

 

 

 

링크를 보면 여러개의 요청변수를 볼 수 있는데

저는 &openStartDt=2017&itemPerPage=40를 url뒤에 추가해줘서

2017년에 오픈한 데이터 40개를 가져와 보겠습니다.

 

json파일을 보면 파이썬의 딕셔너리 형식으로 되어 있고 파싱한 json파일을 파이썬의 딕셔너리 구조로 저장을 해주어야 합니다.

 

 

 

 

movieData를 보면 딕셔너리 형식으로 'movieListResult','source','movieList'등 여러 값들이 들어와 있는것을 확인할 수 있는데

변수들이

\uc601\ud654\uc9c4\ud765\uc704\uc6d0\ud68c 

이런식으로 이상하게 들어와 있습니다.

일단 이부분은 넘어가고 뒤에서 설명하겠습니다.

 

이제 파싱해온 movieData를 DataFrame으로 만들어 주겠습니다.

많은 변수들중 저는 movieCd, movieNm, movieNmEn, openDt, peopleNm을 가져올 거기 떄문에

이 변수이름을 가진 DataFrame을 먼저 생성하겠습니다.

 

결과값을 보면

이러한 DataFrame이 생성된 걸 확인할 수 있습니다.

 

파이썬 딕셔너리는 계층구조로 key값을 통해 value값을 얻을수 있는데

앞에 포스팅한 간단한 딕셔너리구조에 대해 이해하고 있으면 쉽게 value값을 가져올 수 있을것 입니다.

계층 구조이기 때문에 한번에 원하는 변수에 접근하기가 어렵습니다.

 

{u'movieListResult': {u'source': u'\uc601\ud654\uc9c4\ud765\uc704\uc6d0\ud68c', u'totCnt': 786, u'movieList': [{u'prdtStatNm': u'\uac1c\ubd09\uc608\uc815', u'movieCd': u'20178121', u'repNationNm': u'\uc911\uad6d', u'prdtYear': u'2015', u'directors': [], u'movieNmEn': u'Boonie Bears : Homeward Journey', u'movieNm': u'\ubd80\ub2c8\ubca0\uc5b4:\ub85c\uac70\ube45 \ucef4\ubc31\ud648 \ud504\ub85c\uc81d\ud2b8', u'openDt': u'20170629', u'repGenreNm': u'\uc560\ub2c8\uba54\uc774\uc158', u'typeNm': u'\uc7a5\ud3b8', u'nationAlt': u'\uc911\uad6d', u'companys': [], u'genreAlt': u'\uc560\ub2c8\uba54\uc774\uc158'}, {u'prdtStatNm': u'\uac1c\ubd09', u'movieCd': u'20177781', u'repNationNm': u'\uc77c\ubcf8', u'prdtYear': u'2016', u'directors': [{u'peopleNm': u'\ubaa8\ub9ac \ud788\ub370\ud1a0\ub77c'}], u'movieNmEn': u'Hentaidantituma', u'movieNm': u'\ubcc0\ud0dc\uac00 \ub41c \ub0b4 \uc544\ub0b4', u'openDt': u'20170609', u'repGenreNm': u'\uba5c\ub85c/\ub85c\ub9e8\uc2a4', u'typeNm': u'\uc7a5\ud3b8', u'nationAlt': u'\uc77c\ubcf8', u'companys': [], u'genreAlt': u'\uba5c\ub85c/\ub85c\ub9e8\uc2a4,\ub4dc\ub77c\ub9c8'}, {u'prdtStatNm': u'\uac1c\ubd09', u'movieCd': u'20177783', u'repNationNm': u'\uc77c\ubcf8', u'prdtYear': u'2016', u'directors': [{u'peopleNm': u'\uc720\ud0a4\uce58 \uc624\uce20\uce74'}], u'movieNmEn': u'FLARE', u'movieNm': u'\ud50c\ub808\uc5b4', u'openDt': u'20170609', u'repGenreNm': u'\uba5c\ub85c/\ub85c\ub9e8\uc2a4', u'typeNm': u'\uc7a5\ud3b8', u'nationAlt': u'\uc77c\ubcf8', u'companys':

 

movieIdData를 보면 위에처럼 나오는데

가장 앞에잇는 movieListResult에 접근한뒤
그 안에있는 movieList에 접근해야 합니다.

 

여기까지 보면 다음 변수들은 [{},{},{}]형식으로 movieList들이 쭉 저장되어 있는데

우선 첫번째에 있는 movieNm을 가져와보겠습니다.

 

 

이렇게 하면 결과값으로

부니베어:로거빅 컴백홈 프로젝트

가 나오는걸 볼 수 있는데 print를 안해주면 아까 위에처럼 안나오고 한글로 바뀌어 출력됩니다.

 

다음은 for문을 사용해서 가져오려던 변수값들을 한번에 쭉 가져오는 코드입니다.


 

 

마지막에 peopleNm을 if,else문으로 구분해준 이유는

api를 제공할때 모든 변수값을 100%정확히 해주는게 아니고 빠진 값들도 있기때문에

해당 값이 없을때 아무것도 넣지말라는 예외처리를 해주어야 합니다.

안해주면 movieIdData len과 어긋나면서 오류가나게 됩니다.

 

movieIDDF

를 확인해보면

 

 

 

이런식으로 쭉 입력이 된것을 확인할수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts