Python使用selenium+PIL实现网页长屏截图

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值