본문 바로가기
데이터 분석

[크롤링] IMDB 영화 리뷰 크롤링 하고 긍부정 라벨링하기(파이썬/ BeautifulSoup/requests/데이터 추출/실습)

by 오 복 이 2022. 2. 3.

IMDB는 영화, TV 시리즈, 홈 비디오, 비디오 게임 및 온라인 스트리밍 콘텐츠와 관련 온라인 데이터베이스입니다.

여기서 수집하고 싶은 영화의 리뷰를 크롤링하고 CSV 형식으로 저장해봅니다.

크롤링하면서 리뷰와 함께 있는 평점을 통해 해당 리뷰를 긍정과 부정으로 라벨링 합니다.

해당 리뷰의 평점이 높다면 긍정으로 라벨링 하고 평점이 낮다면 부정으로 라벨링 합니다.

꼭 평점이 낮다고 부정적인 내용의 리뷰이고 평점이 높다고 긍정적인 내용의 리뷰는 아니지만 평점과 리뷰의 긍부정이 일치한다고 가정하고 임시적으로 라벨을 붙였습니다.

 

1. 필요한 패키지 불러오기 - requests, BeautifulSoup, urllib.parse, pandas

requests : HTTP 요청을 위해 사용하는 파이썬 라이브러리

BeautifulSoup : 웹 사이트에서 데이터를 추출하는 웹 스크래핑 라이브러리

urllib.parse : URL 문자열을 분할하거나 결합하는데 사용하는 라이브러리

pandas :  데이터 처리 및 분석을 위한 파이썬 라이브러리

 

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

 

2. 긍부정 라벨링 함수 선언

5를 기준으로 기준 값 초과인 리뷰는 긍정 이하인 리뷰는 부정으로 라벨링 합니다.

1은 긍정적인 리뷰, 0은 부정적인 리뷰를 의미합니다.

def rating_transfer(rating):
    if rating > 5:
        rating = 1
    elif rating <= 5:
        rating = 0
    pn = rating
    return pn

 

 

3. 수집하고 싶은 영화 URL 가져오기

1) IMDB 사이트 접속

https://www.imdb.com/?ref_=nv_home 

 

IMDb: Ratings, Reviews, and Where to Watch the Best Movies & TV Shows

IMDb is the world's most popular and authoritative source for movie, TV and celebrity content. Find ratings and reviews for the newest movie and TV shows. Get personalized recommendations, and learn where to watch across hundreds of streaming providers.

www.imdb.com

<IMDB 사이트에 접속>

 

 

2) 리뷰를 수집하고 싶은 영화 검색->  'User reviews' 클릭->  url 복사하기(아래의 코드의 url변수에 붙여 넣을 것)

 

4. 데이터 수집하기

url 변수에 수집하고 싶은 영화의 user riviews 페이지 url 붙여 넣기 한 뒤, MAX_CNT 변수에 수집하고 싶은 영화 리뷰 수 지정합니다.

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

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

#수집하고 싶은 영화 리뷰 수 지정
MAX_CNT = 30
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

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

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
            pn = rating_transfer(int(rating))
            review_list.append(review)
            rating_list.append(pn)
            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
        
#출처 : https://github.com/Stan7s/IMDb-Review-Crawler/blob/master/IMDb-Review-Crawler.py

 

5. CSV 파일로 저장

reviews , label의 열의 데이터 형식으로 추출한 데이터를 저장합니다.

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

 

 

 

 

 

6. 결과 확인

엑셀로 csv 파일을 열어보면 다음과 같습니다.

 

 

 

 

[참고]

https://github.com/Stan7s/IMDb-Review-Crawler/blob/master/IMDb-Review-Crawler.py

 

GitHub - Stan7s/IMDb-Review-Crawler: IMDB影评爬虫

IMDB影评爬虫. Contribute to Stan7s/IMDb-Review-Crawler development by creating an account on GitHub.

github.com

 

728x90
반응형