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 相关文章推荐
有关wxpython pyqt内存占用问题分析
Jun 09 Python
理解Python中函数的参数
Apr 27 Python
python中base64加密解密方法实例分析
May 16 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
微信跳一跳python代码实现
Jan 05 Python
python读文件保存到字典,修改字典并写入新文件的实例
Apr 23 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
django数据库自动重连的方法实例
Jul 21 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
Python竟然能剪辑视频
May 25 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
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
js实现返回顶部效果
2017/03/10 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
Python抓取京东图书评论数据
2014/08/31 Python
Python字典操作简明总结
2015/04/13 Python
python web基础之加载静态文件实例
2018/03/20 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
入党积极分子评语
2014/05/04 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书