本文目录导读:

- 浏览器自动化截图(Python + Selenium)
- 系统级截图(Python + Pillow/PyAutoGUI)
- JavaScript实现网页截图
- 命令行工具
- 定时自动截图脚本
- 浏览器扩展开发(Chrome扩展)
- 高级应用:监控系统变化
- 使用建议:
我来介绍几种实现自动化截图的方法,涵盖不同平台和使用场景:
浏览器自动化截图(Python + Selenium)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
# 配置浏览器选项
chrome_options = Options()
chrome_options.add_argument('--headless') # 无头模式
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--window-size=1920,1080')
# 启动浏览器
driver = webdriver.Chrome(options=chrome_options)
try:
# 打开网页
driver.get('https://example.com')
time.sleep(2) # 等待页面加载
# 全页面截图
driver.save_screenshot('full_page.png')
# 元素截图
element = driver.find_element_by_class_name('content')
element.screenshot('element.png')
# 特定区域截图
driver.get_screenshot_as_file('region.png')
finally:
driver.quit()
系统级截图(Python + Pillow/PyAutoGUI)
import pyautogui
from PIL import ImageGrab
import time
# 全屏截图
pyautogui.screenshot('screen.png')
# 特定区域截图
region = (100, 100, 800, 600)
pyautogui.screenshot('region.png', region=region)
# 使用PIL
image = ImageGrab.grab(bbox=(0, 0, 1920, 1080))
image.save('screen_full.png')
# 多窗口截图
def screenshot_window(window_title):
import win32gui
import win32ui
import win32con
# 查找窗口
hwnd = win32gui.FindWindow(None, window_title)
if hwnd:
# 获取窗口尺寸
left, top, right, bottom = win32gui.GetWindowRect(hwnd)
width = right - left
height = bottom - top
# 截图
image = ImageGrab.grab(bbox=(left, top, right, bottom))
image.save(f'{window_title}.png')
# 调用截图特定窗口
screenshot_window('记事本')
JavaScript实现网页截图
// 使用html2canvas库
async function captureElement(element) {
const canvas = await html2canvas(element);
const image = canvas.toDataURL('image/png');
// 下载图片
const link = document.createElement('a');
link.download = 'screenshot.png';
link.href = image;
link.click();
}
// 使用现代浏览器API
async function captureScreen() {
try {
const stream = await navigator.mediaDevices.getDisplayMedia();
const track = stream.getVideoTracks()[0];
const imageCapture = new ImageCapture(track);
const bitmap = await imageCapture.grabFrame();
// 转换为图片
const canvas = document.createElement('canvas');
canvas.width = bitmap.width;
canvas.height = bitmap.height;
canvas.getContext('2d').drawImage(bitmap, 0, 0);
const image = canvas.toDataURL('image/png');
stream.getTracks().forEach(track => track.stop());
return image;
} catch (error) {
console.error('截图失败:', error);
}
}
命令行工具
# Windows使用PowerShell
powershell -command "Add-Type -AssemblyName System.Windows.Forms; $screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds; $bitmap = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height); $graphics = [System.Drawing.Graphics]::FromImage($bitmap); $graphics.CopyFromScreen($screen.Location, [System.Drawing.Point]::Empty, $screen.Size); $bitmap.Save('screenshot.png')"
# 使用scrot(Linux)
scrot -d 5 'screenshot.png' # 延迟5秒截图
scrot -s 'selected.png' # 选择区域截图
# 使用import(ImageMagick)
import -window root screenshot.png # 截取整个屏幕
定时自动截图脚本
import time
import datetime
from PIL import ImageGrab
import os
def scheduled_screenshot():
# 创建保存目录
if not os.path.exists('screenshots'):
os.makedirs('screenshots')
for i in range(10): # 截取10次
# 获取当前时间
timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
# 截图
image = ImageGrab.grab()
# 保存文件
filename = f'screenshots/{timestamp}.png'
image.save(filename)
print(f'保存: {filename}')
# 等待5分钟
time.sleep(300)
if __name__ == '__main__':
scheduled_screenshot()
浏览器扩展开发(Chrome扩展)
// manifest.json
{
"manifest_version": 3,
"name": "自动截图扩展",
"version": "1.0",
"permissions": ["activeTab", "tabs"],
"background": {
"service_worker": "background.js"
},
"action": {
"default_popup": "popup.html"
}
}
// background.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === 'capture') {
chrome.tabs.captureVisibleTab((dataUrl) => {
sendResponse({ screenshot: dataUrl });
});
}
});
高级应用:监控系统变化
import os
from PIL import Image, ImageChops
def monitor_screen(template, threshold=0.05):
"""监控屏幕变化"""
while True:
# 截图当前画面
current = ImageGrab.grab()
# 与模板比较
diff = ImageChops.difference(current, template)
diff_bbox = diff.getbbox()
if diff_bbox is None:
print("画面无变化")
else:
# 计算差异程度
diff_area = (diff_bbox[2] - diff_bbox[0]) * (diff_bbox[3] - diff_bbox[1])
total_area = current.width * current.height
if diff_area / total_area > threshold:
print(f"检测到显著变化,保存截图")
current.save('change_detected.png')
break
time.sleep(5) # 每5秒检查一次
使用建议:
- 性能优化:对于高频率截图,考虑使用无头浏览器或更轻量的库
- 错误处理:添加异常处理和重试机制
- 存储管理:定期清理旧的截图文件
- 并发处理:如果截图操作频繁,考虑使用多线程
选择哪种方案取决于你的具体需求:
- 网页测试:使用 Selenium 或 Playwright
- 系统监控:使用 PyAutoGUI 或 PIL
- 批量处理:使用命令行工具
- 浏览器扩展:开发 Chrome extension
需要我详细展开某个特定方案的实现吗?