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构建XML树结构的方法示例
Jun 30 Python
Python set常用操作函数集锦
Nov 15 Python
Python工程师面试必备25条知识点
Jan 17 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
Python中print函数简单使用总结
Aug 05 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
基于python读取.mat文件并取出信息
Dec 16 Python
Python Pillow.Image 图像保存和参数选择方式
Jan 09 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 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
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
理解 javascript 中的函数表达式与函数声明
2017/07/07 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Python 正则表达式(转义问题)
2014/12/15 Python
Python每天必学之bytes字节
2016/01/28 Python
python 字典操作提取key,value的方法
2019/06/26 Python
python cumsum函数的具体使用
2019/07/29 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
python实现快递价格查询系统
2020/03/03 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
django 模版关闭转义方式
2020/05/14 Python
Python csv文件记录流程代码解析
2020/07/16 Python
教师新年寄语
2014/04/03 职场文书
代办委托书怎样写
2014/04/08 职场文书
小学生倡议书范文
2014/05/13 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server