IMDB 리뷰 분석 - 1

김원호·2023년 3월 9일
0

자연어처리와 감성분석을 배울 당시에 한국어가 영어에 비해 난이도가 높으며, 영어가 데이터도 많다는 얘기를 들었다. 그래서 우선적으로 IMDB 영화 리뷰를 통해 자연어 처리의 기본을 공부하기로 했다. 사실 이러한 이유들도 물론 중요했지만 가장 큰 이유는 음식점 리뷰로 생각했던 네이버지도 리뷰 데이터가 내가 생각했던 이유와 거리가 좀 멀어서도 컸다. 일단 크롤링 난이도가 좀 높았다. 다른 사람들의 코드를 참고하려고 했었는데 네이버측에서 주기적으로 css selector를 바꿔서 그대로 사용할 수 없었다. 하지만 그 덕분에 크롤링 공부를 다시 제대로 할 수 있는 좋은 기회이기도 했다.

크롤링

필요 패키지를 불러오고

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import pandas as pd

리뷰와 별점을 담을 리스트 준비
base_url과 key를 활용하여
더보기 버튼을 눌러서 나오는 리뷰 url을 얻는 데에 활용한다

review_list = []
rating_list = []
base_url = "https://www.imdb.com/"
key = ""

IMDB에서 영화를 클릭하고 유저 리뷰 보기를 누르면 생성되는 url을 사용하고
MAX_CNT변수에 얻고자 하는 전체 리뷰수를 입력한다.
url을 http로 요청하고 이를 beautiful soup을 활용해 스크래핑한다.

# 수집하고 싶은 영화의 user riviews 페이지 url 붙여넣기
url = 'https://www.imdb.com/title/tt6751668/reviews/?ref_=tt_ql_urv'

# 수집하고 싶은 영화 리뷰 수 지정
MAX_CNT = 1000
cnt = 0

print("url = ", url)
res = requests.get(url)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, "lxml")

별점 및 리뷰 수집

for item in soup.select(".lister-list"):
    rating = item.select("span.rating-other-user-rating > span")
    if len(rating) == 2:
        rating = rating[0].text
    else:
        rating = ""
    review = item.select(".text")[0].text

더보기 버튼이 있다면 누르고, base_url에 더보기 버튼을 통해 얻는 리뷰들의 url을 저장한다.

load_more = soup.select(".load-more-data")
flag = True
if len(load_more):
    ajaxurl = load_more[0]['data-ajaxurl']
    base_url = base_url + ajaxurl + "?ref_=undefined&paginationKey="
    key = load_more[0]['data-key']
else:
    flag = False

그 후 이 두 코드를 합쳐서 더보기 버튼이 없다면(flag = false) 반복문을 종료한다.

while flag:
    url = base_url + key
    print("url = ", url)
    res = requests.get(url)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text, "lxml")
    for item in soup.select(".lister-item-content"):
        rating = item.select("span.rating-other-user-rating > span")
        if len(rating) == 2:
            rating = rating[0].text
            review = item.select(".text")[0].text
            temp = int(rating)
            review_list.append(review)
            rating_list.append(temp)
            cnt = cnt + 1
        else:
            rating = ""
        review = item.select(".text")[0].text

        if cnt >= MAX_CNT:
            break
    if cnt >= MAX_CNT:
        break
    load_more = soup.select(".load-more-data")
    if len(load_more):
        key = load_more[0]['data-key']
    else:
        flag = False

결과물을 데이터프레임으로 저장하고 이를 csv파일로 저장

df = pd.DataFrame(columns = ['review', 'label'])
df['review'] = review_list
df['rating'] = rating_list
df.to_csv("IMDB_reviews.csv")

크롤링 영화는 기생충을 기준으로 하였고
데이터 프레임을 읽어보면 다음과 같다

출처 : https://happy-obok.tistory.com/42

0개의 댓글