Python+Selenium实现网页截图

按网页模块截图

  最近的项目需要对网页进行自动化截图,可以使用Python和Selenium来实现。

1.截整个网页

  对整个网页进行截图的时候只需要注意一点,当网页太长在浏览器里一屏显示不完的时候,需要修改窗口大小让完整网页能在一屏显示完全,否则会出现截图不全的情况。具体代码如下:

from selenium import webdriver
from PIL import Image
import time

url='https://cn.bing.com/search?q=pyspark'
option=webdriver.ChromeOptions()
option.add_argument('headless')
driver=webdriver.Chrome(options=option)

driver.get(url)
width = driver.execute_script("return document.documentElement.scrollWidth")
height = driver.execute_script("return document.documentElement.scrollHeight")
driver.set_window_size(width,height) #修改浏览器窗口大小

#获取整个网页截图
driver.get_screenshot_as_file('webpage.png')
print("整个网页尺寸:height={},width={}".format(height,width))
im=Image.open('webpage.png')
print("截图尺寸:height={},width={}".format(im.size[1],im.size[0]))

代码输出结果为:

整个网页尺寸:height=2527,width=1164
截图尺寸:height=2527,width=1164
2.指定部分截图

 &emsp:对网页指定部分截图一般有两个思路:一是直接使用selenium提供的element.screenshot()方法;二是在得到的网页完整图片上按照元素块抠图。

2.1 element.screenshot()方法
from selenium import webdriver
from PIL import Image
import time

url='https://cn.bing.com/search?q=pyspark'
option=webdriver.ChromeOptions()
option.add_argument('headless')
driver=webdriver.Chrome(options=option)

driver.get(url)
time.sleep(2)
width = driver.execute_script("return document.documentElement.scrollWidth")
height = driver.execute_script("return document.documentElement.scrollHeight")
driver.set_window_size(width,height) #修改浏览器窗口大小

#搜索结果部分完整截图
r_node=driver.find_element(by='xpath',value='//ol')
print('网页模块尺寸:height={},width={}'.format(r_node.size['height'],r_node.size['width']))
r_node.screenshot('bing_results.png')
im=Image.open('bing_results.png')
print("截图尺寸:height={},width={}".format(im.size[1],im.size[0]))

运行结果如下:

网页模块尺寸:height=2480,width=648
截图尺寸:height=2480,width=648

这里要特别注意一点,为了保证得到元素块的完整截图,依然要按照整个网页的大小调整浏览器窗口大小。否则代码运行结果可能如下(这个时候截图不全):

网页模块尺寸:height=2480,width=648
截图尺寸:height=419,width=648
2.2 抠图
from selenium import webdriver
from PIL import Image
import time

url='https://cn.bing.com/search?q=pyspark'
option=webdriver.ChromeOptions()
option.add_argument('headless')
driver=webdriver.Chrome(options=option)

driver.get(url)
time.sleep(2)
width = driver.execute_script("return document.documentElement.scrollWidth")
height = driver.execute_script("return document.documentElement.scrollHeight")
driver.set_window_size(width,height) #修改浏览器窗口大小
time.sleep(2)
#搜索结果部分完整截图
r_node=driver.find_element(by='xpath',value='//ol')
print('网页模块尺寸:height={},width={}'.format(r_node.size['height'],r_node.size['width']))

#使用抠图的方式获得网页指定部分的截图
driver.get_screenshot_as_file('bing_results.png')# 得到整个网页的完整截图
webpage=Image.open('bing_results.png')
left,upper=r_node.location['x'],r_node.location['y']
right,bottom=left+r_node.size['width'],upper+r_node.size['height']#定位r_node的四个顶点的位置
image_crop=webpage.crop(box=(left,upper,right,bottom))
image_crop.save('bing_results.png')
image_crop=Image.open('bing_results.png')
print("抠图尺寸:height={},width={}".format(image_crop.height,image_crop.width))

代码运行结果如下:

网页模块尺寸:height=2480,width=648
抠图尺寸:height=2480,width=648

Tips:由于必应的搜索结果不固定,具体的图片尺寸可能会有出入。

参考
  1. https://blog.csdn.net/xiongzaiabc/article/details/82912280

你可能感兴趣的:(Python,python,selenium,开发语言)