본문 바로가기

이전에는 셀레니움을 설치하는 포스팅을 했다면

https://kingname.tistory.com/219

 

파이썬 크롬브라우저 자동화 컨트롤러 Python Selenium 설치하기

Selenium이란 Selenium은 웹 어플리케이션을 자동으로 테스팅, 크롤링, 스크린샷 찍기등에 사용하기 위한 프레임 워크입니다. Python 과 Java 등 많은 언어들을 지원합니다. Selenium 설치하기 Selenium을 사

kingname.tistory.com

 

이번 포스팅에서는 파이썬 셀레니움(Selenium)을 이용해서 스크린샷을 찍어보도록 하겠습니다.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

필요한 라이브러리들을 설치합니다.

options = webdriver.ChromeOptions()
options.add_argument("headless")
options.add_argument("window-size=1920x1080")
options.add_argument("disable-gpu")
options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36")
options.add_argument("lang=ko_KR")
options.add_argument("Content-Type=application/json; charset=utf-8")

driver = webdriver.Chrome(options=options)

최대한 사용자와 비슷하게 하기 위해서 위와 같은 설정을 진행합니다. 추가로 몇가지 더 있겠지만 이정도로 설정하겠습니다.

이후 반응형 화면 스크린샷을 찍는 코드를 작성합니다.

class ResponsiveScreen:
    def __init__(self, urls):
        self.browser = webdriver.Chrome(ChromeDriverManager().install())
        self.browser.maximize_window()
        self.urls = urls
        self.sizes = [480, 960, 1366, 1920]

    def screenshot(self, url):
        BROWSER_HEIGHT = 1027
        self.browser.get(url)
        for size in self.sizes:
            self.browser.set_window_size(size, BROWSER_HEIGHT)
            self.browser.execute_script("window.scrollTo(0, 0)")
            time.sleep(3)
            scroll_size = self.browser.execute_script(
                "return document.body.scrollHeight"
            )
            total_sections = ceil(scroll_size / BROWSER_HEIGHT)
            for section in range(total_sections + 1):
                self.browser.execute_script(
                    f"window.scrollTo(0, {section * BROWSER_HEIGHT})"
                )
                time.sleep(2)
                self.browser.save_screenshot(f"screenshots/{size}x{section}.png")

    def start(self):
        for url in self.urls:
            self.screenshot(url)

    def finish(self):
        self.browser.quit()


if __name__ == '__main__':
    try:
        screenshot = ResponsiveScreen(["https://google.com", "https://naver.com"])
        screenshot.start()
    finally:
        screenshot.finish()

전체 페이지를 스크린샷으로 찍기 위해서는 브라우저의 window_size 값을 조정해서 스크린샷을 찍으면 가능합니다.

스크린샷 전체화면 찍기

# 기본 측정 사이즈
total_width = 1920
self.browser.set_window_size(total_width, 1027)
self.browser.get(url)

# page 클레스 이름을 가진 엘리먼트가 생성될때까지 대기
WebDriverWait(self.browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, 'page')))
time.sleep(4)

# 사용자 스크롤에 접근하기
scroller = self.browser.find_element_by_class_name('scroller')

# 전체 화면 사이즈 측정
total_height = self.browser.execute_script("return arguments[0].scrollHeight", scroller)

self.browser.set_window_size(total_width, total_height)
time.sleep(2)
self.browser.save_screenshot("/home/user/notion/images/screen_"+ str(total_height) +".png")

https://github.com/shing100/selenium

 

GitHub - shing100/selenium: 웹 크롤러 (셀레니움, bs4 ) 만들어보기

웹 크롤러 (셀레니움, bs4 ) 만들어보기. Contribute to shing100/selenium development by creating an account on GitHub.

github.com

 

혹시나 리눅스 환경에서 진행하게 되다가 한글깨짐 문제가 발생하면 아래의 포스팅에서 해결할 수 있습니다.

https://kingname.tistory.com/220

 

리눅스 한글깨짐 문제 해결방법 (리눅스 셀레니움 스크린샷 한글깨짐)

리눅스 환경에서 Selenium(셀리니움)을 이용해서 데이터를 수집하는 도중에 한글깨짐이 발생하여 해결방법을 알아보았습니다. 리눅스 폰트를 설치하지 않아서 발생하는 문제입니다. 해결방법은

kingname.tistory.com

추가로 질문이 있으시면 댓글 달아주세요

엉망진창

개인 블로그 입니다. 코딩, 맛집, 정부정책, 서비스, ~방법 등 다양한 정보를 소개합니다