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 相关文章推荐
在Django中创建动态视图的教程
Jul 15 Python
Python3如何解决字符编码问题详解
Apr 23 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
Python实现Logger打印功能的方法详解
Sep 01 Python
python 函数传参之传值还是传引用的分析
Sep 07 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
python+jinja2实现接口数据批量生成工具
Aug 28 Python
Python如何优雅获取本机IP方法
Nov 10 Python
Python同时处理多个异常的方法
Jul 28 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
Mar 25 Python
Python 数据可视化工具 Pyecharts 安装及应用
Apr 20 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
DC动漫人物排行
2020/03/03 欧美动漫
4.与数据库的连接
2006/10/09 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
Yii清理缓存的方法
2016/01/06 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
JavaScript简介
2015/02/15 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
js+html制作简单验证码
2017/02/16 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
JavaScript实现开关等效果
2017/09/08 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
python实现类的静态变量用法实例
2015/05/08 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
vue项目实现分页效果
2021/03/24 Vue.js
企业管理专业个人求职信范文
2013/09/24 职场文书
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
岳麓书院导游词
2015/02/03 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
初中体育教学随笔
2015/08/15 职场文书