본문 바로가기

PYTHON SKILL UP

[python] 영화 리뷰 수집해서 엑셀 표에 정리하기

네이버 영화 페이지에서 리뷰들을 수집해서 엑셀 표에 정리해보자.

import requests 
from bs4 import BeautifulSoup 
import pandas  
from tqdm import tqdm

네이버 이미지 다운로드할 때와 같이 웹 요청 모듈인 requests, 구조 분석 모듈인 BeautifulSoapimport 해 주자.

세번째 줄에 pandas는 동물이 아니고, 데이터 분석을 위해 파이썬으로 만들어진 소프트웨어 라이브러리이다.

이 코드에서는 엑셀을 사용하기 위하여 import한다.

마지막으로 tqdmimport해주는데, tqdmfor문 실행중에 진행 상황을 알려준다. 간지난다

이정도 해주면 충분히 코드를 작성할 수 있다.

 

 

def get_review(pageNo):
    result = []

    url = 'https://movie.naver.com/movie/point/af/list.nhn?&page={}'.format(pageNo)
    response = requests.get(url) 

    soup = BeautifulSoup(response.text, 'lxml') 
    trs = soup.select("table.list_netizen > tbody > tr")

    for tr in trs:
        tds = tr.select('td')
        number = tds[0].text 
        author = tds[2].select_one('a').text 
        day = tds[2].text[len(author):] 
        title = tds[1].select_one('a').text 
        content = tds[1].text[len(title) +1 : -3].strip() 

        result.append([number, author, day, title, content]) 
        
    return result

이 함수가 네이버 영화 페이지의 html에서 필요한 부분을 찾아서 분석하는 함수이다.

먼저 최종 결과를 수집할 반환용 리스트, result를 만들자.

네이버 영화에 리뷰는 한페이지만 있는 것이 아니다.(1000페이지까지 있다).

인터넷 주소 1000개를 쓰기보단 format을 사용하여 코드의 범용성을 넓혀주자.

'https://movie.naver.com/movie/point/af/list.nhn?&page={}'.format(pageNo) 를 url 값으로 한다.

그리고 requests를 사용하여 웹페이지를 요청(get)하고 응답 데이터를 response에 저장한다.

response를 분석해야 하는데, 구조분석에는 앞서 import한 구조 분석 모듈인 BeautifulSoup를 이용한다.

이번엔 분석할 일꾼자리에 html.parser대신 lxml이라는 것을 사용한다.

parser는 파이썬에 깔려있는 기본형이어서 성능이 안좋다니까 성능이 뛰어나다는 lxml을 사용하자.

분석한 결과를 soup에 저장한다.

 

네이버 영화의 html코드에서 우리가 필요한 리뷰가 담긴 부분을 찾아보자.

table.list_netizentbody 안에 있는 tr들에 우리가 필요한 리뷰 하나씩의 정보가 들어있다.

하나의 tr안에는 td가 있어 댓글 번호와 내용 등이 따로 들어있다. 

글씨가 작지만 볼 수 있을것이다

잘 이해가 안된다면 영단어 table의 뜻을 떠올려 보라. 표이다. html에서의 table도 표의 틀을 만들어 준다.

제목이 head, head안의 내용이 body. body의 한 줄을 tr. tr의 한 칸 내용을 td라고 생각하면 된다.

그렇다면 soup에서 필요한 부분을 추출하자.

table.list_netizen tbody 안에 있는 tr들이 필요한 것이니,

soup.select("table.list_netizen > tbody > tr") 로 코드를 짜서 trs의 값으로 하자.

 

for문 안에서는 필요한 정보(리뷰번호, 작성자, 작성날짜, 영화제목, 리뷰내용)들을 각각의 변수에 저장한다.

tr.select를 사용하여 tr안에있는 td 부분들을 골라낸다.

네이버 영화 리뷰같은 경우 하나의 trtd가 세개씩 있으니 인덱스 0~2까지 html텍스트속성들을 추려낸다.

각각의 변수에 저장된 정보들을 전부 처음에 만들었던 result에 추가한다.

result값을 return해준다.

 

 

앞서 말했듯 네이버는 영화 리뷰를 1000페이지까지만 보여준다.

따라서 특정 범위의 페이지만을 가져오는 함수가 필요하다.

def get_reviews(start = 1, end = 10): 
    if start < 1:
        start = 1
    if end > 1000:
        end = 1000

    result = []
    for i in tqdm(range(start, end+1)):
        result.extend(get_review(i))
    return result

함수에 default 값을 넣어서 아무것도 입력되지 않았을 경우의 범위를 설정해준다.

if문을 사용해서 네이버에서 서비스하는 범위 이외의 값을 걸러내자.

이 함수에서도 역시 최종 결과를 수집할 반환용 리스트, result를 만들자.

그다음 for문과 앞서 만든 함수인 get_review()를 사용해서 리뷰 수집을 반복시킨다.

여기서 tqdm이 등장한다. 간단하게 tqdm()만 해주면 작동이 된다.

이렇게 나타난다

반복되는 get_review()의 정보들을 extend하여 result에 확장시킨다.

result값을 return해준다.

 

 

if __name__ == '__main__':
    reviewData = get_reviews(1, 10)

    ##엑셀파일
    col = ['리뷰번호', '작성자', '작성날짜', '제목', '내용']

    dataFrame = pandas.DataFrame(reviewData, columns= col)

    dataFrame.to_excel("Movie.xlsx", 
                       sheet_name= '네이버 영화 네티즌 리뷰', 
                       header=True, 
                       startrow=0)

메인 코드이다.

바로 위의 함수인 get_reviews()를 사용하여 얻은 리뷰 데이터들을 revieaData에 넣는다.

reviewData를 사용하여 엑셀 파일을 만들어보자.

pandas.DataFrame으로 reviewDatacol을 엑셀화(?) 하여 dataframe 값으로 한다.

그리고 마지막으로 dataframe을 엑셀파일로 만든다.

dataFrame.to_excel(파일명, 시트네임, 글씨체굵기, 시작줄)이라고 생각하면 된다.

 

코드 실행 결과

왜 네이버 평점에 리뷰가 들어가있고 네이버 리뷰에 평점이 있는지는 모르겠지만...

평점을 엑셀로 정리할 계획으로 만들었다고.. 하지만 리뷰가 한눈에 보이도록 잘 정리되었다.