본문 바로가기
서비스 기획/☁️ 데이터 분석 공부

영등위 API에서 등급정보 자동으로 불러오기

by 림뽀 2022. 7. 30.
반응형

0. 영상물등급위원회 API를 사용하게 된 배경

넷플릭스를 보면, 영상을 재생하자마자 좌측 상단에 등급정보가 팝업 형태로 뜬다.

이 기능을 구현하려면 넷플릭스는 영상물별 등급정보를 따로 들고 있어야 한다.

 

넷플릭스 등급정보 이미지

 

등급 정보를 불러오기 위해 영상물등급위원회(이하 영등위)의 API를 사용하는 편이 좋다. 연령등급 외에 등급분류번호, 등급분류일자, 내용 정보(폭력성, 선정성 등)가 있으므로 모든 데이터를 수기로 입력하기 어렵기 때문이다.

 

새로 나온 영화에만 등급 정보를 붙어야 한다면 제목을 기준으로 하나씩 검색해서 붙이면 되니까 큰 문제는 없다. 그러나 많은 수의 영상 콘텐츠에 등급 정보를 붙여야 한다면, 어떻게 자동화를 할 수 있을까?

 

나는 다음과 같이 자동화할 수 있다고 생각했다. 참고로 영등위 등급분류 검색 사이트를 보면, 제목에 모든 공백을 제거하고 검색해야 모든 띄어쓰기의 경우의 수를 커버할 수 있다.

 

1. 등급정보가 필요한 콘텐츠의 제목을 가져온다.

2. 제목의 공백을 제거한다.

3. 제목을 한꺼번에 불러와서 영등위 API 검색 결과가 있는지 확인한다.

4. 검색 결과가 있는 콘텐츠만 따로 등급 정보를 붙여준다. (수동으로)

  *수동으로 하는 이유는, 서로 다른 콘텐츠가 제목만 동일한 케이스에 대응하기 위해서이다.

   감독명까지 동일한 콘텐츠는 자동으로 붙여줄 수 있지 않겠냐고 하겠지만..

   감독명도 variation이 너무 많다. ㅠㅠ 영어로 된 감독명부터 감독이 여러 명일 때 그 순서까지

 

<사용한 API>

1.  영상물등급위원회_영화 등급분류 목록

2. 영상물등급위원회_비디오물 등급분류 목록

  *영화와 비디오물 등급분류 API가 따로 존재한다. 키도 별도로 발급받아야 한다.

 

 

1. 공공데이터포털 인증키 이슈: Q&A로 직행하세요!

공공데이터포털에 공유된 API를 사용하기 위해선 인증키를 발급받아야 한다. 키를 발급받고 바로 사용할 수 있다고 생각했다면 오산이다!

 

코드를 작성하기 전에 넘어야 하는 산이 있었으니, 그 이슈는 바로 "SERVICE KEY IS NOT REGISTERED ERROR"이다. 구글링 해보니 많은 이들이 겪는 이슈로, API 인증키 디코딩이 필요하다는 자료를 발견. 그러나 unquote로 디코딩한 키를 사용했음에도 동일한 오류가 발생했다.

 

import requests
api_key_decode = requests.utils.unquote(api_key)

 

혹시 계정 동기화(?)까지 오래 걸리는 건가 해서 하루가 지난 후 시도했으나 동일한 오류 발생. 나의 문제가 아닌 것으로 판단하고 공공데이터 포털 Q&A로 직행했다.

 

Q&A를 올린 지 하루 만에 깔끔하게 처리되었다. 답변이 달린 후에는 디코딩 없이도 인증키가 정상적으로 동작한다. 혼자 끙끙대지 말고 바로 Q&A를 올릴 걸 그랬다.

 

공공데이터활용지원센터 Q&A 결과

 

 

2. 영등위 등급정보 데이터를 불러오는 파이썬 코드

파이썬으로 아래 코드를 사용하면 그 아래에 있는 이미지와 같은 데이터를 얻을 수 있다. Q&A 답변을 받은 후에는 API 키 디코딩을 하지 않아도 키가 정상을 작동한다.  "for i in range(len(content)):" 안에 불러오고 싶은 컬럼을 설정하면 된다.

 

원래는 콘텐츠 제목의 공백을 모두 제거하고 검색하려고 했으나, 그렇게 하지 않은 이유는 3번 소제목에서 조금 더 자세하게 설명하겠다.

 

#영화 API

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd 

api_key = 'gl7zlYwybE7e4hSkWYAFOiLbR%2FlmKuTyEfyTzDh8zL0oHecbK5CZWullPrn46Bvk0wlYtYC0zKCU%2F1N%2BM%2BNKZQ%3D%3D'
#api_key_decode = requests.utils.unquote(api_key)


title_inputs = ['그리고 방행자','플로리다 반점','늦봄2020','수필러브','경계, 머나먼나라','프리즌 이스케이프']
datas = []

for title_input in title_inputs:
    
    url = f'http://open.kmrb.or.kr/openapi-data/service/MvResultService/mvResult?'\
        f'serviceKey={api_key}&'\
        f'title={title_input}'

    # url 불러오기
    response = requests.get(url)
    contents = BeautifulSoup(response.text, 'lxml-xml')
    content = contents.find_all('item')

    
    for i in range(len(content)):
        grade_title = content[i].useTitle.string.strip()
        grade_id = content[i].rtNo.string.strip()
        grade_name = content[i].gradeName.string.strip()
        director = content[i].direName.string.strip()
        year = content[i].prodYear.string.strip()

        data = [title_input,grade_title,grade_id,grade_name,director,year]
        datas.append(data)

df = pd.DataFrame(datas, columns=['title_input', 'grade_title', 'grade_id', 'grade_name', 'director', 'year'])
df

 

결과


제목 여러 개를 불러오려면 제목이 포함된 csv 파일의 열을 title_inputs에 넣어주면 된다.

 

df = pd.read_csv('220721_영화_2.csv')
title_inputs = df2['제목'].values.tolist()

 

 

3. 영등위 API 사용이 어려운 이유

데이터를 여러 차례 불러본 결과, 영등위 API로 등급 정보 등록 자동화가 어렵다고 판단했다. 등급 정보를 찾을 수 있는 유일한 기준인 콘텐츠 제목 데이터가 제 멋대로이기 때문이다.

 

예를 들어,

 

영화인데도 비디오물로 검색해야 나온다던가

어떤 영화는 띄어쓰기를 해야 검색이 되고,

어떤 영화는 띄어쓰기를 제거해야 검색이 가능하다.

어떤 영화는 어디에 띄어쓰기를 해야 하는지 알 수 없다. (쉼표 뒤는 띄어 쓰고, "머나먼"과 "나라"는 붙여 쓴다.)

해외 드라마는 조금 더 심각하다. 시즌명을 붙이는 방식과 콘텐츠명을 번역하는 방식, 부제를 붙이는 방법도 모두 다르다.

영등위 홈페이지에서는 공백을 모두 제거하고 검색하면 모든 경우의 띄어쓰기에 대응할 수 있도록 설정했으나, API는 그렇지 않다. 모든 띄어쓰기가 일치해야 API로 데이터를 가져올 수 있으므로 API로는 빠른 대응이 불가능하다고 판단했다.

 

API를 제대로 사용하려면 콘텐츠 제목에 공백을 제거한 후 모든 글자의 띄어쓰기의 경우의 데이터를 만들어야 한다. 그러면 call 수가 급격하게 증가하는데, 운영 계정이 아니면 하루 call 수 제한은 1,000건이다.

 

게다가 해외 드라마의 케이스는 띄어쓰기만 정확하게 한다고 해결될 문제가 아니다. (브루클린 나인-나인 이런 건 어떡할 건데..ㅠㅠ 우리 DB에는 제목에 "-"가 없다.) 그래도 일단 API에서 영등위 사이트와 같이 모든 공백이 없는 콘텐츠명으로 검색했을 때 결과가 나올 수 있게 했더라면 일부 자동화가 가능했을 것 같은데 아쉽다.

영등위 로고

 

반응형

댓글