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备份Mysql脚本
Aug 11 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
Django 前后台的数据传递的方法
Aug 08 Python
Python使用matplotlib绘制三维图形示例
Aug 25 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 Python
如何在django里上传csv文件并进行入库处理的方法
Jan 02 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
python验证身份证信息实例代码
May 06 Python
Puppeteer使用示例详解
Jun 20 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
Apr 08 Python
什么是python的函数体
Jun 19 Python
Python实现学生管理系统(面向对象版)
Jun 24 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 随机数的深入理解
2013/06/05 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
用户注册常用javascript代码
2009/08/29 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
深入理解ES6之数据解构的用法
2018/01/13 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
Vue.js实现tab切换效果
2019/07/24 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
微信小程序canvas实现签名功能
2021/01/19 Javascript
Python中用于返回绝对值的abs()方法
2015/05/14 Python
Python定时器实例代码
2017/11/01 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
Python 获取div标签中的文字实例
2018/12/20 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
Python tkinter实现日期选择器
2021/02/22 Python
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
网上商城创业计划书范文
2014/01/31 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
小学中等生评语
2014/12/29 职场文书