Python屏幕抓取和錄制的詳細(xì)代碼示例
一、常用 Python 屏幕抓取庫
- Pillow(PIL):可以截圖,但功能有限,推薦配合其他庫使用。
- pyautogui:簡單、跨平臺(tái),支持全屏截圖和區(qū)域截圖。
- mss:高性能,支持多平臺(tái),適合大規(guī)模、快速截圖。
- opencv-python:可以處理截圖后的圖像,但本身不直接抓屏。
二、pyautogui 截屏示例
安裝:
pip install pyautogui
全屏截圖并保存:
import pyautogui
screenshot = pyautogui.screenshot()
screenshot.save('screenshot.png')截取指定區(qū)域(左上角坐標(biāo)和寬高):
import pyautogui
region = (100, 100, 300, 200) # x, y, width, height
screenshot = pyautogui.screenshot(region=region)
screenshot.save('region.png')三、mss 高性能截圖
安裝:
pip install mss
全屏截圖:
import mss
with mss.mss() as sct:
sct.shot(output='mss_full.png')指定區(qū)域截圖:
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")四、Pillow 截屏(僅部分平臺(tái)支持)
from PIL import ImageGrab
im = ImageGrab.grab()
im.save('pillow_screen.png')五、屏幕錄制(視頻)
屏幕錄制需要更復(fù)雜的工具,比如 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 進(jìn)一步處理,比如識(shí)別、加水印、裁剪等。
七、注意事項(xiàng)
- 部分庫在 macOS 需要額外設(shè)置權(quán)限(系統(tǒng)設(shè)置 → 安全與隱私 → 屏幕錄制)。
- Linux 下部分庫依賴 X11。
- 截屏速度和性能,推薦用 mss。
八、常見用途
- 自動(dòng)化測試
- 遠(yuǎn)程監(jiān)控
- OCR 文字識(shí)別
- 游戲/教學(xué)錄屏
九、抓取指定窗口、自動(dòng)識(shí)別屏幕內(nèi)容、屏幕錄制
1. 抓取指定窗口
抓取指定窗口通常需要獲取窗口句柄,然后截圖該窗口區(qū)域。不同操作系統(tǒng)方式略有不同,Windows支持最好。
Windows 平臺(tái)推薦:pygetwindow + pyautogui 或 mss
步驟:
- 獲取窗口坐標(biāo)
- 用截圖工具抓取該區(qū)域
示例代碼:
安裝依賴:
pip install pygetwindow pyautogui ms
import pygetwindow as gw
import pyautogui
# 獲取所有窗口標(biāo)題
print(gw.getAllTitles())
# 獲取某個(gè)窗口(如“記事本”)
win = gw.getWindowsWithTitle('記事本')[0]
print(win.left, win.top, win.width, win.height)
# 截取窗口區(qū)域
region = (win.left, win.top, win.width, win.height)
img = pyautogui.screenshot(region=region)
img.save('window.png')用 mss 截取窗口區(qū)域
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")macOS/Linux
獲取窗口位置需要用到pyobjc、python-xlib等,較為復(fù)雜,可參考 pygetwindow 文檔。
2. 自動(dòng)識(shí)別屏幕內(nèi)容(OCR)
可以用百度OCR、騰訊OCR、Google Tesseract OCR等,最常用的是 Tesseract。
Tesseract OCR 示例
安裝:
pip install pytesseract pillow
并安裝 Tesseract 可執(zhí)行文件。
代碼:
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)結(jié)合窗口截圖和OCR
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)3. 屏幕錄制
方法一:用 OpenCV + pyautogui 錄制全屏或指定區(qū)域
安裝:
pip install opencv-python pyautogui numpy
錄制指定區(qū)域(如窗口):
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()方法二:用 mss 錄制屏幕(高效)
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()總結(jié)
- 抓取指定窗口:pygetwindow + pyautogui/mss
- 自動(dòng)識(shí)別內(nèi)容:pytesseract(OCR)
- 屏幕錄制:opencv/mss
十、自動(dòng)化、定時(shí)抓取、窗口變化檢測
1. 自動(dòng)化與定時(shí)抓取
可以用 schedule、threading、time 等庫實(shí)現(xiàn)定時(shí)任務(wù),比如每隔5秒抓取一次指定窗口內(nèi)容。
示例:每隔5秒抓取窗口截圖
import time
import pygetwindow as gw
import pyautogui
import datetime
WINDOW_TITLE = '記事本' # 替換為你的目標(biāo)窗口標(biāo)題
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秒抓取一次2. 窗口變化檢測
窗口變化主要有兩類:
- 窗口內(nèi)容變化:比如內(nèi)容刷新、彈窗等
- 窗口位置/尺寸變化:比如用戶拖動(dòng)/縮放窗口
2.1 檢測窗口位置和尺寸變化
可以每次抓取前記錄窗口的坐標(biāo)和尺寸,和上一次對(duì)比:
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)2.2 檢測窗口內(nèi)容變化(像素級(jí))
可以對(duì)比兩次截圖的hash或像素差異,常用方法有:
- Pillow ImageChops.difference
- 感知哈希(pHash)
示例:用感知哈希檢測內(nèi)容變化
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('窗口內(nèi)容發(fā)生變化!')
img.save(f'changed_{time.time()}.png')
last_hash = hashval
time.sleep(2)需要安裝
imagehash和pillow:pip install imagehash pillow
3. 自動(dòng)化綜合示例(定時(shí)+變化檢測+OCR)
綜合:每隔N秒抓取窗口,若內(nèi)容有變化則自動(dòng)OCR識(shí)別并保存文本。
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('窗口內(nèi)容發(fā)生變化,進(jìn)行OCR識(shí)別...')
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)4. 線程/異步:不阻塞主線程
如果你還想讓程序同時(shí)響應(yīng)用戶操作,可以用 threading 或 asyncio 實(shí)現(xiàn)非阻塞定時(shí)抓取。
5. 進(jìn)階建議
- 多窗口監(jiān)控:遍歷多個(gè)窗口標(biāo)題。
- 報(bào)警通知:內(nèi)容變化自動(dòng)發(fā)郵件/消息。
- 日志記錄:記錄變化事件和時(shí)間。
- 異常處理:防止窗口消失導(dǎo)致程序崩潰。
總結(jié)
到此這篇關(guān)于Python屏幕抓取和錄制的文章就介紹到這了,更多相關(guān)Python屏幕抓取和錄制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python自動(dòng)化測試中APScheduler?Flask的應(yīng)用示例
這篇文章主要為大家介紹了python自動(dòng)化測試中APScheduler?Flask的應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
TensorFlow實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)
這篇文章主要為大家詳細(xì)介紹了TensorFlow實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
python OpenCV學(xué)習(xí)筆記之繪制直方圖的方法
本篇文章主要介紹了python OpenCV學(xué)習(xí)筆記之繪制直方圖的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
Python批量對(duì)word文檔進(jìn)行操作步驟
這篇文章主要介紹了Python批量對(duì)word文檔進(jìn)行操作,一步步逐步完成創(chuàng)建文檔,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
Pandas之read_csv()讀取文件跳過報(bào)錯(cuò)行的解決
這篇文章主要介紹了Pandas之read_csv()讀取文件跳過報(bào)錯(cuò)行的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
python實(shí)現(xiàn)ip地址查詢經(jīng)緯度定位詳解
這篇文章主要介紹了python實(shí)現(xiàn)ip地址查詢經(jīng)緯度定位詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python?多線程知識(shí)點(diǎn)總結(jié)及實(shí)例用法
在本篇內(nèi)容里小編給大家整理了一篇關(guān)于Python?多線程知識(shí)點(diǎn)總結(jié)及實(shí)例用法,對(duì)想好學(xué)習(xí)PY的用戶非常友好,需要的參考下吧。2021-12-12

