화면을 주기적으로 캡처해서 변화 추적하기! 파이썬 모니터링 자동화

화면을 주기적으로 캡처해서 변화 추적하기! 파이썬 모니터링 자동화 (완성 코드 공개)

파이썬으로 화면을 주기적으로 자동 캡처하고 모니터링하는 모습


"사내 모니터링 대시보드 화면을 일정 시간마다 캡처해서 기록을 남겨야 한다", "장시간 실행되는 프로그램의 진행 상황을 주기적으로 캡처해 확인하고 싶다", "웹페이지가 특정 시점에 어떻게 바뀌는지 추적하고 싶다"…

이전 게시글 pyautogui 윈도우 자동화 편에서 화면 캡처 기능을 간단히 소개했습니다. 이번 글에서는 이를 발전시켜 일정 간격으로 반복 캡처하고, 이전 캡처와 비교해 변화를 감지하는 모니터링 도구로 완성해 보겠습니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

화면 캡처와 비교에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install pyautogui pillow numpy

pyautogui는 화면을 캡처하는 기능을 제공합니다. pillow는 이미지를 처리하고 저장하는 데 사용하고, numpy는 두 이미지를 픽셀 단위로 비교해 변화량을 계산하는 데 사용합니다.

💡 이 코드로 할 수 있는 것: 지정한 간격으로 전체 화면 또는 특정 영역을 반복 캡처해 날짜·시간이 포함된 파일명으로 저장합니다. 이전 캡처와 현재 캡처를 비교해 변화율을 계산하고, 변화가 감지되면 별도로 표시합니다.

2단계: 완성 코드

아래 코드를 그대로 복사해서 메모장에 붙여넣고, screen_monitor.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.

import pyautogui
import numpy as np
import time
from pathlib import Path
from datetime import datetime
from PIL import Image, ImageChops

# ① 설정
OUTPUT_DIR     = r"C:\Users\내이름\Desktop\화면캡처기록"   # ← 캡처 저장 폴더
INTERVAL_SEC   = 60      # ← 캡처 간격 (초). 60 = 1분마다
CAPTURE_REGION = None    # ← None: 전체 화면 / (x, y, width, height): 특정 영역만
CHANGE_THRESHOLD = 2.0   # ← 변화율(%) 기준, 이 이상 변하면 "변화 감지"로 표시
MAX_CAPTURES   = 0       # ← 0: 무제한 / N: N번 캡처 후 자동 종료

output_dir = Path(OUTPUT_DIR)
output_dir.mkdir(parents=True, exist_ok=True)

# ② 변화율 계산 함수
def calculate_change_percent(img1, img2):
    """두 이미지의 픽셀 차이를 비교해 변화율(%) 계산"""
    if img1.size != img2.size:
        return 100.0   # 크기가 다르면 완전히 다른 화면으로 간주

    diff = ImageChops.difference(img1.convert("RGB"), img2.convert("RGB"))
    diff_array = np.array(diff)
    changed_pixels = np.sum(diff_array.sum(axis=2) > 30)   # 차이가 30 이상인 픽셀
    total_pixels = diff_array.shape[0] * diff_array.shape[1]
    return round((changed_pixels / total_pixels) * 100, 2)

# ③ 캡처 실행
print(f"▶ 화면 모니터링 시작 (간격: {INTERVAL_SEC}초)")
print(f"  저장 위치: {OUTPUT_DIR}")
print(f"  종료하려면 Ctrl+C를 누르세요.\n")

previous_image = None
capture_count = 0

try:
    while True:
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")

        # 화면 캡처 (전체 또는 지정 영역)
        if CAPTURE_REGION:
            screenshot = pyautogui.screenshot(region=CAPTURE_REGION)
        else:
            screenshot = pyautogui.screenshot()

        # 변화율 계산 (이전 캡처가 있을 때만)
        change_percent = 0.0
        is_changed = False
        if previous_image is not None:
            change_percent = calculate_change_percent(previous_image, screenshot)
            is_changed = change_percent >= CHANGE_THRESHOLD

        # 파일명에 변화 여부 표시
        tag = "_변화감지" if is_changed else ""
        filename = f"capture_{timestamp}{tag}.png"
        screenshot.save(output_dir / filename)

        status = f"변화 {change_percent}% {'⚠ 감지!' if is_changed else ''}" if previous_image else "최초 캡처"
        print(f"  ✔ [{timestamp}] {filename}  ({status})")

        previous_image = screenshot
        capture_count += 1

        # 최대 캡처 횟수 도달 시 종료
        if MAX_CAPTURES and capture_count >= MAX_CAPTURES:
            print(f"\n  설정된 {MAX_CAPTURES}회 캡처 완료, 종료합니다.")
            break

        time.sleep(INTERVAL_SEC)

except KeyboardInterrupt:
    print(f"\n  모니터링을 종료합니다. 총 {capture_count}회 캡처됨.")

3단계: 실행 방법

  1. 코드 ① 설정의 OUTPUT_DIR에 캡처를 저장할 폴더 경로를 입력합니다.
  2. INTERVAL_SEC에 캡처 간격(초)을 입력합니다. 1분마다면 60, 5분마다면 300을 입력합니다.
  3. 특정 영역만 캡처하려면 CAPTURE_REGION(x, y, width, height) 형식으로 좌표를 입력합니다.
  4. 터미널에서 아래 명령어로 실행합니다:
python screen_monitor.py

실행 중 설정한 간격마다 화면이 캡처되며 터미널에 이렇게 출력됩니다:

▶ 화면 모니터링 시작 (간격: 60초)
  저장 위치: C:\Users\내이름\Desktop\화면캡처기록
  종료하려면 Ctrl+C를 누르세요.

  ✔ [20260629_140000] capture_20260629_140000.png  (최초 캡처)
  ✔ [20260629_140100] capture_20260629_140100.png  (변화 0.3%)
  ✔ [20260629_140200] capture_20260629_140200_변화감지.png  (변화 8.7% ⚠ 감지!)

변화가 기준치 이상 감지된 캡처는 파일명에 _변화감지 태그가 자동으로 붙어서 나중에 쉽게 찾을 수 있습니다.


4단계: 자주 발생하는 오류와 해결법

오류 1: 폴더에 캡처 파일이 너무 많이 쌓임

장시간 모니터링하면 캡처 수가 빠르게 늘어납니다. 변화가 없는 캡처는 자동으로 삭제하도록 코드를 수정할 수 있습니다:

if not is_changed and previous_image is not None:
    (output_dir / filename).unlink()   # 변화 없으면 저장 후 즉시 삭제

오류 2: 변화율이 항상 높게 나옴 (시계, 애니메이션 때문)

화면에 시계나 움직이는 광고가 있으면 매번 변화로 감지됩니다. CAPTURE_REGION으로 분석하려는 핵심 영역만 좁혀서 캡처하면 불필요한 변화 감지를 줄일 수 있습니다.

오류 3: ModuleNotFoundError: No module named 'numpy'

설치가 제대로 되지 않은 경우입니다. 아래 명령어로 다시 시도하세요.

python -m pip install numpy pillow pyautogui

응용: 캡처할 영역 좌표 쉽게 찾기

CAPTURE_REGION에 입력할 좌표를 찾는 방법입니다. pyautogui 윈도우 자동화 편의 좌표 찾기 코드를 활용하면 됩니다.

import pyautogui
import time

print("3초 후 캡처 영역의 좌상단 좌표를 측정합니다.")
time.sleep(3)
x1, y1 = pyautogui.position()
print(f"좌상단: ({x1}, {y1})")

print("3초 후 캡처 영역의 우하단 좌표를 측정합니다.")
time.sleep(3)
x2, y2 = pyautogui.position()
print(f"우하단: ({x2}, {y2})")

width  = x2 - x1
height = y2 - y1
print(f"\nCAPTURE_REGION = ({x1}, {y1}, {width}, {height})")
💡 이전 게시글과 결합하면: 텔레그램 자동 발송 편과 결합하면 변화가 감지될 때 캡처 이미지를 즉시 텔레그램으로 받을 수 있고, ZIP 자동 압축 편과 결합하면 누적된 캡처 파일들을 주기적으로 압축 정리할 수 있습니다.

핵심 요약

  • 준비물: Python + pyautogui + pillow + numpy 설치 (pip install pyautogui pillow numpy)
  • 설정: OUTPUT_DIR, INTERVAL_SEC, CAPTURE_REGION, CHANGE_THRESHOLD 수정
  • 실행: 터미널에서 python screen_monitor.py 입력 후 계속 실행 상태 유지
  • 결과: 일정 간격마다 화면 자동 캡처, 이전 캡처와 비교해 변화율 계산, 변화 감지 시 파일명 태그

이 코드를 응용하면 변화가 감지된 영역만 잘라서 별도로 저장하거나, 여러 모니터를 동시에 캡처하는 것도 가능합니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁