DevSSOM
파이썬 크롤링 실습 - 영화 리뷰 추출하기 본문
특정 영화 리뷰 추출하기
리뷰를 알고 싶은 영화의 제목을 입력하면, 해당 영화의 리뷰들의 제목을 알려주는 프로그램을 제작.
["특정 영화의 리뷰 제목 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 함수는 이전 영화 리뷰 수집 글에 썼던 코드 그대로임 : 이전 글 보기
그래서 아래와 같이 써주면 됨.
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}§ion=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}§ion=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()
'Python > 크롤링' 카테고리의 다른 글
파이썬 크롤링 실습 - Daum 증권 페이지에서 주가 크롤링 (0) | 2021.07.17 |
---|---|
파이썬 크롤링 - API를 이용한 크롤링 (0) | 2021.07.16 |
파이썬 크롤링 실습 - 네이버 뉴스 섹션들 기사 내용 추출하기 (0) | 2021.07.03 |
파이썬 크롤링 실습 - 네이버 뉴스 섹션들 기사 링크 추출하기 (0) | 2021.07.02 |
파이썬 크롤링 실습 - 뉴스기사 목록의 내용 수집하기 (0) | 2021.07.01 |
파이썬 크롤링 실습 - 네이트 최신뉴스 링크 수집하기 (0) | 2021.06.30 |
파이썬 크롤링 실습 - 뉴스기사 링크 수집하기 (0) | 2021.06.29 |