[Python] 나도코딩 웹 스크래핑편 - (13) 셀레니움3

Updated:

유튜브 나도코딩 웹 스크래핑 무료 강의를 통해 학습한 내용을 정리해서 올리고 있습니다.

실습과정에서 필요에 따라 일부 강의 내용의 누락 및 추가, 수정사항이 있습니다.

퀴즈의 경우, 유튜브 풀이와 상이할 수 있습니다.


구글 플레이 영화

1. 셀레니움 없이 불러오기

import requests
from bs4  import BeautifulSoup

url = "https://play.google.com/store/movies/top"

# 한글이 있으면 한글로 반환해달라 Accept-Language
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36",
    "Accept-Language":"ko-KR,ko"
}

res = requests.get(url, headers = headers)
res.raise_for_status()

soup = BeautifulSoup(res.text, "lxml")

movies = soup.find_all("div", attrs= {"class":"ImZGtf mpg5gc"})

# with open("movie.html", "w", encoding="utf8") as f:
#    # f.write(res.text)
#    f.write(soup.prettify()) # html 문서를 예쁘게 출력

for movie in movies:
    title = movie.find("div", attrs={"class":"WsMG1c nnK0zc"}).get_text()
    print(title)
노바디
고질라 VS. 콩
몬스터 헌터 Monster Hunter
라야와 마지막 드래곤
어벤져스 : 엔드게임 (자막판)
소울
콰이어트 플레이스 (자막판)
잭 스나이더의 저스티스 리그
너의 이름은. (자막판)
모탈 컴뱃
  • 구글 플레이 영화 사이트에 접속해 현재 인기 영화 제목을 가져왔다.

  • url에 접속하면 사이트가 영어로 나타나는데 headers에 Accept-Language 정보를 주어 한글이 있으면 한글로 반환해달라고 요구한다.

  • 각 영화의 제목을 잘 불러왔는데 한 가지 이상한 건 전체 영화 제목을 불러오지 못하고 일부만 불러온다.

  • 이는 이전 네이버 항공권 예약처럼 처음 사이트 접속시 로딩이 있기 때문이다.

  • 또 하나 문제점은 해당 사이트는 스크롤을 내리면 처음에 보이지 않았던 영화 리스트가 새로 나타난다.

  • 이러한 점을 해결하기 위해 셀레니움을 사용해보자.

2. 셀레니움 적용

from selenium import webdriver
import time
import requests
from bs4  import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome("./chromedriver.exe")
browser.maximize_window() # 창 최대화

url = "https://play.google.com/store/movies/top"
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36",
    "Accept-Language":"ko-KR,ko"
}


# 페이지 이동
browser.get(url)

# 반복해서 가장 아래로 스크롤 내리기
interval = 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("스크롤 완료")

# 모니터(해상도) 높이인 1600 위치로 스크롤내리기: browser.execute_script("window.scrollTo(0,1600)")
스크롤 완료
  • 앞서 문제를 보완하기 위해 셀레니움으로 스크롤을 내리는 명령어를 사용하였다.

  • 스크롤을 내린 후 로딩 대기 시간을 2초로 설정하였고 현재 문서 높이를 저장하였다.

  • 반복문을 시행하면서 이전 문서 높이와 현재 문서 높이가 같으면 반복을 멈춘다.

  • 직접 실행되는 것을 보면 재밌다. 잘 적용되는지 확인해보자.

# 스크롤 완료된 url 정보
soup = BeautifulSoup(browser.page_source, "lxml")

# 클래스를 2개 이상 가져올 때
# movies = soup.find_all("div", attrs= {"class":["ImZGtf mpg5gc","Vpfmgd"]})
movies = soup.find_all("div", attrs= {"class":"Vpfmgd"})

for i, movie in enumerate(movies):
    title = movie.find("div", attrs={"class":"WsMG1c nnK0zc"}).get_text()

    # 할인 전 가격
    original_price = movie.find("span", attrs={"class":"SUZt4c djCuy"})

    # 할인 후 가격
    discount_price = movie.find("span", attrs={"class": "VfPpfd ZdBevf i5DZme"}).get_text()

    if original_price:
        original_price = original_price.get_text()
    else:
        original_price = discount_price


    # 링크
    link = movie.find("a", attrs={"class":"JC71ub"})["href"]

    print(f"제목 : {title}")
    print(f"할인 전 금액 : {original_price}")
    print(f"할인 후 금액 : {discount_price}")
    print(f"링크 : https://play.google.com{link}")
    print("-" * 120)
    
    if i==4:
        break

browser.quit()
제목 : 노바디
할인 전 금액 : ₩1,800
할인 후 금액 : ₩1,800
링크 : https://play.google.com/store/movies/details/%EB%85%B8%EB%B0%94%EB%94%94?id=Bh7FPgXm7Ng.P
------------------------------------------------------------------------------------------------------------------------
제목 : 고질라 VS. 콩
할인 전 금액 : ₩5,000
할인 후 금액 : ₩5,000
링크 : https://play.google.com/store/movies/details/%EA%B3%A0%EC%A7%88%EB%9D%BC_VS_%EC%BD%A9?id=bKfIMqA5r6Q.P
------------------------------------------------------------------------------------------------------------------------
제목 : 몬스터 헌터 Monster Hunter
할인 전 금액 : ₩1,800
할인 후 금액 : ₩1,800
링크 : https://play.google.com/store/movies/details/%EB%AA%AC%EC%8A%A4%ED%84%B0_%ED%97%8C%ED%84%B0_Monster_Hunter?id=jdFtPHzGhVw.P
------------------------------------------------------------------------------------------------------------------------
제목 : 라야와 마지막 드래곤
할인 전 금액 : ₩4,400
할인 후 금액 : ₩4,400
링크 : https://play.google.com/store/movies/details/%EB%9D%BC%EC%95%BC%EC%99%80_%EB%A7%88%EC%A7%80%EB%A7%89_%EB%93%9C%EB%9E%98%EA%B3%A4?id=mOj6B2R2qfo.P
------------------------------------------------------------------------------------------------------------------------
제목 : 어벤져스 : 엔드게임 (자막판)
할인 전 금액 : ₩7,150
할인 후 금액 : ₩7,150
링크 : https://play.google.com/store/movies/details/%EC%96%B4%EB%B2%A4%EC%A0%B8%EC%8A%A4_%EC%97%94%EB%93%9C%EA%B2%8C%EC%9E%84_%EC%9E%90%EB%A7%89%ED%8C%90?id=dNB_QMbwFWE
------------------------------------------------------------------------------------------------------------------------
  • 앞서 셀레니움을 이용해 스크롤 완료된 url을 얻을 수 있다.

  • 이를 통해 내가 가져오고 싶은 여러 정보를 불러올 수 있다.

  • 나는 결과창이 길어져서 5개 정보만 불러왔지만 해당 조건을 없애면 모든 영화 정보를 불러온다.

Leave a comment