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入门篇之面向对象
Oct 20 Python
python模拟事件触发机制详解
Jan 19 Python
django自带的server 让外网主机访问方法
May 14 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
Python中实现单例模式的n种方式和原理
Nov 14 Python
树莓派极简安装OpenCv的方法步骤
Oct 10 Python
python logging日志模块原理及操作解析
Oct 12 Python
python线程定时器Timer实现原理解析
Nov 30 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
python模拟哔哩哔哩滑块登入验证的实现
Apr 24 Python
python如何修改文件时间属性
Feb 05 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中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
javascript textContent与innerText的异同分析
2010/10/22 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
JQuery中上下文选择器实现方法
2015/05/18 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
基于python编写的微博应用
2014/10/17 Python
Python 字典dict使用介绍
2014/11/30 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
电子专业推荐信范文
2013/11/18 职场文书
甲方资料员岗位职责
2013/12/13 职场文书
小学生元旦感言
2014/02/26 职场文书
大学生应聘导游自荐信
2014/06/02 职场文书
我的中国梦口号
2014/06/16 职场文书
领导班子个人对照检查材料(群众路线)
2014/09/26 职场文书
英语导游词
2015/02/13 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
利用Python实现Picgo图床工具
2021/11/23 Python
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技