이전에는 셀레니움을 설치하는 포스팅을 했다면
https://kingname.tistory.com/219
이번 포스팅에서는 파이썬 셀레니움(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
혹시나 리눅스 환경에서 진행하게 되다가 한글깨짐 문제가 발생하면 아래의 포스팅에서 해결할 수 있습니다.
https://kingname.tistory.com/220
추가로 질문이 있으시면 댓글 달아주세요