전 글에서는 공공데이터 API를 사용해서 영화 데이터를 가져왔다.

이번에는 전 글의 마지막에서 말했던  '이 영화가 이러이러한 장면과 묘사 때문에 15세 등급이다.' 와 같은 정보, 즉 영화의 서술적 내용기술(서술적 묘사) 정보를 가져오자.

 

영화의 서술적 내용기술은 API에서 제공하고 있지 않지만, ors홈페이지의 등급자료조회 서비스를 사용하면 얻을 수 있다.

 

ors의 등급자료조회로 얻은 영화정보

 

 

 

 

위의 서술적 내용기술은 ors의 등급자료조회로만 얻을 수 있다.

하지만 별도의 API를 제공하고 있지 않기에, 홈페이지에서 직접 정보를 가져와야한다.

 

서술적 내용기술 정보를 얻는 방법은 다음과 같다.

 

  1. 공공데이터의 API 호출로 얻은 각 영화 데이터들의 제목과 등급번호를 페이지의 검색칸에 입력하고, 검색버튼을 누른다. 
  2. 검색결과를 클릭한다. (제목과 등급번호가 동시에 같은 영화는 존재하지 않으므로, 검색 결과는 무조건 1개만 나온다.)
  3. 검색 결과 클릭으로 나오는 페이지에서 서술적 내용기술 부분의 텍스트를 가져온다.

위의 과정을 수작업으로 할 수는 없으므로, selenium을 사용하여 자동화 한다.

 

 

ors 등급자료조회 검색 페이지

등급자료조회 검색 페이지의 url로 driver.get()함수를 실행해서 정보를 가져올 준비를 한다.

# for local
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
chrome_options.add_argument('headless')
url = 'http://ors.kmrb.or.kr/rating/inquiry_mv_list.do'

driver = webdriver.Chrome(options=chrome_options)

driver.get(url)

 

 

검색 페이지의 html 소스

검색 페이지의 html코드에서 클릭해야 할 버튼이나 가져와야 할 정보들의 xpath를 얻어 driver.findelement() 함수의 인자로 넘겨줘야 한다. 

 

 

아래의 함수는 공공데이터 API의 영화데이터를 dict type으로 넣으면 서술적 내용기술 정보를 selenium을 사용해 얻은 후, dict에 추가해서 리턴하는 함수이다.

def get_descriptive_content(dic):
    global driver

    driver.find_element(By.NAME, 'rt_no').clear()
    driver.find_element(By.NAME, 'mv_use_title').clear()
    driver.find_element(By.NAME, 'rt_no').send_keys(dic['rtNo'])
    driver.find_element(By.NAME, 'mv_use_title').send_keys(dic['useTitle'])
    driver.find_element(By.CLASS_NAME, 'btn_bottom_search').click()

    driver.find_element(By.XPATH, '/html/body/section[2]/form/div/div[3]/table/tbody/tr/td[2]/a').click()
    xpaths = driver.find_elements(By.XPATH, '/html/body/section[2]/div/table/tbody/tr')

    for xpath in xpaths:
        if xpath.text.split('\n')[0] == '줄거리,':
            if len(xpath.text.split('\n')) < 3:
                driver.find_element(By.XPATH, '/html/body/section[2]/div/div/input').click()
                dic['descriptive_content'] = ''

            else:
                text = xpath.text.split('\n')[-1]
                driver.find_element(By.XPATH, '/html/body/section[2]/div/div/input').click()
                dic['descriptive_content'] = text

            return dic

    # 만약 다른페이지로 넘어가서 descriptive_content를 가져오지 못했을 경우에는 원래 페이지로 돌아간다.
    # (성인 영상물인 경우 인증페이지로 넘어감. get_items()의 필터로 못 걸러 냈을 때를 대비하는 코드)
    global count_18
    count_18 += 1
    driver.get('http://ors.kmrb.or.kr/rating/inquiry_mv_list.do')
    return {}

 

(len(xpath.text.split('\n')) < 3: 조건문 => 2009년 이전 데이터는 서술적 내용기술 정보가 존재하지 않아서 예외처리한거)

 

이렇게 해서 공공데이터 API와 ors의 서술적 내용기술 정보를 합친 영화 데이터를 얻을 수 있다.