Selenium截屏 图片未加载的问题解决--【懒加载】
需求:
截屏后转PDF。
问题:
selenium截屏后,图片未加载
如下图:
原因:
网站使用了懒加载技术:只有在浏览器中纵向滚动条滚动到指定的位置时,页面的元素才会被动态加载。
什么是图片懒加载?
图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间。
为了解决这种问题,通过前后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减少首屏图片请求数的技术就被称为“图片懒加载”。
解决:
模拟人滚动滚动条的行为, 实现页面的加载
模拟人滚动滚动条的代码:
- js_height = "return document.body.clientHeight"
- driver.get(link)
- k = 1
- height = driver.execute_script(js_height)
- while True:
- if k * 500 < height:
- js_move = "window.scrollTo(0,{})".format(k * 500)
- print(js_move)
- driver.execute_script(js_move)
- time.sleep(0.2)
- height = driver.execute_script(js_height)
- k += 1
- else:
- break
全部代码:
- #!/usr/bin/python3
- # -*- coding:utf-8 -*-
- """
- @author: lms
- @file: screenshot.py
- @time: 2020/10/10 13:02
- @desc:
- """
- import time
- from selenium import webdriver
- from selenium.webdriver.chrome.options import Options
- from PIL import Image
- def screenshot_and_convert_to_pdf(link):
- path = './'
- # 一定要使用无头模式,不然截不了全页面,只能截到你电脑的高度
- chrome_options = Options()
- chrome_options.add_argument('--headless')
- chrome_options.add_argument('--disable-gpu')
- chrome_options.add_argument('--no-sandbox')
- driver = webdriver.Chrome(chrome_options=chrome_options)
- try:
- driver.implicitly_wait(20)
- driver.get(link)
- # 模拟人滚动滚动条,处理图片懒加载问题
- js_height = "return document.body.clientHeight"
- driver.get(link)
- k = 1
- height = driver.execute_script(js_height)
- while True:
- if k * 500 < height:
- js_move = "window.scrollTo(0,{})".format(k * 500)
- print(js_move)
- driver.execute_script(js_move)
- time.sleep(0.2)
- height = driver.execute_script(js_height)
- k += 1
- else:
- break
- time.sleep(1)
- # 接下来是全屏的关键,用js获取页面的宽高
- width = driver.execute_script("return document.documentElement.scrollWidth")
- height = driver.execute_script("return document.documentElement.scrollHeight")
- print(width, height)
- # 将浏览器的宽高设置成刚刚获取的宽高
- driver.set_window_size(width, height)
- time.sleep(1)
- png_path = path + '/{}.png'.format('123456')
- # pdf_url = SERVER_URL + '/static/global_tech_map/{}.pdf'.format(.pic_num)
- # 截图并关掉浏览器
- driver.save_screenshot(png_path)
- driver.close()
- # png转pdf
- image1 = Image.open(png_path)
- im1 = image1.convert('RGB')
- pdf_path = png_path.replace('.png', '.pdf')
- im1.save(pdf_path)
- except Exception as e:
- print(e)
- if __name__ == '__main__':
- screenshot_and_convert_to_pdf('https://mp.weixin.qq.com/s/nJRnGpPVeJ1kdMIOwiPNpg')
处理完成后的截屏:
感谢阅读~
Selenium截屏 图片未加载的问题解决--【懒加载】的更多相关文章
- IOS第17天(2,Quartz2D图片剪裁变圆行图,和截屏图片)
**** #import "HMViewController.h" #import "UIImage+Tool.h" @interface HMViewCont ...
- 使用 vant 的 v-lazy 实现图片 vue 在移动端的懒加载
官方文档:https://youzan.github.io/vant/#/zh-CN/lazyload 引入 Lazyload 是 Vue 指令,使用前需要对指令进行注册 import Vue fro ...
- vue 中监测滚动条加载数据(懒加载数据)
vue 中监测滚动条加载数据(懒加载数据) 1:钩子函数监听滚动事件: mounted () { this.$nextTick(function () { window.addEventListene ...
- js 利用canvas + flv.js实现视频流 截屏 、本地下载功能实现,兼容火狐,谷歌;canvas截屏跨域问题,无音频视频流加载不显示问题
项目:物联网监控项目----后台视频流管理(前端实现视频截屏功能) 本文就不同视频源分情况展示: 1 本地视频(项目同目录视频)截屏(canvas.getContext("2d).drawI ...
- vue中使用html2canvas及解决html2canvas截屏图片模糊问题
最近在项目中用到了html2canvas插件,遇到的一些坑写下来,与大家共勉. html2canvas 官方网站http://html2canvas.hertzen.com/index.html 这 ...
- 完美解决scrollView 截屏图片模糊
UIGraphicsBeginImageContext 首先说明一下UIGraphicsBeginImageContextWithOptions 和UIGraphicsBeginImageCont ...
- js实现图片(高度不确定)懒加载
最近一直在弄广告页,由于广告页几乎都是图片拼凑起来的,为了减少服务器压力和带宽,采用图片懒加载方式,但是我们的图片高度又不确定,所以我在网上下载了echo.js自己改了一下. 大体思路是:让首页先加载 ...
- 图片利用 new Image()预加载原理 和懒加载的实现原理
二:预加载和懒加载的区别 预加载与懒加载,我们经常经常用到,这些技术不仅仅限于图片加载,我们今天讨论的是图片加载: 图片预加载:顾名思义,图片预加载就是在网页全部加载之前,提前加载图片.当用户需要查看 ...
- pytest框架优化——将异常截屏图片加入到allure报告中
痛点分析: 在做allure定制化的时候,关于附件添加这一块,我们在代码里可以添加我们准备好的附件,这里用图片,通过下面的方法就能实现 allure.attach(file, '图片描述', allu ...
随机推荐
- Spring JPA 定义查询方法
Spring JPA 定义查询方法 翻译:Defining Query Methods 存储库代理有两种方式基于方法名派生特定域的查询方式: 直接从方法名派生查询 自定义查询方式 可用选项基于 ...
- 不支持原子性的 Redis 事务也叫事务吗?
文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 假设现在有这样一个业务,用户获取的某些数据来自第三方接口信息,为避免频繁请求第三方接口,我们往往会加一层缓存,缓存肯定要 ...
- springboot x.x.x RELEASE pom 第一行报错解决办法
springboot x.x.x RELEASE pom 第一行报错解决办法 在pom.xml 文件的properties中加入maven jar插件的版本号 <properties> & ...
- Redis 6.0.8 紧急发布,请尽快升级!
大家周末愉快啊,今天分享一则重要通知. Redis 6.0.8 于 2020/9/10 日晚紧急发布!!! 可以看到这是一个紧急更新版本,使用了 Redis 6.0.7 Sentinel(哨兵)以及 ...
- 蓝奏网盘API
蓝奏云网盘API 2.0 基于Python3实现,最强的蓝奏云API~ 蓝奏云注册 更新说明 修复了登录时 formhash 错误的问题 解决了多次上传大文件被限制的问题 #3 细化 API 接口的功 ...
- 一起来读官方文档-----SpringIOC(04)
1.4.2.依赖性和详细配置 如上一节所述,您可以将bean属性和构造函数参数定义为对其他托管bean(协作者)的引用或内联定义的值.Spring的基于XML的配置元数据为此目的在其和元素中支持子元素 ...
- js中数组Array对象的方法sort()的应用
一. sort()方法的介绍 //给一组数据排序 var arrNum = [12,1,9,23,56,100,88,66]; console.log("排序前的数组:"+arrN ...
- 分别用canvas和css3的transform做出钟表的效果
两种方式实际上在js上的原理都是一样的.都是获取时间对象,再获取时间对象的时分秒,时分秒乘以其旋转一刻度(一秒.一分.一小时)对应的角度.css3中要赋值于transform:rotate(角度),c ...
- 【C#上位机必看】你们要的Iot物联网项目来了
新阁教育喜科堂不得不说,工业圈是个比较奇怪的圈子,各种各样的项目需求都有,有的人就希望价格低,功能实现即可,有的人又不在乎价格,就要界面好看.最近有一个小伙伴又提出了这样的需求,用最简单的方式,最低的 ...
- 在VS2019使用MASM编写汇编程序
具体的配置步骤可以参考: 汇编环境搭建 Windows10 VS2019 MASM32 本文主要是入门向的教程,VS2019中要调用C语言函数需要加上 includelib ucrt.lib incl ...