截取网页指定范围存储为图片

1、需要安装pillow,这是PIL后续版本

2、确认要截取的网页元素ID,通过chrom浏览器查看

3、代码

https://blog.csdn.net/qq_18298049/article/details/117194464

https://www.cnblogs.com/yanyongfu/articles/17600408.html

from selenium import webdriver
from selenium.webdriver.common.by import By
from PIL import Image
from io import BytesIO

# 创建Chrome浏览器驱动
driver = webdriver.Chrome()

# 打开网页
driver.get('https://www.baidu.com')

# 使用id属性定位要截取的元素
element = driver.find_element(By.ID, 'lg')

# 获取元素的位置和大小
location = element.location
size = element.size

# 截取整个页面的截图
screenshot = driver.get_screenshot_as_png()

# 将字节流转换为Image对象
image = Image.open(BytesIO(screenshot))

# 根据元素的位置和大小,截取指定区域的图片
x = location['x']
y = location['y']
width = size['width']
height = size['height']
crop_image = image.crop((x, y, x+width, y+height))

# 保存截取的图片
crop_image.save('cropped_image.png')

# 关闭浏览器驱动
driver.quit()

需要用户密码验证登录截取

from selenium import webdriver
from selenium.webdriver.common.by import By
from PIL import Image
from io import BytesIO
import time

# 创建Chrome浏览器驱动
driver = webdriver.Chrome()
driver.maximize_window()

# 打开网页
driver.get('http://172.30.64.45:8080/ords/r/yunwei/hik/%E7%9B%91%E6%8E%A7%E5%B7%A1%E6%A3%80%E6%8A%A5%E8%A1%A8?session=16063481973315')
print('网页打开')
time.sleep(10)

# 找到用户名和密码的输入框,并输入登录信息
print('用户框')
username_input = driver.find_element(By.ID, 'P9999_USERNAME')
print('密码框')
password_input = driver.find_element(By.ID, 'P9999_PASSWORD')
print('用户')
username_input.send_keys('JIAEN')
print('密码')
password_input.send_keys('Jiaen#2020')

# 找到登录按钮,并点击登录
print('登录')
login_button = driver.find_element(By.ID, 'B2896743598369359')
login_button.click()

# 等待登录完成,可以根据实际情况调整等待时间
driver.implicitly_wait(10)

# 点击页面顶部按钮
t_Button_header = driver.find_element(By.ID, 't_Button_navControl')
t_Button_header.click()

# 点击页面左边菜单按钮
t_Button_header = driver.find_element(By.ID, 't_TreeNav_11')
t_Button_header.click()
driver.implicitly_wait(10)



# 使用id属性定位要截取的元素
print('获取元素')
element = driver.find_element(By.ID, 'R9817811809253803_jet')
time.sleep(10)
# element = driver.find_element(By.CLASS_NAME, 's_ipt')
print('位置大小')
# 获取元素的位置和大小
location = element.location
size = element.size

# 截取整个页面的截图
print('截取页面图片')
screenshot = driver.get_screenshot_as_png()

# 将字节流转换为Image对象
image = Image.open(BytesIO(screenshot))

# 根据元素的位置和大小,截取指定区域的图片
print('元素的位置和大小')

x = location['x']
y = location['y']
width = size['width']
height = size['height']
crop_image = image.crop((x, y, x+width, y+height))

# 保存截取的图片
print('保存截取的图片')

crop_image.save('d:/cropped_image.png')

# 关闭浏览器驱动
driver.quit()

Linux执行脚本

import selenium
from selenium import common
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

from selenium.webdriver import Chrome
from PIL import Image
from io import BytesIO
import time

# 创建Chrome浏览器驱动
"""options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-extensions')
options.add_argument('--headless')
"""

options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-extensions')
options.add_argument('--headless')

service = Service('/root/.cache/selenium/chromedriver/linux64/115.0.5790.170/chromedriver')
driver = webdriver.Chrome(service=service, options=options)
# driver = webdriver.Chrome(options = options)
driver.maximize_window()
# driver.minimize_window()


# 打开网页
driver.get('http://172.30.7.23/index.php')
print('网页打开')
# time.sleep(3)

# 找到用户名和密码的输入框,并输入登录信息
print('找到用户框')
username_input = driver.find_element(By.ID, 'name')
print('找到密码框')
password_input = driver.find_element(By.ID, 'password')
print('输入用户')
username_input.send_keys('Admin')
print('输入密码')
password_input.send_keys('zabbix')

# 找到登录按钮,并点击登录
print('开始登录')
login_button = driver.find_element(By.ID, 'enter')
login_button.click()

# 等待登录完成,可以根据实际情况调整等待时间
driver.implicitly_wait(10)

# 点击页面顶部按钮
print("点击监测")
t_Button_header = driver.find_element(By.CLASS_NAME, 'icon-monitoring')
t_Button_header.click()

# 点击页面左边菜单按钮
print("点击拓扑图")
t_Button_header = driver.find_element(By.LINK_TEXT, '拓扑图')
t_Button_header.click()
driver.implicitly_wait(10)


# 点击页面左边菜单按钮
print("点击所有地图")
try:
    t_Button_header = driver.find_element(By.LINK_TEXT, '所有地图')
    t_Button_header.click()
    driver.implicitly_wait(10)
except selenium.common.exceptions.NoSuchElementException as e:
    print("找不到关键字所有地图")


print('点击test地图')


# 点击页面左边菜单按钮
t_Button_header = driver.find_element(By.LINK_TEXT, 'test')
t_Button_header.click()
driver.implicitly_wait(10)





# 使用id属性定位要截取的元素
print('显示业务地图')
element = driver.find_element(By.ID, 'flickerfreescreen_mapimg')
time.sleep(5)
# element = driver.find_element(By.CLASS_NAME, 's_ipt')
print('位置大小')
# 获取元素的位置和大小
location = element.location
size = element.size

# 截取整个页面的截图
print('截取页面图片')
screenshot = driver.get_screenshot_as_png()

# 将字节流转换为Image对象
image = Image.open(BytesIO(screenshot))

# 根据元素的位置和大小,截取指定区域的图片
print('元素的位置和大小')

x = location['x']
y = location['y']
width = size['width']
height = size['height']
crop_image = image.crop((x, y, x+width, y+height))

# 保存截取的图片
print('保存截取的图片')

crop_image.save('/tmp/cropped_image.png')

# 关闭浏览器驱动
driver.quit()