Python使用selenium+PIL实现网页长屏截图
代码如下:
import glob
import os
import time
import numpy
from PIL import Image
from selenium import webdriver
class ScreenLongShot(object):
def __init__(self, url):
self.get_img = "result.png"
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.page = url
def get_height(self):
chrome_height = self.driver.get_window_size()["height"]
page_height = self.driver.execute_script('return document.documentElement.scrollHeight')
return chrome_height, page_height
def scree_shot(self):
try:
self.driver.get(self.page)
self.driver.implicitly_wait(10)
chrome_height, page_height = self.get_height()
temp_img = "tmp.png"
self.driver.save_screenshot(temp_img)
"""取余网页高度和谷歌浏览器高度的余数来判断滚动几次鼠标"""
if page_height > chrome_height:
n = page_height // chrome_height
base_mat = numpy.atleast_2d(Image.open(temp_img))
for i in range(n):
"""每滚动一次鼠标就截图一次"""
self.driver.execute_script(f'document.documentElement.scrollTop={chrome_height * (i + 1)};')
time.sleep(.5)
self.driver.save_screenshot(f'tmp_{i}.png')
mat = numpy.atleast_2d(Image.open(f'tmp_{i}.png'))
base_mat = numpy.append(base_mat, mat, axis=0)
Image.fromarray(base_mat).save(self.get_img)
except Exception as e:
print(e)
finally:
"""删除执行中间的缓存图片"""
for i in glob.glob(os.path.join(os.getcwd(), 'tmp*.png')):
os.remove(i)
def close_chrome(self):
self.driver.quit()
def main():
page = "https://www.aliyun.com/"
s = ScreenLongShot(page)
try:
s.scree_shot()
except Exception as e:
print(e)
if __name__ == '__main__':
main()