DevSSOM

파이썬 크롤링 실습 - 영화 리뷰 추출하기 본문

Python/크롤링

파이썬 크롤링 실습 - 영화 리뷰 추출하기

데브쏨 2021. 7. 4. 15:37
반응형

특정 영화 리뷰 추출하기

리뷰를 알고 싶은 영화의 제목을 입력하면, 해당 영화의 리뷰들의 제목을 알려주는 프로그램을 제작.

["특정 영화의 리뷰 제목 1", "특정 영화의 리뷰 제목 2", "특정 영화의 리뷰 제목 3"...]

해야할 것

get_url, get_href, crawling 함수를 올바르게 구현하기

  • get_url : main 함수에서 입력된 영화 제목을 네이버 영화 검색창에 검색하였을 때 나오는 url을 반환해야함.
  • get_href : get_url에서 얻은 url로 접근하였을 때, 가장 위에 존재하는 영화의 href를 반환.
  • crawling : 이전에 구현하였던 영화 리뷰 추출 방식과 동일.

 

get_href 함수를 구현할 때 유의할 점.


- 이것은 어떤 영화의 기본 정보를 보여주는 URL.

https://movie.naver.com/movie/bi/mi/basic.nhn?code=영화코드 의 형태.

예시) https://movie.naver.com/movie/bi/mi/basic.nhn?code=168058


- 이 URL은 어떤 영화의 리뷰 목록을 보여주는 URL.
https://movie.naver.com/movie/bi/mi/review.nhn?code=영화코드
즉, 영화의 href를 얻고 나서, basic 부분을 review로 올바르게 바꿔주어야 리뷰에 접근할 수 있다는 의미.

예시) https://movie.naver.com/movie/bi/mi/review.nhn?code=168058

 

import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    # 1장 실습의 영화 리뷰 추출 방식과 동일
    return None
    
def get_href(soup) :
    # 검색 결과, 가장 위에 있는 영화로 접근할 수 있는 href를 반환
    return None
    

def get_url(movie) :
    # 입력된 영화를 검색한 결과의 url을 반환
    return None
    
def main() :
    list_href = []
    
    custom_header = {
        'referer' : 'https://www.naver.com/',
        'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    
    # 섹션을 입력
    movie = input('영화 제목을 입력하세요. \n  > ')
    
    url = get_url(movie)
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")
    
    movie_url = get_href(soup)
    
    href_req = requests.get(movie_url)
    href_soup = BeautifulSoup(href_req.text, "html.parser")
    
    list_href = crawling(href_soup)
    print(list_href)
    


if __name__ == "__main__" :
    main()

 

 

 

>>>

 

가장 먼저, crwaling 함수는 이전 영화 리뷰 수집 글에 썼던 코드 그대로임 :  이전 글 보기

 

파이썬 크롤링 - 간단한 실습 : 영화 리뷰 수집

영화 리뷰 수집하기 영화 사이트에 있는 영화평의 제목을 수집해서 출력해보기. 사용 URL 주소 : https://movie.naver.com/movie/bi/mi/review.nhn?code=168058# 퍼스트맨 이제껏 누구도 경험하지 못한 세계에 도..

celltong.tistory.com

그래서 아래와 같이 써주면 됨.

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    # 이전 글 영화 리뷰 추출 방식과 동일
    result = []
    ul = soup.find("ul", class_="rvw_list_area")

    for li in ul.find_all("li"):
        result.append(li.find("strong").get_text())
    
    return result

 

다음으로, get_url 함수를 채워보기.

네이버 영화에서 '기생충' 영화를 검색하면 이렇게 뜸.

이 페이지의 url은 내가 검색한 문자열(영화제목) 그대로 query에 들어가는 식.

우리가 건드리지 않는 main 함수에서 내가 입력하는 영화 제목이 movie라는 변수에 들어가니까

    # 섹션을 입력
    movie = input('영화 제목을 입력하세요. \n  > ')

query = movie가 되는 거임. 그런데, 이대로 써주려면, url 문자열 중간에 변수가 들어가는 형식인데, 그렇게 해주기 위해선 문자열 앞에 f를 붙이고 문자열 중간에 들어갈 변수는 대괄호를 쳐주고 넣으면 된다고 함.

def get_url(movie) :
    # 입력된 영화를 검색한 결과의 url을 반환
    # 문자열 중간에 변수를 넣기 위해서는 앞따옴표 앞에 f라고 적고 대괄호 안에 변수를 넣어주면 됨
    return f"https://movie.naver.com/movie/search/result.nhn?query={movie}&section=all&ie=utf8"

그렇게 해서 get_url 함수 완성.

 

그다음 get_href 함수는 

다시 이 페이지에서 가장 위에 위치해 있는 영화의 url을 가져와야 됨.

크롬 개발자도구로 가장 위에 있는 영화의 제목 부분을 클릭해보면, <a>태그가 있고, 그 상위에 <ul class="search_list_1">이 있음. 그래서 a코드를 찾아서, 하이퍼링크를 가져오는 코드는 이렇게 씀.

def get_href(soup) :
    # 검색 결과, 가장 위에 있는 영화로 접근할 수 있는 href를 반환
    a = soup.find("ul", class_="search_list_1").find("a")
    
    href = a['href']

 

근데 '해야할 것'에서 알려줬던 주의사항 중에 하나가 리뮤 목록을 보여주는 리뷰 페이지 url은

https://movie.naver.com/movie/bi/mi/review.nhn?code=161967 인데

위에 코드로 구할 수 있는 url은 어떤 영화의 기본 정보 페이지 url임

https://movie.naver.com/movie/bi/mi/basic.nhn?code=161967 

왼쪽: 리뷰 페이지 / 오른쪽: 기본 정보 페이지

그래서 우리가 저 url을 살짝 수정해줘야됨. 두 url의 차이는 중간에 'review'가 들어가는지와 'basic'이 들어가는지의 차이니까 replace 메소드를 이용해서 그걸 바꿔줘.

def get_href(soup) :
    # 검색 결과, 가장 위에 있는 영화로 접근할 수 있는 href를 반환
    a = soup.find("ul", class_="search_list_1").find("a")
    
    href = a['href'].replace('basic', 'review')

그리고 위에서 <a>태그로 구한 하이퍼링크가 앞부분이 잘려서 나오니까, 앞부분을 붙여서 return 해줘.

def get_href(soup) :
    # 검색 결과, 가장 위에 있는 영화로 접근할 수 있는 href를 반환
    a = soup.find("ul", class_="search_list_1").find("a")
    
    href = a['href'].replace('basic', 'review')
    
    return "https://movie.naver.com" + href

이렇게 해서 get_href 함수도 완성.

 

 

최종코드

import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    # 이전 글 영화 리뷰 추출 방식과 동일
    result = []
    ul = soup.find("ul", class_="rvw_list_area")

    for li in ul.find_all("li"):
        result.append(li.find("strong").get_text())
    
    return result


def get_href(soup) :
    # 검색 결과, 가장 위에 있는 영화로 접근할 수 있는 href를 반환
    a = soup.find("ul", class_="search_list_1").find("a")
    
    href = a['href'].replace('basic', 'review')
    
    return "https://movie.naver.com" + href


def get_url(movie) :
    # 입력된 영화를 검색한 결과의 url을 반환
    # 문자열 중간에 변수를 넣기 위해서는 앞따옴표 앞에 f라고 적고 대괄호 안에 변수를 넣어주면 됨
    return f"https://movie.naver.com/movie/search/result.nhn?query={movie}&section=all&ie=utf8"

    
def main() :
    list_href = []
    
    custom_header = {
        'referer' : 'https://www.naver.com/',
        'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    
    # 섹션을 입력
    movie = input('영화 제목을 입력하세요. \n  > ')
    
    url = get_url(movie)
    print(url)
    req = requests.get(url, headers = custom_header)
    soup = BeautifulSoup(req.text, "html.parser")
    
    movie_url = get_href(soup)
    print(movie_url)
    
    href_req = requests.get(movie_url)
    href_soup = BeautifulSoup(href_req.text, "html.parser")
    
    list_href = crawling(href_soup)
    print(list_href)
    


if __name__ == "__main__" :
    main()

 

728x90
반응형
댓글