본문 바로가기
데이터분석/Pandas

[Python] pandas 05_kobis_api_json

by nemonemonemo 2025. 8. 19.

내가 원하는 정보/데이터가 웹 상에 존재할 때

  1. API 형태로 정보를 제공할 때
    1. JSON으로 제공
      1. json 패키지 → 파이썬 리스트/dict 자료형 변환 → 정수 인덱스, 키값 중심 : 순차 접근 ⇒ pandas의 DataFrame과 상호호환이 용이함!!!
    2. XML 으로 제공
      1. BeautifulSoup 패키지(bs4) : Tag 중심의 숏컷
  2. 그냥 웹 사이트에 존재 (사람인 vs 잡코리아 크롤링에 대한 소송~~근데 구글도 다 함)
    1. 정적인 사이트
      1. 주소가 원하는 대로 바뀜 (크롤링하기 아주 편함)
      2. 원하는 정보의 사이트가 주소가 안 보이거나, 내부에서 호출하거나 (여러 케이스가 있음) → case by case → 숨겨진 정보들을 찾아보자 ⇒ 동적으로 움직이는 것 중에서 → 셀레니움 → 브라우저를 통제 (이것마저 블락하는 경우도 있음)

내가 원하는 정보/데이터가 주어진 파일로 존재할 떄 ⇒ pandas 계열에서 다양한 파일들을 DF으로 불러들이는 것을 만들어 둠!!


기준 사이트 페이지 : kobis api --> 영화 목록

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

 

영화진흥위원회 오픈API

제공서비스 영화관입장권통합전산망이 제공하는 오픈API서비스 모음입니다. 사용 가능한 서비스를 확인하고 서비스별 인터페이스 정보를 조회합니다.

www.kobis.or.kr

 

실습 목적

  • 영화관련 정보들을 처리하려고 함!!
  • 영화 관련 정보들이 모여있는 사이트!!
  • 운이 좋게도 ,. api를 운영하고 있더라!!!
  • 나는 최신 영화의 간략한 정보들 수집!!! (영화코드, 제목, 영문제목, 장르, 개봉일 etc) ( +++ 상세 정보 : 배우, 스탭수, 세부 장르~~~)
  1. 내가 원하는 정보가 어디에 있는지 체크
    1. api 매뉴얼/사이트 정보
      1. 직접 찾아가면서 체크해야함
      2. 영화목록요청 api에 있었다
  2. 내가 좀 더 구체적으로 요청할 수 있는 사항들이 있는지 체크 (요청 인터페이스 쪽을 체크!!!)

⇒ 지금 시점의 최신 영화 목록을 요청하려고 함

  • 한 번에 50개 정도를 요청하고 싶다!

  • 메뉴얼 요청인터페이스 : item

⇒ 기본 작성 항목 : key + 요청할 사항 추가

  1. 코드 상에서 http 통신 ⇒ kobis api 서버에 2번 요청사항을 보내야함
    1. http통신 파이썬 패키지 : urllib, requests etc
    2. ++ 요청하려는 상황에 대한 주소를 기록해서 보내면 됨!!!
  2. 요청해서 받은 정보 JSON을 편하게 접근하기 위해서 json 패키지 사용
    1. 접근 : 정수인덱스, 키값
  3. pandas의 DataFrame에 잘 담아두겠습니다
#필요한 패키지 
import pandas as pd
import urllib.request # 파이썬에 있는 대표적인 http 통신용 패키지 중 하나
import json # <- json 양식에 맞는 문자열 데이터 --> 파이썬 list/dict 변환
#++정규식, 날짜 등

Step1) 내가 필요한 정보들을 요청할 주소 생성!!

  • 매뉴얼을 보면서 .. 웹 브라우저 test
  • get 방식 : 주소에 직접 요청할 사항들을 다 기록해서 전달
  • baseurl?요청파라미터=요청할값&요청파라미터2=요청할값2&~~~
# 기본 주소 : json으로 주세요~~
url_p1 = " <http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json>"
# 필수항목 : key
key = "84f5fd2eb892d013291cc10dcba3f787" # <--- 본인 key사용하면 됨
# +++ option) itemPerPage ==> 50개 요청!!!
url_p2 = "50"
# ===> 위의 요청사항을 기반으로 요청할 url을 완성!!!!
url = url_p1 + "?key=" + key + "&itemPerPage=" + url_p2
url
# <http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=84f5fd2eb892d013291cc10dcba3f787&itemPerPage=50>

# *** 주의사항 *** 50개를 요청한다고,,,,,꼭 50개가 온다는 보장은 없음!!!
# ==> 항상 받고나서 체크해야함!!!
  • 메뉴얼 요청인터페이스 : item

⇒ 기본 작성 항목 : key + 요청할 사항 추가

  1. 코드 상에서 http 통신 ⇒ kobis api 서버에 2번 요청사항을 보내야함
    1. http통신 파이썬 패키지 : urllib, requests etc
    2. ++ 요청하려는 상황에 대한 주소를 기록해서 보내면 됨!!!
  2. 요청해서 받은 정보 JSON을 편하게 접근하기 위해서 json 패키지 사용
    1. 접근 : 정수인덱스, 키값
  3. pandas의 DataFrame에 잘 담아두겠습니다
#필요한 패키지 
import pandas as pd
import urllib.request # 파이썬에 있는 대표적인 http 통신용 패키지 중 하나
import json # <- json 양식에 맞는 문자열 데이터 --> 파이썬 list/dict 변환
#++정규식, 날짜 등

Step1) 내가 필요한 정보들을 요청할 주소 생성!!

  • 매뉴얼을 보면서 .. 웹 브라우저 test
  • get 방식 : 주소에 직접 요청할 사항들을 다 기록해서 전달
  • baseurl?요청파라미터=요청할값&요청파라미터2=요청할값2&~~~
# 기본 주소 : json으로 주세요~~
url_p1 = " <http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json>"
# 필수항목 : key
key = "84f5fd2eb892d013291cc10dcba3f787" # <--- 본인 key사용하면 됨
# +++ option) itemPerPage ==> 50개 요청!!!
url_p2 = "50"
# ===> 위의 요청사항을 기반으로 요청할 url을 완성!!!!
url = url_p1 + "?key=" + key + "&itemPerPage=" + url_p2
url
# <http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=84f5fd2eb892d013291cc10dcba3f787&itemPerPage=50>

# *** 주의사항 *** 50개를 요청한다고,,,,,꼭 50개가 온다는 보장은 없음!!!
# ==> 항상 받고나서 체크해야함!!!
type(movie_data)
#dict

movie_data.keys()
#dict_keys(['movieListResult'])
type(movie_data)
#dict

movie_data.keys()
#dict_keys(['movieListResult'])
movie_data["movieListResult"]
type(movie_data["movieListResult"])
#dict 
movie_data["movieListResult"].keys()
#dict_keys(['totCnt', 'source', 'movieList'])
type(movie_data["movieListResult"]["movieList"])
#list
# --> 내가 요청해서 받은 영화 정보 중에서 처음 영화에 대한 정보
movie_data["movieListResult"]["movieList"][0]
#{'movieCd': '2025A733',
 #'movieNm': '울 엄마는 마피아',
 #'movieNmEn': 'Mafia Mamma',
 #'prdtYear': '2023',
 #'openDt': '',
 #'typeNm': '장편',
 #'prdtStatNm': '기타',
 #'nationAlt': '영국',
 #'genreAlt': '코미디,액션',
 #'repNationNm': '영국',
 #'repGenreNm': '코미디',
 #'directors': [{'peopleNm': '캐서린 하드윅'}],
 #'companys': []}
 
 
 #본인이 요청한 영화정보에 대한 결과를 가지고
# Q-1) 1번 영화에 대한 정보 덩어리를 출력해보세요
m1 = movie_data["movieListResult"]["movieList"][0]
m1
#{'movieCd': '2025A733',
 #'movieNm': '울 엄마는 마피아',
 #'movieNmEn': 'Mafia Mamma',
 #'prdtYear': '2023',
 #'openDt': '',
 #'typeNm': '장편',
 #'prdtStatNm': '기타',
 #'nationAlt': '영국',
 #'genreAlt': '코미디,액션',
 #'repNationNm': '영국',
 #'repGenreNm': '코미디',
 #'directors': [{'peopleNm': '캐서린 하드윅'}],
 #'companys': []}

# Q-2) 1번 영화의 영화코드값을 출력해보세요
#movie_data["movieListResult"]["movieList"][0]['movieCd']
m1['movieCd']
#2025A733

# Q-3) 1번 영화의 제목(국문)을 출력해보세요
#movie_data["movieListResult"]["movieList"][0]['movieNm']
m1['movieNm']
#울 엄마는 마피아

# Q-4) 1번 영화의 제목 (영문)을 출력해보세요
#movie_data["movieListResult"]["movieList"][0]['movieNmEn']
m1['movieNmEn']
#Mafia Mamma

# Q-5) 1번 영화의 개봉일을 출력해보세요
#movie_data["movieListResult"]["movieList"][0]['openDt']
m1['openDt']
#''

# Q-6) 1번 영화의 감독에 대한 정보가 있다면/ 처음 나온 감독의 이름만 출력해보세요
#movie_data["movieListResult"]["movieList"][0]['directors'][0]['peopleNm']
m1['directors'][0]['peopleNm']
#'캐서린 하드윅'

# Q-7) 하다가 에러가 발생한다면 어떻게 해야할까
# ===> 1번 영화에 대한 위의 코드~~감독까지 출력!!
# ===> 2번 영화에 대한 위의 코드~~감독까지 출력!!
# ===> 3번 영화에 대한 위의 코드~~감독까지 출력!!
# ... 규칙이 보인다!!!!

# 1번
print(movie_data["movieListResult"]["movieList"][0]["movieCd"])
print(movie_data["movieListResult"]["movieList"][0]["movieNm"])
print(movie_data["movieListResult"]["movieList"][0]["movieNmEn"])
print(movie_data["movieListResult"]["movieList"][0]["openDt"])
print(movie_data["movieListResult"]["movieList"][0]["directors"][0]["peopleNm"])

# 2번
print(movie_data["movieListResult"]["movieList"][1]["movieCd"])
print(movie_data["movieListResult"]["movieList"][1]["movieNm"])
print(movie_data["movieListResult"]["movieList"][1]["movieNmEn"])
print(movie_data["movieListResult"]["movieList"][1]["openDt"])
print(movie_data["movieListResult"]["movieList"][1]["directors"][0]["peopleNm"]) #오류남 왜? 밑에서 보자

if movie_data["movieListResult"]["movieList"][1]["directors"] == []:
    print("감독이름 없음")
else:
    print(movie_data["movieListResult"]["movieList"][1]["directors"][0]["peopleNm"])
#감독이름 없음

# 1번
print(movie_data["movieListResult"]["movieList"][0]["movieCd"])
print(movie_data["movieListResult"]["movieList"][0]["movieNm"])
print(movie_data["movieListResult"]["movieList"][0]["movieNmEn"])
print(movie_data["movieListResult"]["movieList"][0]["openDt"])
print(movie_data["movieListResult"]["movieList"][0]["directors"][0]["peopleNm"])

print("*"*50)

# 2번
print(movie_data["movieListResult"]["movieList"][1]["movieCd"])
print(movie_data["movieListResult"]["movieList"][1]["movieNm"])
print(movie_data["movieListResult"]["movieList"][1]["movieNmEn"])
print(movie_data["movieListResult"]["movieList"][1]["openDt"])
if movie_data["movieListResult"]["movieList"][1]["directors"] == []:
    print("감독이름 없음")
else:
    print(movie_data["movieListResult"]["movieList"][1]["directors"][0]["peopleNm"])

print("*"*50)

# 3번째 영화
print(movie_data["movieListResult"]["movieList"][2]["movieCd"])
print(movie_data["movieListResult"]["movieList"][2]["movieNm"])
print(movie_data["movieListResult"]["movieList"][2]["movieNmEn"])
print(movie_data["movieListResult"]["movieList"][2]["openDt"])
if movie_data["movieListResult"]["movieList"][2]["directors"] ==[]:
    print("감독이름없음!!")
else:
    print(movie_data["movieListResult"]["movieList"][2]["directors"][0]["peopleNm"])
 #2025A733
#울 엄마는 마피아
#Mafia Mamma
#3
#캐서린 하드윅
#**************************************************
#20257127
#쉬운 여자 - 먼저 벌린 여친의 친구
#
#
#감독이름 없음
#**************************************************
#20257150
#음란한 옆집 미시 - 가랑이에서 들려온 야한 신음
#
#
#감독이름없음!!

# Q) 본인이 받은 50개 영화에 대해서 코드~~감독까지 다 출력해보세요!!!
# ==> for문 사용해서 롤링~~~ 필요한 값 0~49 : 영화갯수
tot_cnt = len(movie_data["movieListResult"]["movieList"])
for i in range(tot_cnt):
    print(movie_data["movieListResult"]["movieList"][i]["movieCd"])
    print(movie_data["movieListResult"]["movieList"][i]["movieNm"])
    print(movie_data["movieListResult"]["movieList"][i]["movieNmEn"])
    print(movie_data["movieListResult"]["movieList"][i]["openDt"])
    if movie_data["movieListResult"]["movieList"][i]["directors"] ==[]:
        print("감독이름없음!!")
    else:
        print(movie_data["movieListResult"]["movieList"][i]["directors"][0]["peopleNm"])
    print("*"*50)
    
    
    
    
# 수정 : 데이터 수집/ 처리 ==> 1개 데이터/샘플 단위로!!!!!! ****
tot_cnt = len(movie_data["movieListResult"]["movieList"])
for i in range(tot_cnt):
    # i번째 영화에 대한 정보 temp
    temp = movie_data["movieListResult"]["movieList"][i]
    print(temp["movieCd"])
    print(temp["movieNm"])
    print(temp["movieNmEn"])
    print(temp["openDt"])
    if temp["directors"] ==[]:
        print("감독이름없음!!")
    else:
        print(temp["directors"][0]["peopleNm"])
    print("*"*50)
  • 위의 과정은 개별 영화에 대한 정보를 접근 & 출력을 하고 땡
    • 개별 정보에 대한 접근이 규칙을 제대로 했는지 체크
      • 에러 처리
  • 이 정보를 담아두자
    • DataFrame에 담아두자 → 좀 무거운 느낌이 있음 : 가볍게 필요한 정보들만 추려서 핸들링을 하자 (리스트, deque, dict 등…)
    • 나중에는 한 번에 DF로 변경할 수도 있음
'''
tot_data= [
                [ 2025A733, 울 엄마는 마피아 , 장편,],
                [ 20257127, 쉬운 여자 - 먼저 벌린 여친의 친구, 장편],
                [],...
]
#=> 2차원에 대한 유사 표현
# + dict, deque etc
tot_data = [
    {"movieCd":2025A733, "title":"울 엄마는 마피아"},
    {"movieCd":20257127, "title":"쉬운 여자 - 먼저 벌린 여친의 친구"},
    ....
]
# ==> DataFrame 변환이 용이함
'''

# tot_cnt = len(movie_data["movieListResult"]["movieList"])
for  idx, data in enumerate(movie_data["movieListResult"]["movieList"]):
    print(idx)
    print(data)
    print("*"*60)
'''
0
{'movieCd': '2025A733', 'movieNm': '울 엄마는 마피아', 'movieNmEn': 'Mafia Mamma', 'prdtYear': '2023', 'openDt': '', 'typeNm': '장편', 'prdtStatNm': '기타', 'nationAlt': '영국', 'genreAlt': '코미디,액션', 'repNationNm': '영국', 'repGenreNm': '코미디', 'directors': [{'peopleNm': '캐서린 하드윅'}], 'companys': []}
************************************************************
1
{'movieCd': '20257127', 'movieNm': '쉬운 여자 - 먼저 벌린 여친의 친구', 'movieNmEn': '', 'prdtYear': '2023', 'openDt': '', 'typeNm': '장편', 'prdtStatNm': '기타', 'nationAlt': '일본', 'genreAlt': '성인물(에로)', 'repNationNm': '일본', 'repGenreNm': '성인물(에로)', 'directors': [], 'companys': []}
************************************************************
2
{'movieCd': '20257150', 'movieNm': '음란한 옆집 미시 - 가랑이에서 들려온 야한 신음', 'movieNmEn': '', 'prdtYear': '2023', 'openDt': '', 'typeNm': '장편', 'prdtStatNm': '기타', 'nationAlt': '일본', 'genreAlt': '성인물(에로)', 'repNationNm': '일본', 'repGenreNm': '성인물(에로)', 'directors': [], 'companys': []}
************************************************************
3
{'movieCd': '20257151', 'movieNm': '유부녀 섹파 - 다시 벌려준 허벅지', 'movieNmEn': '', 'prdtYear': '2023', 'openDt': '', 'typeNm': '장편', 'prdtStatNm': '기타', 'nationAlt': '일본', 'genreAlt': '성인물(에로)', 'repNationNm': '일본', 'repGenreNm': '성인물(에로)', 'directors': [], 'companys': []}
************************************************************
4
{'movieCd': '20257152', 'movieNm': '젖은 변태녀 - 야근마다 벌어지는 가랑이', 'movieNmEn': '', 'prdtYear': '2023', 'openDt': '', 'typeNm': '장편', 'prdtStatNm': '기타', 'nationAlt': '일본', 'genreAlt': '성인물(에로)', 'repNationNm': '일본', 'repGenreNm': '성인물(에로)', 'directors': [], 'companys': []}
************************************************************
5
{'movieCd': '20249318', 'movieNm': '챌린저스', 'movieNmEn': 'Challengers', 'prdtYear': '2024', 'openDt': '20240424', 'typeNm': '장편', 'prdtStatNm': '개봉', 'nationAlt': '미국', 'genreAlt': '드라마,멜로/로맨스', 'repNationNm': '미국', 'repGenreNm': '드라마', 'directors': [{'peopleNm': '루카 구아다니노'}], 'companys': []}
************************************************************
......
'''

# 할 일 : 위의 정보들을 DF에 담아보자!!!
# ===> 방법1) list계열에서 처리하고자 함!!! ( deque)
#             + 오/열 맞춰야 함!!!!!( 2차원 DF으로 변경!!)

tot_data = [] # --> 개별 원소를 리스트로 담아서, 전체를 리스트 포장 2D
for  idx, data in enumerate(movie_data["movieListResult"]["movieList"]):
    # data : 개별 영화 정보 dict
    # idx  : 정수 인덱스,,,
    i_code = data["movieCd"]
    i_name = data["movieNm"]
    i_name_e = data["movieNmEn"]
    i_day    = data["openDt"]
    if data["directors"] ==[]:
        i_dir = ""
    else:
        i_dir = data["directors"][0]["peopleNm"]
    # --> i번째 영화에 대한 필요한 정보 추출 & 변수화
    #==> 이것들을 모아서 담아야함
    tot_data.append([i_code,i_name,i_name_e,i_day,i_dir])
print("Done!")

tot_data
'''
[['20030047', '모노노케 히메', 'Princess Mononoke', '20030425', '미야자키 하야오'],
 ['20257037', '가족의 비밀', 'Family Secrets', '20250910', '이상훈'],
 ['20246333', '3670', '3670', '20250903', '박준호'],
 ['20256706', '섹스에 중독된 소녀 그리고 유부녀-무삭제', '', '', '성기만'],
 ['20240549',
  '베르메르: 위대한 전시회',
  'Vermeer: The Greatest Exhibition',
  '20250917',
  '데이비드 비커스태프'],
 ['20256883', '썸머 블루 아워', 'Summer Blue Hour', '', ''],
 ['20257161', '국보', 'KOKUHO', '', '이상일'],
 ['20256742', '일대무사', '100 YARDS', '', ''],
 ['20257095', '명탐정 코난: 17년 전의 진상', 'Detective Conan', '', '야마모토 야스이치로'],
 ['20228988', '보스', 'BOSS', '', '라희찬'],
 ['20233039', '살인자 리포트', 'MURDER REPORT', '20250905', '조영준'],
 ['20256526',
  '브레드이발소: 베이커리타운의 악당들',
  'Bread Barbershop : The Bakerytown Baddies',
  '20250927',
  '정지환'],
 ['20241102', '홍이', 'Red Nails', '', '황슬기'],
 ['20247429', '세계의 주인', 'The World of Love', '', '윤가은'],
 ....
'''

#위의 정보를 2차원에 오와 열이 맞춰져 있으므로 => 2차원 DF로  택갈이하자
movie_df = pd.DataFrame(
    data = tot_data,
    columns = ["movieCd", "movieTitle", "movieETitle","openDay","DirName"]
)
movie_df.head(10)

movie_df.tail(10)

### 개별 영화 정보 dict --> 모아두는 것은 [] 전체 리스트로 담자!!!
# 할 일 : 위의 정보들을 DF에 담아보자!!!
tot_data = [] # --> 개별 원소를 리스트로 담아서, 전체를 리스트 포장 2D
for  idx, data in enumerate(movie_data["movieListResult"]["movieList"]):
    # data : 개별 영화 정보 dict
    # idx  : 정수 인덱스,,,
    i_code = data["movieCd"]
    i_name = data["movieNm"]
    i_name_e = data["movieNmEn"]
    i_day    = data["openDt"]
    if data["directors"] ==[]:
        i_dir = ""
    else:
        i_dir = data["directors"][0]["peopleNm"]
    #---> i번쨰 영화에 대한 필요한 정보 추출!!!& 변수화!!
    # ===>  Dict 포장!!!
    tot_data.append( {"movieCd":i_code, "movieTitle":i_name,
                      "movieETitle":i_name_e, "openDay":i_day,
                      "DirName":i_dir})
print("Done!!")

이제 후처리를 해보자

  1. 개봉일에 대한 정보를 바탕으로 → 년/월/일 컬럼을 추가 ⇒ 생성해보자
  2. movieCd 컬럼의 값/의미를 보니 → 코드값/키값/인덱스로 지정해도 될 듯? ⇒유니크한 값들인지 체크.. 유니크하다면? ⇒⇒ DF에서 가로(개별 영화에 대한 접근 우회) 인덱스 하자
"20240424"[:4]
#2024

"20240424"[4:6]
#04

"20240424"[6:]
#24
movie_df.loc[:,"openDay"].apply( lambda x : x[:4])

movie_df["year"] = movie_df.loc[:,"openDay"].apply( lambda x : x[:4])
movie_df["month"] = movie_df.loc[:,"openDay"].apply( lambda x : x[4:6])
movie_df["day"] = movie_df.loc[:,"openDay"].apply( lambda x : x[6:])
movie_df.head(3)
movie_df.head(10)
movie_df.head(3)
# --> movieCd 컬럼의 값들이 유니크한지 체크
# ===> DF의 가로줄 index로 부여하려고 하기에
len(movie_df.loc[:,"movieCd"].unique()) == len(movie_df) #movieCd 중첩 없으므로 pk로 쓸 수 있겠다
#True
#기존 컬럼을 DF의 가로줄 인덱스 지정 :set_index
movie_df.set_index("movieCd")
movie_df.set_index("movieCd", inplace = True)
movie_df.head()
#DF에서 FM적으로 1번 영화에 대한 정보를 접근해보자
movie_df.iloc[0,:]
'''
	            2025A733
movieTitle	 울 엄마는 마피아
movieETitle	 Mafia Mamma
openDay	
DirName	     캐서린 하드윅
year	
month	
day	

dtype: object
'''

movie_df.loc["2025A733", : ]
'''
	            2025A733
movieTitle	 울 엄마는 마피아
movieETitle	 Mafia Mamma
openDay	
DirName	     캐서린 하드윅
year	
month	
day	

dtype: object
'''

참고) 지금까지 수집한 정보를 일단 저장을 해두고 싶다

  • 로컬 파일에 저장→ 파일) csv, excel, ….
    • csv : 값 + 구분자
    • excel : 값 + 양식/꾸밈

참고) colab에서 하고 있어서 일단 여기에 저장을 하겠다

/content/sample_data
#colab은 운영체제가 윈도우 아니고 리눅스
# ==> 리눅스때매 한글에서 문제가 발생할 수 있음(mac과 윈도우 왔다갔다해도 그럼 )
# 윈도우쪽 한글 : cp949
# 리눅스 : utf-8

movie_df.iloc[:-1,:].to_csv('/content/kobis_api.csv', sep='@',encoding="cp949")

movie_df.iloc[:-1,:].to_csv('/content/kobis_api_utf-8.csv', sep='@',encoding="utf-8")

#csv 파일을 불러들이는 방법
#pd.read_csv()
temp_df = pd.read_csv('/content/kobis_api_utf-8.csv',
                      sep ="@", encoding = "utf-8")
temp_df.head()ㄴ
#excel로 내보내기
movie_df.to_excel('/content/kobis_api_excel.xlsx')
#-> 이상 없이 엑셀 잘 열린다

#++ 실제 나중에서는 DB에 직접 올리거나 처리하는 경우도 있음

하고자하는 추가 작업

  • 앞에서 한 50개 영화에 대한 상세 정보 추가 ⇒ 세로/옆으로 확장! 속성을 추가하자
    1. 장르에 대한 정보 추가 (1번 장르만 하자,,정의, 없으면 빈칸)
    1. 출연한 배우의 수 추가 (없으면 0)
    1. 출연한 배우 중에서 1번 배우가 있다면 → 메인 배우에 대해서 배역 이름, 배우의 이름 (없으면 빈칸)
  • ⇒⇒ kobis API의 영화상세정보에서,,,,

개별 영화에 대한 상세 정보 제공하는 기능

  • 본인 key 정보 + 요청하려는 영화 코드값
movie_df

#개별 영화에 대한 상세 정보 제공하는 기능 
# ==> 영화 상세정보 : 개별 영화에 대한 상세정보 

# test : 20124079  ==> 광해 영화에 대해서 체크!!!!
base_url = "<http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.json>"
# key, movieCd
key="84f5fd2eb892d013291cc10dcba3f787"
movieCd = "20124079"
# url
url = base_url+"?key="+key+"&movieCd="+movieCd
url
##<http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.json?key=84f5fd2eb892d013291cc10dcba3f787&movieCd=20124079>

# --> 위의 요청에 대한 사항을 직접 파이썬에서 요청해서 받아보세요!!!
res = urllib.request.urlopen( url )
temp_data = json.loads( res.read().decode("utf-8"))
temp_data

type(temp_data)

temp_data.keys()

temp_data["movieInfoResult"]["movieInfo"].keys()

## 광해 영화에 대해서 상세정보를 출력을 해보세요!!
# Q1) 장르에 대한 정보를 출력해보세요!! --> generes : 여러개 면 맨 처음
# Q2) 출연한 배우의 수
# Q3) 배우 정보가 있다면 1번 배우의 이름을 출력
# Q4) 배우 정보가 있다면 1번 배우의 배역을 출력

# Q1) 장르에 대한 정보를 출력해보세요!! --> generes : 여러개 면 맨 처음
temp_data["movieInfoResult"]["movieInfo"]["genres"]
##[{'genreNm': '사극'}, {'genreNm': '드라마'}]

temp_data["movieInfoResult"]["movieInfo"]["genres"][0]["genreNm"]
##사극

# Q2) 출연한 배우의 수
type(temp_data["movieInfoResult"]["movieInfo"]["actors"])
##list
len(temp_data["movieInfoResult"]["movieInfo"]["actors"])
##36

# Q3) 배우 정보가 있다면 1번 배우의 이름을 출력
temp_data["movieInfoResult"]["movieInfo"]["actors"][0]
##{'peopleNm': '이병헌',
## 'peopleNmEn': 'LEE Byung-hun',
## 'cast': '광해/하선',
## 'castEn': ''}

temp_data["movieInfoResult"]["movieInfo"]["actors"][0]["peopleNm"]
##이병헌

# Q4) 배우 정보가 있다면 1번 배우의 배역을 출력 
temp_data["movieInfoResult"]["movieInfo"]["actors"][0]["cast"]
##광해/하선

# 추가적인 상세 정보를 DF에 확장하고 싶다!!!
# ==> 기존 DF에 추가정보 기록할 공간을 만들려고 함!!
# ---> 1번 장르 이름, 배우 수, 1번 배우 이름/배역
movie_df["Gen"]=""
movie_df["ActNum"]=""
movie_df["ActName"]=""
movie_df["ActCast"]=""
movie_df.head()

# Step1)  지금 개인별로 수집한 영화  DF에서
#          --> i번째 영화에 대한 상세 정보 요청하는 url (json)
#     2)   요청하고--> 받고 --> 필요 정보 추출!!
#     3)   기존 DF에 기록!

for i in movie_df.index:
    print(i)
#20030047
#20257037
#20246333
#20256706
#20240549
#20256883
#20257161
#  ...

base_url = "<http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.json>"
key="84f5fd2eb892d013291cc10dcba3f787"

for i in movie_df.index:
    #i번째 영화에 대한 상세 정보를 요청하는 url 생성
    url = base_url +"?key="+key +"&movieCd="+ str(i)
    #통신작업
    temp_res = urllib.request.urlopen(url)
    temp_data = json.loads(temp_res.read().decode("utf-8"))
    # --> temp_data에는 i번째 영화의 상세 정보가 담겨있음
    # 1) 장르
    if temp_data["movieInfoResult"]["movieInfo"]["genres"] != []:
        print(temp_data["movieInfoResult"]["movieInfo"]["genres"][0]["genreNm"])
    else:
        print("장르X")
    # 2) 배우수 --> 배우에 대한 정보가 있다면 무조건 1명 이상은 존재!!!
    if temp_data["movieInfoResult"]["movieInfo"]["actors"] != []:
        print( len( temp_data["movieInfoResult"]["movieInfo"]["actors"] ))
        print( temp_data["movieInfoResult"]["movieInfo"]["actors"][0]["peopleNm"])
        print( temp_data["movieInfoResult"]["movieInfo"]["actors"][0]["cast"])
    else:
        print("배우 정보 X")
        print("1번 배우 없음!")
        print("1번 배우 배역 없음!")
    print("*"*80)
print("Done!!")
#얘는 왜 돌아가면서 하나씩 띡띡 올라오냐?
# 서버에 계속 요청하는 것임
#실제로 사이트에서 긁어올 때는 이러면 차단 당함, 이러면 안 됨 

#import time -> time.sleep() 사용을 위해 임포트 
###이제 df에 담아보자 
base_url = "<http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.json>"
key="84f5fd2eb892d013291cc10dcba3f787"

for i in movie_df.index:
    # i번째 영화에 대한 상세 정보를 요청하는  url 생성!!
    url = base_url +"?key="+key +"&movieCd="+ str(i)
    # 통신 작업
    temp_res = urllib.request.urlopen(url)
    temp_data = json.loads(temp_res.read().decode("utf-8") )
    # --> temp_data에는 i번째 영화의 상세 정보가 담겨!!!
    # 1) 장르
    if temp_data["movieInfoResult"]["movieInfo"]["genres"] != []:
        movie_df.at[i, "Gen"] = temp_data["movieInfoResult"]["movieInfo"]["genres"][0]["genreNm"]
        #print(temp_data["movieInfoResult"]["movieInfo"]["genres"][0]["genreNm"])
    else:
        movie_df.at[i, "Gen"] = "X"
        #print("장르X")
    # 2) 배우수 --> 배우에 대한 정보가 있다면 무조건 1명 이상은 존재!!!
    if temp_data["movieInfoResult"]["movieInfo"]["actors"] != []:
        movie_df.at[i,"ActNum"] = len( temp_data["movieInfoResult"]["movieInfo"]["actors"] )
        movie_df.at[i,"ActName"] = temp_data["movieInfoResult"]["movieInfo"]["actors"][0]["peopleNm"]
        movie_df.at[i,"ActCast"] = temp_data["movieInfoResult"]["movieInfo"]["actors"][0]["cast"]
        #print( len( temp_data["movieInfoResult"]["movieInfo"]["actors"] ))
        #print( temp_data["movieInfoResult"]["movieInfo"]["actors"][0]["peopleNm"])
        #print( temp_data["movieInfoResult"]["movieInfo"]["actors"][0]["cast"])
    else:
        movie_df.at[i,"ActNum"] = "0"
        movie_df.at[i,"ActName"] = "X"
        movie_df.at[i,"ActCast"]  ="X"
        #print("배우 정보 X")
        #print("1번 배우 없음!")
        #print("1번 배우 배역 없음!")
    print("*"*80)
    #time.sleep(2) #보통 데이터 불러올 때 이거 안 하면 블락 당하거나 서버 다운될지도... 
print("Done!!")

movie_df #잘 만들어졌나 확인