Selenium基于PIL实现拼接滚动截图


Posted in Python onApril 10, 2020

Selenium默认的截图save_screenshot只支持对当前窗口内容进行截图,当如果你想要截取整个网页,那么,可以明确的告诉你。
Selenium做不到。

你可以手工使用开发者工具Ctrl+Shift+P调出命令行菜单,执行Capture full screenshot命令进行截图,如下图图:

Selenium基于PIL实现拼接滚动截图

也可以通过

Selenium Webdriver的 execute_cdp_cmd()来调用一下Chrome DevTools Protocal提供的方法。但是,很遗憾,没有全屏截图的方法。

Selenium2时,还可以使用Firefox全屏截图。Selenium3之后,所有浏览器不再支持。

一种方式是使用aShot,一个jar包,这显然是Java派的解决方案。

另外如果对样式没有强迫症的话,可以通过滚动页面截取多张+PIL图片拼接的方式实现全屏的截图。

示例代码:

from time import sleep
from PIL import Image
import numpy as np
from selenium import webdriver

driver = webdriver.Chrome()
driver.fullscreen_window() # 全屏窗口
driver.get('https://www.qq.com/')
window_height = driver.get_window_size()['height'] # 窗口高度

page_height = driver.execute_script('return document.documentElement.scrollHeight') # 页面高度
driver.save_screenshot('qq.png')

if page_height > window_height:
  n = page_height // window_height # 需要滚动的次数
  base_mat = np.atleast_2d(Image.open('qq.png')) # 打开截图并转为二维矩阵

  for i in range(n):
    driver.execute_script(f'document.documentElement.scrollTop={window_height*(i+1)};')
    sleep(.5)
    driver.save_screenshot(f'qq_{i}.png') # 保存截图
    mat = np.atleast_2d(Image.open(f'qq_{i}.png')) # 打开截图并转为二维矩阵
    base_mat = np.append(base_mat, mat, axis=0) # 拼接图片的二维矩阵
  Image.fromarray(base_mat).save('hao123.png')

driver.quit()

需要安装PIL和numpy: pip install PIL numpy

上例中,全屏窗口以获得最大展示范围,通过get_window_size()获取屏幕高度,通过执行js,获取页面高度。
相除后获得滚动次数。

每次滚动后,截图保存,然后使用Image打开转换为二维矩阵拼接到上一个图片的二维矩阵中。

循环完,最后再将拼接的二维矩阵输出成图片。

效果展示,如下图:

Selenium基于PIL实现拼接滚动截图

注意:如果是流式加载的页面,页面高度是不断变长的,非固定为第一次获取到的page_height的值,需要另外处理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python概率计算器实例分析
Mar 25 Python
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
python 全局变量的import机制介绍
Sep 07 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
python变量赋值方法(可变与不可变)
Jan 12 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
Jun 03 Python
pytorch中图像的数据格式实例
Feb 11 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
python 生成器需注意的小问题
Sep 29 Python
Python jieba结巴分词原理及用法解析
Nov 05 Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 #Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 #Python
jupyter notebook 多环境conda kernel配置方式
Apr 10 #Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 #Python
Python装饰器的应用场景代码总结
Apr 10 #Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 #Python
jupyter notebook 增加kernel教程
Apr 10 #Python
You might like
url decode problem 解决方法
2011/12/26 PHP
mysql总结之explain
2012/02/27 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
jquery.cookie用法详细解析
2013/12/18 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
python实现在windows下操作word的方法
2015/04/28 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
django ajax json的实例代码
2018/05/29 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
解决Python3 被PHP程序调用执行返回乱码的问题
2019/02/16 Python
Python字典遍历操作实例小结
2019/03/05 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
新加坡交友网站:be2新加坡
2019/04/10 全球购物
serialVersionUID具有什么样的特征
2014/02/20 面试题
工程师自我评价怎么写
2013/09/19 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
小学思品教学反思
2016/02/20 职场文书
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
Nginx禁止ip访问或非法域名访问
2022/04/07 Servers