[Python] 초보도 가능한 로튼토마토(Rotten Tomatoes) 영화리뷰 크롤링: ③ BeautifulSoup으로 리뷰 텍스트 가져오기
이번 장에서는 BeautifulSoup 패키지로 로튼토마토(Rotten Tomatoes) 영화리뷰를 긁어오자!
우선 BeautifulSoup이 뭘까? html 페이지 소스를 종류에 맞게 정리하는(parsing) 것을 가능하게 만드는 패키지가 바로 BeatufilSoup다. 이 역시 지난번 [Python] 왕초보도 가능한 로튼토마토(Rotten Tomatoes) 영화리뷰 크롤링: ② 셀레니움(selenium)으로 html 소스 가져오기 편에서 가져온 페이지소스를 활용하여 천천히 알아보자
1. BeautifulSoup 패키지 설치
먼저 BeautifulSoup 패키지가 없는 경우, 아래 코드를 terminal이나 cmd창에 입력해 설치하면 된다.
pip install beautifulsoup4
설치가 완료되면 spyder 창에 아래 코드를 실행시켜보자. (지난 장의 코드와 이어서 실행시켜야 한다.)
from selenium import webdriver
from bs4 import BeautifulSoup
driver = webdriver.Chrome(r"~/rotten/chromedriver")
driver.get('https://www.rottentomatoes.com/m/avatar_the_way_of_water/reviews') # 로튼토마토 주소 적기
html = driver.page_source
2. html 페이지 소스 파싱하여 가져오기
위 코드처럼 from bs4 import BeautifulSoup 를 추가했으면,
이제 불러온 페이지 소스를 종류에 맞게 정리한 것을(parsing) soup에 담아보자
soup = BeautifulSoup(html, 'html.parser')
soup에 뭐가 있는지 눌러보면 엄청난 양의 텍스트에 압도될 것이다!!
이 곳에서 어떻게 리뷰 텍스트만 추출할 수 있지? 0_0 당황하지 말고 리뷰 사이트에서 f12를 눌러 크롤링해보고자 하는 영역을 찾아보자!
3. 펑션키를 이용하여 f12 크롤링할(=긁어올) 데이터 위치 찾기
리뷰사이트에서 f12를 누르면 우측에 개발자 도구가 나타나면서 해당 페이지의 html 소스를 볼 수 있다.
그럼 아래 이미지에서 노란색 동그라미를 눌러보자!
그 상태에서 아무 리뷰 텍스트 영역에 마우스 커서를 대보자
따란-! 그럼 해당 리뷰텍스트가 있는 곳의 페이지소스가 우측에 보여질 것이다!
이 때 우측에 있는 해당 구문의 왼쪽 점 세개를 클릭해보자
창이 뜨면 Copy -> Copy selector를 선택하여 해당 영역을 선택해서 볼 수 있는 위치를 가져올 수 있다.
우리는 이 위치 정보를 BeautifulSoup에 이용하여 해당 영역에서 James cameron has done it again 이라는 텍스트만 가져올 것이다.
4. 스파이더 창(IDE)에서 리뷰텍스트만 추출하기
스파이더 창으로 돌아와서 soup.select_one() 가로 안에 copy 한 selector 값을 붙여넣어보자(ctrl+v)
그럼 아래 코드의 초록색 부분처럼 나타날 것이다.
soup.select_one('#content > div > div > div > div.review_table > div:nth-child(1) > div.col-xs-16.review_container > div.review_area > div.review_desc > div.the_review')
그럼 결과 값이 아래 처럼 나올 것이다.
하지만 우리가 원하는 것은 텍스트'만'이다. 위 코드 끝에 .get_text() 를 붙이면 텍스트만 추출 할 수 있다.
그리고 text로 이 값
soup.select_one('#content > div > div > div > div.review_table > div:nth-child(1) > div.col-xs-16.review_container > div.review_area > div.review_desc > div.the_review').get_text()
그럼 결과 값이 아래와 같이 나올 것이다.
근데 뭔가 이쁘지가 않다. \n 이것도 없애고 싶고 공백도 없애고 싶다. 이런 경우 끝에 .strip()으로 텍스트의 앞뒤 공백제거를 하자.
soup.select_one('#content > div > div > div > div.review_table > div:nth-child(1) > div.col-xs-16.review_container > div.review_area > div.review_desc > div.the_review').get_text().strip()
우리가 원하는 결과값이 드디어 나왔다!!
🙌🏼🙌🏼🙌🏼 크롤링 성공 🙌🏼🙌🏼🙌🏼
하지만 우리가 원하는 것은 여러개의 리뷰다. 다음 장에서는 한 페이지의 리뷰 여러개를 어떻게 다 가져올 수 있는지 배워보자.