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 实现简单的电话本功能
Aug 09 Python
python执行系统命令后获取返回值的几种方式集合
May 12 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
Python读取指定日期邮件的实例
Feb 01 Python
Python如何优雅获取本机IP方法
Nov 10 Python
Python求解正态分布置信区间教程
Nov 20 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
python实现图像全景拼接
Mar 27 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 Python
python 实现ping测试延迟的两种方法
Dec 10 Python
python实现控制台输出颜色
Mar 02 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
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
JS实现窗口加载时模拟鼠标移动的方法
2015/06/03 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
2016/01/04 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
jquery实现input框获取焦点的简单实例
2017/01/26 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
2017/03/04 Javascript
将angular-ui的分页组件封装成指令的方法详解
2017/05/10 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
Python实用日期时间处理方法汇总
2015/05/09 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
python类的实例化问题解决
2019/08/31 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
python3将变量输入的简单实例
2020/08/19 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
毕业横幅标语
2014/10/08 职场文书
家长会欢迎词
2015/01/23 职场文书
培训后的感想
2015/08/07 职场文书
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers