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使用Pycrypto库进行RSA加密的方法详解
Jun 06 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
python 定时修改数据库的示例代码
Apr 08 Python
异步任务队列Celery在Django中的使用方法
Jun 07 Python
使用Python微信库itchat获得好友和群组已撤回的消息
Jun 24 Python
python发送告警邮件脚本
Sep 17 Python
运用Python的webbrowser实现定时打开特定网页
Feb 21 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
Python绘图实现台风路径可视化代码实例
Oct 23 Python
Python实现淘宝秒杀功能的示例代码
Jan 19 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
php文本转图片自动换行的方法
2013/03/13 PHP
Yii框架form表单用法实例
2014/12/04 PHP
微信支付扫码支付php版
2016/07/22 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
javascript 写类方式之一
2009/07/05 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
简单介绍Python中的readline()方法的使用
2015/05/24 Python
Python中的字符串类型基本知识学习教程
2016/02/04 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
python操作列表的函数使用代码详解
2017/12/28 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
如何在Django项目中引入静态文件
2019/07/26 Python
最新个人职业生涯规划书
2014/01/22 职场文书
小学语文教学反思
2014/02/10 职场文书
党员承诺践诺书
2014/05/20 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
安全教育培训心得体会
2016/01/15 职场文书