이전 게시글에서는 데이터 수집을 위한 사이트를 선정했습니다. 이제 프로젝트의 중간 과정들을 데이터 수집 역할 입장에서 소개하겠습니다.
이 프로젝트의 목적은 영화 추천 알고리즘을 개발하기 위해 필요한 데이터를 수집하는 것입니다. 특히, 영화의 감독 정보와 줄거리를 수집하여, 이를 기반으로 사용자에게 맞춤형 영화를 추천하는 시스템을 구축하는 것이 최종 목표입니다.
사용한 기술 스택
Python: 주요 프로그래밍 언어
Pandas: 데이터 처리 및 저장
Selenium: 웹 자동화 및 크롤링
BeautifulSoup: HTML 파싱
Requests: 웹 페이지 요청
UserAgent: 헤더 설정을 통한 크롤링 방지 우회
3. 데이터 수집 과정
(1) 데이터 준비 먼저, 크롤링할 영화 제목이 포함된 CSV 파일을 읽어옵니다.
이 파일은 title 컬럼에 영화 제목이 저장되어 있습니다.
import pandas as pd
# CSV 파일 읽기
df = pd.read_csv(f'{Inp_path}', encoding='latin1')
df['H1'] = 'Director' # 새로운 컬럼 추가
(2) 웹 드라이버 설정
Selenium을 사용해 IMDb 웹사이트에 접속합니다. Chrome 드라이버를 사용했으며, 검색창에 영화 제목을 입력해 해당 영화 페이지로 이동합니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# 웹 드라이버 설정
driver = webdriver.Chrome()
driver.get('https://www.imdb.com/?ref_=nv_home')
(3) 크롤링 로직
각 영화 제목을 IMDb 검색창에 입력하고, 검색 결과에서 첫 번째 영화를 클릭합니다. 이후, 영화 페이지에서 감독 정보와 줄거리를 추출합니다.
from bs4 import BeautifulSoup
import requests as rq
from fake_useragent import UserAgent
start = time.time()
for i, title in enumerate(df['title'], 2):
try:
# 검색창에 영화 제목 입력
elem = driver.find_element(by=By.CSS_SELECTOR, value="input[type=text]")
elem.click()
elem.send_keys(title)
elem.send_keys(Keys.RETURN)
time.sleep(1)
# 첫 번째 검색 결과 클릭
elem2 = driver.find_element(by=By.CSS_SELECTOR, value='div.sc-daafffbc-0.bGPFAy')
elem2.click()
# 현재 페이지 URL 가져오기
url = driver.current_url
# UserAgent를 사용해 헤더 설정
ua = UserAgent()
headers = {'User-Agent': ua.chrome}
# 페이지 요청 및 HTML 파싱
html = rq.get(url, headers=headers).text
soup = BeautifulSoup(html, 'html.parser')
# 감독 정보 추출
director = soup.select_one('div.sc-491663c0-11.hFWIYv a.ipc-metadata-list-item__list-content-item').text
save_title = f'B{i}'
df[save_title] = director
# 줄거리 추출
story = soup.select_one('div.ipc-html-content-inner-div').text
except AttributeError:
# 에러 발생 시 'NONE' 저장
df[save_title] = 'NONE'
end_time = time.time()
print('걸린 시간:', start - end_time)
(4) 데이터 저장
크롤링이 완료된 데이터를 CSV 파일로 저장합니다.
df.to_csv(f'{Out_path}', index=False)
아래는 저장된 데이터의 일부입니다.
head(20)
4. 프로젝트의 어려움과 해결 방법
(1) 크롤링 방지 우회 IMDb는 크롤링을 방지하기 위해 다양한 보안 조치를 취하고 있습니다. 이를 우회하기 위해 UserAgent를 사용해 헤더를 설정했습니다.
(2) 페이지 로딩 시간 Selenium을 사용할 때 페이지 로딩 시간이 길어질 수 있습니다. 이를 해결하기 위해 time.sleep()을 사용해 적절한 대기 시간을 추가했습니다.
(3) 예외 처리 크롤링 중 에러가 발생할 수 있으므로, try-except 구문을 사용해 예외 처리를 했습니다. 에러가 발생하면 해당 영화의 감독 정보를 'NONE'으로 저장했습니다.
5. 결과 및 활용
크롤링을 통해 수집한 데이터는 영화 추천 알고리즘의 입력 데이터로 활용됩니다. 감독 정보와 줄거리를 기반으로 사용자의 취향에 맞는 영화를 추천할 수 있습니다. 또한, 이 데이터는 추가적인 분석과 모델링에도 사용될 수 있습니다.
6. 결론
이번 프로젝트는 IMDb에서 영화 데이터를 크롤링하여 영화 추천 알고리즘을 위한 데이터를 수집하는 과정이었습니다. Selenium과 BeautifulSoup을 활용해 웹 크롤링을 진행했으며, 다양한 어려움을 극복하며 유의미한 데이터를 수집할 수 있었습니다. 이 데이터를 바탕으로 더 나은 영화 추천 시스템을 구축할 수 있을 것으로 기대합니다.
별도로 코드가 학습 목적으로 필요하신 분은 댓글 달아주시면 코드 원본 보내드리겠습니다. :)
'Web-Crawling' 카테고리의 다른 글
Personal Color Data gathering: Google Image || (2) | 2025.02.18 |
---|---|
Personal Color Data gathering: Google Image | (1) | 2025.02.18 |
Movie Recommendation Algorithm System Project Web-Crawling (4) | 2024.07.24 |