需求:

截屏后转PDF。

问题:

selenium截屏后,图片未加载

如下图:

原因:

网站使用了懒加载技术:只有在浏览器中纵向滚动条滚动到指定的位置时,页面的元素才会被动态加载。

什么是图片懒加载?

图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间。

为了解决这种问题,通过前后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减少首屏图片请求数的技术就被称为“图片懒加载”。

解决:

模拟人滚动滚动条的行为, 实现页面的加载

模拟人滚动滚动条的代码:

  1. js_height = "return document.body.clientHeight"
  2. driver.get(link)
  3. k = 1
  4. height = driver.execute_script(js_height)
  5. while True:
  6. if k * 500 < height:
  7. js_move = "window.scrollTo(0,{})".format(k * 500)
  8. print(js_move)
  9. driver.execute_script(js_move)
  10. time.sleep(0.2)
  11. height = driver.execute_script(js_height)
  12. k += 1
  13. else:
  14. break

  

全部代码:

  1. #!/usr/bin/python3
  2. # -*- coding:utf-8 -*-
  3. """
  4. @author: lms
  5. @file: screenshot.py
  6. @time: 2020/10/10 13:02
  7. @desc:
  8. """
  9.  
  10. import time
  11. from selenium import webdriver
  12. from selenium.webdriver.chrome.options import Options
  13. from PIL import Image
  14.  
  15. def screenshot_and_convert_to_pdf(link):
  16. path = './'
  17.  
  18. # 一定要使用无头模式,不然截不了全页面,只能截到你电脑的高度
  19. chrome_options = Options()
  20. chrome_options.add_argument('--headless')
  21. chrome_options.add_argument('--disable-gpu')
  22. chrome_options.add_argument('--no-sandbox')
  23. driver = webdriver.Chrome(chrome_options=chrome_options)
  24. try:
  25. driver.implicitly_wait(20)
  26. driver.get(link)
  27.  
  28. # 模拟人滚动滚动条,处理图片懒加载问题
  29. js_height = "return document.body.clientHeight"
  30. driver.get(link)
  31. k = 1
  32. height = driver.execute_script(js_height)
  33. while True:
  34. if k * 500 < height:
  35. js_move = "window.scrollTo(0,{})".format(k * 500)
  36. print(js_move)
  37. driver.execute_script(js_move)
  38. time.sleep(0.2)
  39. height = driver.execute_script(js_height)
  40. k += 1
  41. else:
  42. break
  43.  
  44. time.sleep(1)
  45. # 接下来是全屏的关键,用js获取页面的宽高
  46. width = driver.execute_script("return document.documentElement.scrollWidth")
  47. height = driver.execute_script("return document.documentElement.scrollHeight")
  48. print(width, height)
  49. # 将浏览器的宽高设置成刚刚获取的宽高
  50. driver.set_window_size(width, height)
  51. time.sleep(1)
  52.  
  53. png_path = path + '/{}.png'.format('123456')
  54. # pdf_url = SERVER_URL + '/static/global_tech_map/{}.pdf'.format(.pic_num)
  55. # 截图并关掉浏览器
  56. driver.save_screenshot(png_path)
  57. driver.close()
  58. # png转pdf
  59. image1 = Image.open(png_path)
  60. im1 = image1.convert('RGB')
  61. pdf_path = png_path.replace('.png', '.pdf')
  62. im1.save(pdf_path)
  63.  
  64. except Exception as e:
  65. print(e)
  66.  
  67. if __name__ == '__main__':
  68. screenshot_and_convert_to_pdf('https://mp.weixin.qq.com/s/nJRnGpPVeJ1kdMIOwiPNpg')

  

处理完成后的截屏:

感谢阅读~

Selenium截屏 图片未加载的问题解决--【懒加载】的更多相关文章

  1. IOS第17天(2,Quartz2D图片剪裁变圆行图,和截屏图片)

    **** #import "HMViewController.h" #import "UIImage+Tool.h" @interface HMViewCont ...

  2. 使用 vant 的 v-lazy 实现图片 vue 在移动端的懒加载

    官方文档:https://youzan.github.io/vant/#/zh-CN/lazyload 引入 Lazyload 是 Vue 指令,使用前需要对指令进行注册 import Vue fro ...

  3. vue 中监测滚动条加载数据(懒加载数据)

    vue 中监测滚动条加载数据(懒加载数据) 1:钩子函数监听滚动事件: mounted () { this.$nextTick(function () { window.addEventListene ...

  4. js 利用canvas + flv.js实现视频流 截屏 、本地下载功能实现,兼容火狐,谷歌;canvas截屏跨域问题,无音频视频流加载不显示问题

    项目:物联网监控项目----后台视频流管理(前端实现视频截屏功能) 本文就不同视频源分情况展示: 1 本地视频(项目同目录视频)截屏(canvas.getContext("2d).drawI ...

  5. vue中使用html2canvas及解决html2canvas截屏图片模糊问题

    最近在项目中用到了html2canvas插件,遇到的一些坑写下来,与大家共勉. html2canvas  官方网站http://html2canvas.hertzen.com/index.html 这 ...

  6. 完美解决scrollView 截屏图片模糊

    UIGraphicsBeginImageContext   首先说明一下UIGraphicsBeginImageContextWithOptions 和UIGraphicsBeginImageCont ...

  7. js实现图片(高度不确定)懒加载

    最近一直在弄广告页,由于广告页几乎都是图片拼凑起来的,为了减少服务器压力和带宽,采用图片懒加载方式,但是我们的图片高度又不确定,所以我在网上下载了echo.js自己改了一下. 大体思路是:让首页先加载 ...

  8. 图片利用 new Image()预加载原理 和懒加载的实现原理

    二:预加载和懒加载的区别 预加载与懒加载,我们经常经常用到,这些技术不仅仅限于图片加载,我们今天讨论的是图片加载: 图片预加载:顾名思义,图片预加载就是在网页全部加载之前,提前加载图片.当用户需要查看 ...

  9. pytest框架优化——将异常截屏图片加入到allure报告中

    痛点分析: 在做allure定制化的时候,关于附件添加这一块,我们在代码里可以添加我们准备好的附件,这里用图片,通过下面的方法就能实现 allure.attach(file, '图片描述', allu ...

随机推荐

  1. Spring JPA 定义查询方法

    Spring JPA 定义查询方法 翻译:Defining Query Methods ​ 存储库代理有两种方式基于方法名派生特定域的查询方式: 直接从方法名派生查询 自定义查询方式 ​ 可用选项基于 ...

  2. 不支持原子性的 Redis 事务也叫事务吗?

    文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 假设现在有这样一个业务,用户获取的某些数据来自第三方接口信息,为避免频繁请求第三方接口,我们往往会加一层缓存,缓存肯定要 ...

  3. springboot x.x.x RELEASE pom 第一行报错解决办法

    springboot x.x.x RELEASE pom 第一行报错解决办法 在pom.xml 文件的properties中加入maven jar插件的版本号 <properties> & ...

  4. Redis 6.0.8 紧急发布,请尽快升级!

    大家周末愉快啊,今天分享一则重要通知. Redis 6.0.8 于 2020/9/10 日晚紧急发布!!! 可以看到这是一个紧急更新版本,使用了 Redis 6.0.7 Sentinel(哨兵)以及 ...

  5. 蓝奏网盘API

    蓝奏云网盘API 2.0 基于Python3实现,最强的蓝奏云API~ 蓝奏云注册 更新说明 修复了登录时 formhash 错误的问题 解决了多次上传大文件被限制的问题 #3 细化 API 接口的功 ...

  6. 一起来读官方文档-----SpringIOC(04)

    1.4.2.依赖性和详细配置 如上一节所述,您可以将bean属性和构造函数参数定义为对其他托管bean(协作者)的引用或内联定义的值.Spring的基于XML的配置元数据为此目的在其和元素中支持子元素 ...

  7. js中数组Array对象的方法sort()的应用

    一. sort()方法的介绍 //给一组数据排序 var arrNum = [12,1,9,23,56,100,88,66]; console.log("排序前的数组:"+arrN ...

  8. 分别用canvas和css3的transform做出钟表的效果

    两种方式实际上在js上的原理都是一样的.都是获取时间对象,再获取时间对象的时分秒,时分秒乘以其旋转一刻度(一秒.一分.一小时)对应的角度.css3中要赋值于transform:rotate(角度),c ...

  9. 【C#上位机必看】你们要的Iot物联网项目来了

    新阁教育喜科堂不得不说,工业圈是个比较奇怪的圈子,各种各样的项目需求都有,有的人就希望价格低,功能实现即可,有的人又不在乎价格,就要界面好看.最近有一个小伙伴又提出了这样的需求,用最简单的方式,最低的 ...

  10. 在VS2019使用MASM编写汇编程序

    具体的配置步骤可以参考: 汇编环境搭建 Windows10 VS2019 MASM32 本文主要是入门向的教程,VS2019中要调用C语言函数需要加上 includelib ucrt.lib incl ...