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 사이트에 접속>
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