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中数据解析
May 05 Python
python实现换位加密算法的示例
Oct 14 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
Jan 29 Python
java判断三位数的实例讲解
Jun 10 Python
python 弹窗提示警告框MessageBox的实例
Jun 18 Python
简单了解Python3 bytes和str类型的区别和联系
Dec 19 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
Apr 07 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
基于Python脚本实现邮件报警功能
May 20 Python
Python爬虫抓取指定网页图片代码实例
Jul 24 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
一个用于网络的工具函数库
2006/10/09 PHP
PHP 分页类(模仿google)-面试题目解答
2009/09/13 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
jQuery Ajax 全解析
2009/02/08 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
集合Bootstrap自定义confirm提示效果
2017/09/19 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
详解小白之KMP算法及python实现
2019/04/04 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
python super用法及原理详解
2020/01/20 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
python怎么提高计算速度
2020/06/11 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
彪马西班牙官网:PUMA西班牙
2019/06/18 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
高中生毕业自我鉴定
2013/10/10 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书