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控制台显示时钟的示例
Feb 24 Python
Python+Opencv识别两张相似图片
Mar 23 Python
python3 shelve模块的详解
Jul 08 Python
python中实现延时回调普通函数示例代码
Sep 08 Python
对Python 数组的切片操作详解
Jul 02 Python
python3 http提交json参数并获取返回值的方法
Dec 19 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
Python 运行 shell 获取输出结果的实例
Jan 07 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
Python循环实现n的全排列功能
Sep 16 Python
python异步编程 使用yield from过程解析
Sep 25 Python
python对输出的奇数偶数排序实例代码
Dec 04 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
php+ajax实现无刷新分页的方法
2014/11/04 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
mouse_on_title.js
2006/08/25 Javascript
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
python实现图片处理和特征提取详解
2017/11/13 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
python实现梯度下降算法
2020/03/24 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
python全栈知识点总结
2019/07/01 Python
pytorch 预训练层的使用方法
2019/08/20 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
django迁移文件migrations的实现
2020/03/31 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
《春雨》教学反思
2014/04/24 职场文书
营销团队口号
2014/06/06 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
2015年科室工作总结
2015/04/10 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
python模板入门教程之flask Jinja
2022/04/11 Python