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实现的udp协议Server和Client代码实例
Jun 04 Python
跟老齐学Python之传说中的函数编写条规
Oct 11 Python
Python中的进程分支fork和exec详解
Apr 11 Python
python 第三方库的安装及pip的使用详解
May 11 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
Python之修改图片像素值的方法
Jul 03 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
Jun 10 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
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
浅谈JS原生Ajax,GET和POST
2016/06/08 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
Python中实现对list做减法操作介绍
2015/01/09 Python
Python返回真假值(True or False)小技巧
2015/04/10 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
Flask框架 CSRF 保护实现方法详解
2019/10/30 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
html5唤起app的方法
2017/11/30 HTML / CSS
锐步英国官网:Reebok英国
2019/11/29 全球购物
什么是反射
2012/03/17 面试题
经济信息系毕业生自荐信
2014/06/02 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
导游词之凤凰古城
2019/10/22 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS