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 字符串split的用法分享
Mar 23 Python
Python利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
基于python实现名片管理系统
Nov 30 Python
在Python函数中输入任意数量参数的实例
Jul 16 Python
python查找重复图片并删除(图片去重)
Jul 16 Python
python制作英语翻译小工具代码实例
Sep 09 Python
python tornado使用流生成图片的例子
Nov 18 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
Feb 11 Python
python3 中使用urllib问题以及urllib详解
Aug 03 Python
python用海龟绘图写贪吃蛇游戏
Jun 18 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函数
2010/02/16 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
javascript eval和JSON之间的联系
2009/12/31 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
pyside写ui界面入门示例
2014/01/22 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
Python多线程原理与用法详解
2018/08/20 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
python requests证书问题解决
2019/09/05 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
使用python求解二次规划的问题
2020/02/29 Python
用python实现学生管理系统
2020/07/24 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
计算机专业毕业生的自我评价
2013/11/18 职场文书
2013届毕业生求职信范文
2013/11/20 职场文书
个人素质的自我评价分享
2013/12/16 职场文书
美发店5.1活动方案
2014/01/24 职场文书
作文批改评语
2014/12/25 职场文书