文章目录
- 抓取指定窗口通常需要获取窗口句柄,然后截图该窗口区域。不同操作系统方式略有不同,Windows支持最好。
- 步骤: 获取窗口坐标 用截图工具抓取该区域 示例代码: 安装依赖: pip install pygetwindow pyautogui ms import pygetwindow as gw import pyautogui # 获取所有窗口标题 print(gw.getAllTitles()) # 获取某个窗口(如“记事本”) win = gw.getWindowsWithTitle(‘记事本’)[0] print(win.left, win.top, win.width, win.height) # 截取窗口区域 region = (win.left, win.top, win.width, win.height) img = pyautogui.screenshot(region=region) img.save(‘window.png’)
- import mss with mss.mss() as sct: monitor = {“top”: win.top, “left”: win.left, “width”: win.width, “height”: win.height} sct_img = sct.grab(monitor) mss.tools.to_png(sct_img.rgb, sct_img.size, output=”window_mss.png”)
- 获取窗口位置需要用到pyobjc、python-xlib等,较为复杂,可参考 pygetwindow 文档。
- 可以用百度OCR、腾讯OCR、Google Tesseract OCR等,最常用的是 Tesseract。
- 安装: pip install pytesseract pillow 并安装 Tesseract 可执行文件。 代码: from PIL import Image import pytesseract img = Image.open(‘window.png’) text = pytesseract.image_to_string(img, lang=’chi_sim’) # 中文用 lang=’chi_sim’ print(text)
- import pyautogui from PIL import Image import pytesseract import pygetwindow as gw win = gw.getWindowsWithTitle(‘记事本’)[0] region = (win.left, win.top, win.width, win.height) img = pyautogui.screenshot(region=region) img.save(‘window.png’) text = pytesseract.image_to_string(img) print(text)
-
- 安装: pip install opencv-python pyautogui numpy 录制指定区域(如窗口): import cv2 import numpy as np import pygetwindow as gw import pyautogui win = gw.getWindowsWithTitle(‘记事本’)[0] region = (win.left, win.top, win.width, win.height) width, height = win.width, win.height fourcc = cv2.VideoWriter_fourcc(*”XVID”) out = cv2.VideoWriter(“window_record.avi”, fourcc, 10.0, (width, height)) for i in range(200): # 录制200帧 img = pyautogui.screenshot(region=region) frame = np.array(img) frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) out.write(frame) out.release() cv2.destroyAllWindows()
- import mss import cv2 import numpy as np import pygetwindow as gw win = gw.getWindowsWithTitle(‘记事本’)[0] monitor = {“top”: win.top, “left”: win.left, “width”: win.width, “height”: win.height} width, height = win.width, win.height fourcc = cv2.VideoWriter_fourcc(*”XVID”) out = cv2.VideoWriter(“window_mss_record.avi”, fourcc, 10.0, (width, height)) with mss.mss() as sct: for i in range(200): sct_img = sct.grab(monitor) frame = np.array(sct_img) frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) out.write(frame) out.release() cv2.destroyAllWindows()
- 抓取指定窗口:pygetwindow + pyautogui/mss 自动识别内容:pytesseract(OCR) 屏幕录制:opencv/mss
- 可以用 schedule、threading、time 等库实现定时任务,比如每隔5秒抓取一次指定窗口内容。
- 窗口变化主要有两类:
窗口内容变化:比如内容刷新、弹窗等
窗口位置/尺寸变化:比如用户拖动/缩放窗口
- 可以每次抓取前记录窗口的坐标和尺寸,和上一次对比: import pygetwindow as gw import time WINDOW_TITLE = ‘记事本’ last_rect = None while True: wins = gw.getWindowsWithTitle(WINDOW_TITLE) if not wins: print(‘窗口未找到’) time.sleep(1) continue win = wins[0] rect = (win.left, win.top, win.width, win.height) if last_rect != rect: print(f’窗口变化:{rect}’) last_rect = rect time.sleep(1)
- 可以对比两次截图的hash或像素差异,常用方法有: Pillow ImageChops.difference 感知哈希(pHash) 示例:用感知哈希检测内容变化 from PIL import Image import imagehash import pygetwindow as gw import pyautogui import time WINDOW_TITLE = ‘记事本’ last_hash = None while True: wins = gw.getWindowsWithTitle(WINDOW_TITLE) if not wins: print(‘窗口未找到’) time.sleep(1) continue win = wins[0] region = (win.left, win.top, win.width, win.height) img = pyautogui.screenshot(region=region) hashval = imagehash.phash(img) if last_hash is not None and hashval != last_hash: print(‘窗口内容发生变化!’) img.save(f’changed_{time.time()}.png’) last_hash = hashval time.sleep(2) 需要安装 imagehash 和 pillow:pip install imagehash pillow
- 综合:每隔N秒抓取窗口,若内容有变化则自动OCR识别并保存文本。 import pygetwindow as gw import pyautogui import imagehash from PIL import Image import pytesseract import time import datetime WINDOW_TITLE = ‘记事本’ last_hash = None while True: wins = gw.getWindowsWithTitle(WINDOW_TITLE) if not wins: print(‘窗口未找到’) time.sleep(2) continue win = wins[0] region = (win.left, win.top, win.width, win.height) img = pyautogui.screenshot(region=region) hashval = imagehash.phash(img) if last_hash is not None and hashval != last_hash: print(‘窗口内容发生变化,进行OCR识别…’) text = pytesseract.image_to_string(img, lang=’chi_sim’) timestamp = datetime.datetime.now().strftime(‘%Y%m%d_%H%M%S’) img.save(f’changed_{timestamp}.png’) with open(f’changed_{timestamp}.txt’, ‘w’, encoding=’utf-8′) as f: f.write(text) last_hash = hashval time.sleep(5)
- 如果你还想让程序同时响应用户操作,可以用 threading 或 asyncio 实现非阻塞定时抓取。
- 多窗口监控:遍历多个窗口标题。 报警通知:内容变化自动发邮件/消息。 日志记录:记录变化事件和时间。 异常处理:防止窗口消失导致程序崩溃。
目录
- 一、常用 Python 屏幕抓取库
- 二、pyautogui 截屏示例
- 三、mss 高性能截图
- 四、Pillow 截屏(仅部分平台支持)
- 五、屏幕录制(视频)
- 六、抓取后处理
- 七、注意事项
- 八、常见用途
- 九、抓取指定窗口、自动识别屏幕内容、屏幕录制
- 1. 抓取指定窗口
- Windows 平台推荐:pygetwindow + pyautogui 或 mss
- 用 mss 截取窗口区域
- macOS/Linux
- 2. 自动识别屏幕内容(OCR)
- Tesseract OCR 示例
- 结合窗口截图和OCR
- 3. 屏幕录制
- 方法一:用 OpenCV + pyautogui 录制全屏或指定区域
- 方法二:用 mss 录制屏幕(高效)
- 总结
- 十、自动化、定时抓取、窗口变化检测
- 1. 自动化与定时抓取
- 示例:每隔5秒抓取窗口截图
- 2. 窗口变化检测
- 2.1 检测窗口位置和尺寸变化
- 2.2 检测窗口内容变化(像素级)
- 3. 自动化综合示例(定时+变化检测+OCR)
- 4. 线程/异步:不阻塞主线程
- 5. 进阶建议
- 总结
- Pillow(PIL):可以截图,但功能有限,推荐配合其他库使用。
- pyautogui:简单、跨平台,支持全屏截图和区域截图。
- mss:高性能,支持多平台,适合大规模、快速截图。
- opencv-python:可以处理截图后的图像,但本身不直接抓屏。
安装:
pip install pyautogui
全屏截图并保存:
import pyautogui
screenshot = pyautogui.screenshot()
screenshot.save('screenshot.png')
截取指定区域(左上角坐标和宽高):
import pyautogui
region = (100, 100, 300, 200) # x, y, width, height
screenshot = pyautogui.screenshot(region=region)
screenshot.save('region.png')
安装:
pip install mss
全屏截图:
import mss
with mss.mss() as sct:
sct.shot(output='mss_full.png')
指定区域截图:
import mss
with mss.mss() as sct:
monitor = {"top": 100, "left": 100, "width": 300, "height": 200}
sct_img = sct.grab(monitor)
mss.tools.to_png(sct_img.rgb, sct_img.size, output="mss_region.png")
from PIL import ImageGrab
im = ImageGrab.grab()
im.save('pillow_screen.png')
屏幕录制需要更复杂的工具,比如 opencv-python + pyautogui 或 mss,也可以用第三方软件或 ffmpeg。
简单示例(录制屏幕为视频,需安装 opencv-python):
import cv2
import numpy as np
import pyautogui
screen_size = pyautogui.size()
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("output.avi", fourcc, 20.0, screen_size)
for i in range(100): # 录制100帧
img = pyautogui.screenshot()
frame = np.array(img)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
out.write(frame)
out.release()
cv2.destroyAllWindows()
抓取到的图片可以用 Pillow 或 OpenCV 进一步处理,比如识别、加水印、裁剪等。
- 部分库在 macOS 需要额外设置权限(系统设置 → 安全与隐私 → 屏幕录制)。
- Linux 下部分库依赖 X11。
- 截屏速度和性能,推荐用 mss。
- 自动化测试
- 远程监控
- OCR 文字识别
- 游戏/教学录屏
抓取指定窗口通常需要获取窗口句柄,然后截图该窗口区域。不同操作系统方式略有不同,Windows支持最好。
步骤:
- 获取窗口坐标
- 用截图工具抓取该区域
示例代码:
安装依赖:
pip install pygetwindow pyautogui ms
import pygetwindow as gw
import pyautogui
# 获取所有窗口标题
print(gw.getAllTitles())
# 获取某个窗口(如“记事本”)
win = gw.getWindowsWithTitle('记事本')[0]
print(win.left, win.top, win.width, win.height)
# 截取窗口区域
region = (win.left, win.top, win.width, win.height)
img = pyautogui.screenshot(region=region)
img.save('window.png')
import mss
with mss.mss() as sct:
monitor = {"top": win.top, "left": win.left, "width": win.width, "height": win.height}
sct_img = sct.grab(monitor)
mss.tools.to_png(sct_img.rgb, sct_img.size, output="window_mss.png")
获取窗口位置需要用到pyobjc、python-xlib等,较为复杂,可参考 pygetwindow 文档。
可以用百度OCR、腾讯OCR、Google Tesseract OCR等,最常用的是 Tesseract。
安装:
pip install pytesseract pillow
并安装 Tesseract 可执行文件。
代码:
from PIL import Image
import pytesseract
img = Image.open('window.png')
text = pytesseract.image_to_string(img, lang='chi_sim') # 中文用 lang='chi_sim'
print(text)
import pyautogui
from PIL import Image
import pytesseract
import pygetwindow as gw
win = gw.getWindowsWithTitle('记事本')[0]
region = (win.left, win.top, win.width, win.height)
img = pyautogui.screenshot(region=region)
img.save('window.png')
text = pytesseract.image_to_string(img)
print(text)
安装:
pip install opencv-python pyautogui numpy
录制指定区域(如窗口):
import cv2
import numpy as np
import pygetwindow as gw
import pyautogui
win = gw.getWindowsWithTitle('记事本')[0]
region = (win.left, win.top, win.width, win.height)
width, height = win.width, win.height
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("window_record.avi", fourcc, 10.0, (width, height))
for i in range(200): # 录制200帧
img = pyautogui.screenshot(region=region)
frame = np.array(img)
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
out.write(frame)
out.release()
cv2.destroyAllWindows()
import mss
import cv2
import numpy as np
import pygetwindow as gw
win = gw.getWindowsWithTitle('记事本')[0]
monitor = {"top": win.top, "left": win.left, "width": win.width, "height": win.height}
width, height = win.width, win.height
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("window_mss_record.avi", fourcc, 10.0, (width, height))
with mss.mss() as sct:
for i in range(200):
sct_img = sct.grab(monitor)
frame = np.array(sct_img)
frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)
out.write(frame)
out.release()
cv2.destroyAllWindows()
- 抓取指定窗口:pygetwindow + pyautogui/mss
- 自动识别内容:pytesseract(OCR)
- 屏幕录制:opencv/mss
可以用 schedule、threading、time 等库实现定时任务,比如每隔5秒抓取一次指定窗口内容。
import time
import pygetwindow as gw
import pyautogui
import datetime
WINDOW_TITLE = '记事本' # 替换为你的目标窗口标题
def grab_window():
wins = gw.getWindowsWithTitle(WINDOW_TITLE)
if not wins:
print(f'窗口"{WINDOW_TITLE}"未找到')
return
win = wins[0]
region = (win.left, win.top, win.width, win.height)
img = pyautogui.screenshot(region=region)
timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
filename = f'{WINDOW_TITLE}_{timestamp}.png'
img.save(filename)
print(f'保存截图:{filename}')
if __name__ == '__main__':
while True:
grab_window()
time.sleep(5) # 每5秒抓取一次
窗口变化主要有两类:
- 窗口内容变化:比如内容刷新、弹窗等
- 窗口位置/尺寸变化:比如用户拖动/缩放窗口
可以每次抓取前记录窗口的坐标和尺寸,和上一次对比:
import pygetwindow as gw
import time
WINDOW_TITLE = '记事本'
last_rect = None
while True:
wins = gw.getWindowsWithTitle(WINDOW_TITLE)
if not wins:
print('窗口未找到')
time.sleep(1)
continue
win = wins[0]
rect = (win.left, win.top, win.width, win.height)
if last_rect != rect:
print(f'窗口变化:{rect}')
last_rect = rect
time.sleep(1)
可以对比两次截图的hash或像素差异,常用方法有:
- Pillow ImageChops.difference
- 感知哈希(pHash)
示例:用感知哈希检测内容变化
from PIL import Image
import imagehash
import pygetwindow as gw
import pyautogui
import time
WINDOW_TITLE = '记事本'
last_hash = None
while True:
wins = gw.getWindowsWithTitle(WINDOW_TITLE)
if not wins:
print('窗口未找到')
time.sleep(1)
continue
win = wins[0]
region = (win.left, win.top, win.width, win.height)
img = pyautogui.screenshot(region=region)
hashval = imagehash.phash(img)
if last_hash is not None and hashval != last_hash:
print('窗口内容发生变化!')
img.save(f'changed_{time.time()}.png')
last_hash = hashval
time.sleep(2)
需要安装
imagehash和pillow:pip install imagehash pillow
综合:每隔N秒抓取窗口,若内容有变化则自动OCR识别并保存文本。
import pygetwindow as gw
import pyautogui
import imagehash
from PIL import Image
import pytesseract
import time
import datetime
WINDOW_TITLE = '记事本'
last_hash = None
while True:
wins = gw.getWindowsWithTitle(WINDOW_TITLE)
if not wins:
print('窗口未找到')
time.sleep(2)
continue
win = wins[0]
region = (win.left, win.top, win.width, win.height)
img = pyautogui.screenshot(region=region)
hashval = imagehash.phash(img)
if last_hash is not None and hashval != last_hash:
print('窗口内容发生变化,进行OCR识别...')
text = pytesseract.image_to_string(img, lang='chi_sim')
timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
img.save(f'changed_{timestamp}.png')
with open(f'changed_{timestamp}.txt', 'w', encoding='utf-8') as f:
f.write(text)
last_hash = hashval
time.sleep(5)
如果你还想让程序同时响应用户操作,可以用 threading 或 asyncio 实现非阻塞定时抓取。
- 多窗口监控:遍历多个窗口标题。
- 报警通知:内容变化自动发邮件/消息。
- 日志记录:记录变化事件和时间。
- 异常处理:防止窗口消失导致程序崩溃。
到此这篇关于Python屏幕抓取和录制的文章就介绍到这了,更多相关Python屏幕抓取和录制内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- 对Python获取屏幕截图的4种方法详解
- Python实现屏幕截图的两种方式
- Python编写屏幕截图程序方法
- 用Python实现屏幕截图详解
- Python实现屏幕截图的代码及函数详解
- 使用Python实现屏幕截图的两种方法