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使用tkinter实现简单计算器
Jan 30 Python
详解python中@的用法
Mar 27 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
Aug 15 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 Python
python中JWT用户认证的实现
May 18 Python
python基于socket函数实现端口扫描
May 28 Python
Python sorted对list和dict排序
Jun 09 Python
详解Python yaml模块
Sep 23 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
Apr 28 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中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
jQuery中first()方法用法实例
2015/01/06 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
javascriptvoid(0)含义以及与"#"的区别讲解
2019/01/19 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
财务支持类个人的自我评价
2014/02/14 职场文书
司仪主持词两篇
2014/03/22 职场文书
爱国演讲稿500字
2014/05/04 职场文书
会计求职信范文
2014/05/24 职场文书
护理专科学生自荐书
2014/07/05 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
2016年感恩节寄语
2015/12/07 职场文书
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS
索尼ICF-5900W收音机测评
2022/04/24 无线电