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 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
Mar 20 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
python使用插值法画出平滑曲线
Dec 15 Python
python3多线程知识点总结
Sep 26 Python
python实现复制文件到指定目录
Oct 16 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
python自动化unittest yaml使用过程解析
Feb 03 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
python动态规划算法实例详解
Nov 22 Python
python实现腾讯滑块验证码识别
Apr 27 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
第一个无线电台是由谁发明的
2021/03/01 无线电
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
跟我学Laravel之请求与输入
2014/10/15 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
JavaScript类型转换方法及需要注意的问题小结(挺全面)
2010/11/11 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
javascript时区函数介绍
2012/09/14 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
vue实现购物车小案例
2019/09/27 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
python验证码识别教程之滑动验证码
2018/06/04 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
Python日志模块logging基本用法分析
2018/08/23 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
农民入党思想汇报
2014/01/03 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
2014年招商工作总结
2014/11/22 职场文书