이전에는 셀레니움을 설치하는 포스팅을 했다면
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
추가로 질문이 있으시면 댓글 달아주세요