본문 바로가기
Programming/Python

[Python] 파이썬 영화 사이트 (씨네21) 크롤링

by 코딩하는 금융인 2021. 5. 31.

안녕하세요. 코딩하는 금융인입니다.
오늘은 과거 제가 진행했던 영화 데이터 프로젝트에서 데이터 수집 과정에서 제가 사용했던 크롤링 방식을 소개해드리고자 합니다.

데이터 분석에서 가장 중요한 부분이 무엇이라고 한다면, 많이들 데이터 수집 그리고 전처리 과정이 빠지지 않고 언급됩니다. 아무리 훌륭한 분석툴과 기법을 가지고 있더라도 잘못된 수집, 전처리 과정을 거친 데이터는 잘못된 분석으로 이끌기에 정확한 수집, 전처리 능력은 데이터 분석가로서 필수 역량입니다.

주로 저는 웹사이트 관련된 코딩 업무를 할 때, 속도면에서 중요하지 않다면 자동화 과정을 볼 수 있는 파이썬 selenium을 주로 사용하고 빠르게 처리해야 한다면 requests를 주로 사용합니다. 물론, 두 가지 다 사용하는 경우가 많고 html을 다뤄야할 때는 거의 무조건 BeatifulSoup을 사용합니다.

데이터 목표

당시 저는 영화 관련 app 프로젝트를 진행하고 있었는데, 영화에 대한 평점 분석을 위한 데이터를 추출하고 전처리하는 업무를 맡았습니다. 영화 평점은 네이버, 다음 등 다양한 사이트가 있지만, 전문가의 평점과 이에 대한 상세내용이 필요하다고 판단하여 씨네21이라는 영화 평점 사이트에서 평론가에 대한 데이터를 뽑아내는 작업을 수행했습니다.

또한, 영화에 대한 상세 데이터도 나중에 필요하다고 생각되어 평론가들이 평점을 매긴 영화들에 대한 상세 데이터도 추출하는 작업을 진행했습니다.

데이터 작업

목표 사이트 : cine21

▶ 1차 크롤링 작업
1차적으로 씨네21에 등록된 평론가들 리스트와 링크 데이터가 필요하여 추출했습니다.

▶ #1 Python Code

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd
from bs4 import BeautifulSoup
from selenium.common.exceptions import NoSuchElementException
from tqdm import tqdm
import time

options = webdriver.ChromeOptions()
options.add_argument("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36") # 네트워크 설정
options.add_argument("lang=ko_KR") # 사이트 주언어

driver = webdriver.Chrome(ChromeDriverManager().install(),chrome_options=options)

# 1차 목표 : 씨네21 영화별점 페이지에서 평론가들과 해당 평론가에 대한 링크 뽑아내기

driver.get("http://www.cine21.com/movie/point/writer")
data_list = []

for i in range(1,83):
    if i == 5 or i == 12:
        continue
    print(i)
    kr_c_link = driver.find_element_by_css_selector(f"#content > ul.writer_list > li:nth-child({i}) > a").get_attribute("href")
    kr_c_name = driver.find_element_by_css_selector(f"#content > ul.writer_list > li:nth-child({i}) > div > p.name").text
    data = {"kr_c_link":kr_c_link, "kr_c_name" : kr_c_name}
    data_list.append(data)

driver.close()

result_df = pd.DataFrame(data_list, columns=['kr_c_link','kr_c_name'])
result_df.to_excel(f'C:/RealData/result_data01.xlsx', index=False)

처음에는 과정을 보고 싶어서 selenium의 webdriver를 활용해서 진행했습니다.
webdriver는 여러 가지 옵션들을 설정할 수 있는데 이에 대해서는 추후 포스팅하겠습니다.
우선, 저의 옵션은 네트워크와 사이트 주언어를 한국어로 설정했습니다.
씨네21 - 평론가 부문 사이트에 driver로 접속하였고 아래 예시처럼 html 검사 화면에서 제가 필요한 부분을 찾아 css selector을 찾아냈습니다. (아래 그림 참조)

Copy selector 예시

for문에서 i가 5, 12일 때를 제외한 이유는 사이트를 보면 중간에 배너 광고가 있습니다. (아래 그림 참조)
이에 대한 예외 처리를 해야 해서 i가 5, 12일 때를 제외시켰습니다.

HTML 예시

끝으로, 수집되는 평론가 이름과 링크는 행 단위로 리스트화 시켰고
마지막에 이를 데이터프레임 처리하여 result_data01이라는 엑셀 파일에 저장하며 1차 작업을 마무리하였습니다.

파이썬 영화 데이터 크롤링 2편 보러가기

반응형

댓글