Allen's 데이터 맛집

[Google] 무비 인기차트 원하는 정보만 출력하기 본문

Programming/Web Scraping

[Google] 무비 인기차트 원하는 정보만 출력하기

Allen93 2023. 8. 11. 13:09

 

구글 무비 인기차트에서 데이터를 가져와 보겠습니다.

보통 웹 사이트를 들어가면 접속이 될 때 불러와지는 것이 아니라 사용자의 이벤트가 있을때 동작을 하는 경우를 바로 동적 페이지라고 합니다.

쉽게 말하자면 페이지를 맨 밑까지 내리면 새롭게 로딩이 되면서 새로운 콘텐츠가 뜨는 방식입니다

 

아래 코드는 순차적으로 로딩을 하며 영화가 뜨기 때문에 스크롤을 가장 밑으로 내리고 2초대기, 다시 가장 밑으로 내리고 2초 대기를 하며 제일 밑까지 이동합니다.

그리고 스크롤 완료 출력 후 영화를 출력하는데 할인된 영화의 정보만 출력합니다.

from bs4 import BeautifulSoup
import requests
import time
from selenium import webdriver

browser = webdriver.Chrome(
    'C:\\Users\Vector\Desktop\PythonWorkSpace\.vscode\webscraping_basic\chromedriver.exe')
browser.maximize_window()

url = 'https://play.google.com/store/movies/top'
browser.get(url)

#지정한 위치로 스크롤 내리기
#모니터(해상도) 높이인 1080 위치로 스크롤 내리기
browser.execute_script('window.scrollTo(0,1080)')

#화면 가장 아래로 스크롤 내리기
#browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

interval = 2  # 2초에 한번씩 스크롤 내림

#현재 문서 높이를 가져와서 저장
prev_height = browser.execute_script('return document.body.scrollHeight')

#반복 수행
while True:
    #스크롤을 가장 아래로 내림
    browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

    #페이지 로딩 대기
    time.sleep(interval)

    curr_height = browser.execute_script('return document.body.scrollHeight')
    if curr_height == prev_height:
        break

    prev_height = curr_height

print('스크롤 완료')


res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(browser.page_source, "lxml")

# movies = soup.find_all('div', attrs={'class': ['ImZGtf mpg5gc','Vpfmgd']})
movies = soup.find_all('div', attrs={'class': 'Vpfmgd'})
#영화 갯수
print(len(movies))

for movie in movies:
    title = movie.find('div', attrs={'class': 'WsMG1c nnK0zc'}).get_text()
    #print(title)

    #할인 전 가격
    original_price = movie.find('span', attrs={'class': 'SUZt4c djCuy'})
    if original_price:
        original_price = original_price.get_text()
    else:
        #print(title, '할인되지 않는 영화는 제외')
        continue
    #할인된 가격
    price = movie.find(
        'span', attrs={'class': 'VfPpfd ZdBevf i5DZme'}).get_text()

    #링크로 이동
    link = movie.find('a', attrs={'class': 'JC71ub'})['href']
    # 올바른 링크 : https://play.google.com + link

    print(f'제목 : {title}')
    print(f'할인 전 금액 : {original_price}')
    print(f'할인 후 금액 : {price}')
    print(f'링크 :', 'https://play.google.com' + link)
    print('-'*100)

    browser.quit()

 

728x90