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里隐藏的“禅”
Jun 16 Python
python中随机函数random用法实例
Apr 30 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
基于DataFrame改变列类型的方法
Jul 25 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
Django 博客实现简单的全文搜索的示例代码
Feb 17 Python
解决Python logging模块无法正常输出日志的问题
Feb 21 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 Python
Python实现EM算法实例代码
Oct 04 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 Python
深入浅析Django MTV模式
Sep 04 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 编写的日历
2006/10/09 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
JavaScript 无符号右移运算符
2009/04/17 Javascript
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
node.js超时timeout详解
2014/11/26 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
jQuery+CSS3实现仿花瓣网固定顶部位置带悬浮效果的导航菜单
2016/09/21 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
Python import自定义模块方法
2015/02/12 Python
Unicode和Python的中文处理
2017/03/19 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
浅谈Python中的继承
2020/06/19 Python
解决pip install psycopg2出错问题
2020/07/09 Python
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
临床医学系毕业生推荐信
2013/11/09 职场文书
交通安全演讲稿
2014/01/07 职场文书
人事专员工作职责
2014/02/22 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
给老婆道歉的话
2015/01/20 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
golang 实现并发求和
2021/05/08 Golang
pt-archiver 主键自增
2022/04/26 MySQL
关于Redis的主从复制及哨兵问题
2022/06/16 Redis