활용3. 웹스크래핑(0825-0829)/selenium

웹스크래핑3 셀레니움 2 구글무비

나도초딩 2022. 8. 29.

휴... 꾸역꾸역 여기까지 왔다. ㅠㅠ 와웃... 결국, 이게 거의 결정판인데, 아쉽게도 페이지가 업데이트돼서 제대로 실습을 못했다. 하지만, 이제 웹상에 있는 다른 크롤 예제들을 봐도, 이해하고 사용할 수 있겠다.

주로 표형태를 추출, 재가공(db 저장포함) 하고 싶으니, 다른 예제들로 더 공부해가야겠다.

나도코딩님 리스펙~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

후기 : 하루이틀이면 끝날 줄 알았는데, 실습하는데 하루 3-4시간씩 약 일주일 걸렸다. 흑.

삽질

2020 강의라서, 2022 년엔 ui가 태블릿 친화적으로 바껴버렸다. 빨리 했어야해.. 흑

 

1독 (포인트만 기록하며, 가급적 끊지 않고 보기)

보면서, 따라치면서 하니 ... 진도도 안나가고, 너무 힘들었다 ㅠ 먼저 1회 시청을 똑바로!

 

무비1 : requests 와 bs 만으로 시도

  • requets 로 먼저 시도
  • movies = soup.find_all로 추출 후, len(movies) 찍어보니, 0 이다. 왜?
  • 텍스트로 확인해보기 : prettify() 사용 -->영어페이지로 출력-->headers 에 language 넣어주기

무비2 : 셀레니움으로 스크롤 반복하기

  • 셀레니움으로 javascript -> 스크롤 실행
    browser.execute_script("window.scrollTo(0, 1080)")
  • 화면 가장 아래로 스크롤 : "window.scrollTo(0, document.body.scrollHeight)"
  • while True: 로 스크롤 반복 ( prev_height와 curr_height 는 스크롤 하기 전/후 높이 )
    if curr_height == prev_height:
        break:
    prev_height = curr_height

3. headless 크롬 사용하기 + 스크린캡처

browser.get_screenshot_as_file("google_movie.png")

헤드리스크롬 옵션
options = webdriver.ChromeOptions()
options.headless = Trueoptions.add_argument(윈도우 사이즈 지정)
options.add_argument(유저 에이전트) # 안넣어주면, headless 크롬으로 인식돼서, 차단 가능성.

4. user-agent 옵션 추가

생각해보니, browser.get(url)에서 특정 요소의 텍스트만 추출( User-Agent 정보) 해서 변수값으로 사용하는 것이 재미있었다. google스프레드시트 impot_html 같은건가보다. import_html 을 실시간 반영안시키는 이유가 크롤로 인한 문제이겠거니 생각은 했었는데.. 그러네.

 

3. 영화1

import requests
from bs4 import BeautifulSoup

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/84.0.4147.89 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"})
print(len(movies))

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

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

4. 영화2

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

# 페이지 이동
url = "https://play.google.com/store/movies/top"
browser.get(url)

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

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

import time
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("스크롤 완료")


import requests
from bs4 import BeautifulSoup

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()
    
    # 할인 전 가격
    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("링크 : ", "https://play.google.com" + link)
    print("-" * 100)

browser.quit()

구글무비3 : 헤드리스 + 화면 캡처

from selenium import webdriver

options = webdriver.ChromeOptions()
options.headless = True
options.add_argument("window-size=1920x1080")

browser = webdriver.Chrome(options=options)
browser.maximize_window()

# 페이지 이동
url = "https://play.google.com/store/movies/top"
browser.get(url)

import time
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("스크롤 완료")
browser.get_screenshot_as_file("google_movie.png")


import requests
from bs4 import BeautifulSoup

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()
    
    # 할인 전 가격
    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("링크 : ", "https://play.google.com" + link)
    print("-" * 100)

browser.quit()

구글무비4 : 헤드리스 옵션s User-Agent 위장

from selenium import webdriver

options = webdriver.ChromeOptions()
options.headless = True
options.add_argument("window-size=1920x1080")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36")

browser = webdriver.Chrome(options=options)
browser.maximize_window()

url = "https://www.whatismybrowser.com/detect/what-is-my-user-agent"
browser.get(url)

# Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
# AppleWebKit/537.36 (KHTML, like Gecko) 
# Chrome/84.0.4147.89 Safari/537.36
detected_value = browser.find_element_by_id("detected_value")
print(detected_value.text)
browser.quit()

댓글