Selenium截屏 图片未加载的问题解决--【懒加载】

转载地址:https://www.cnblogs.com/liangmingshen/p/13794812.html

需求: 

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

 

上一篇:线程池


下一篇:Java 设计模式(三)命令模式