【Python】スクリーンショットを取得して指定フォルダに保存する(Pillow、selenium、PyAutoGUI)

時計 2021.01.12 / 時計

【Python】スクリーンショットを取得して指定フォルダに保存する(Pillow、selenium、PyAutoGUI)

本記事ではPythonスクリーンショットを取得して、指定フォルダに保存する方法について解説していきます。

Pillow、selenium、PyAutoGUIそれぞれのモジュールでスクリーンショットを取得する方法があります。
3つのモジュールがそれぞれどのようにスクショを取得するのか詳しく解説しております。

また本記事ではサンプルプログラムを2つ紹介しています。

  • キーボードのPrtScキー押下後にスクショを保存するプログラム
  • 最前面(アクティブ)のウィンドウのみスクショを保存するプログラム

実際の業務でも役に立つプログラムになりますので、ぜひ利用してみてください。

スクリーンショットの取得:Pillowモジュール

Pillowモジュールとは

Pillowモジュールは画像処理に使うモジュールです。画像を切り抜いたり、画像の編集、サムネイルの作成等に使用します。

Pillowモジュールは機械学習でもよく使用されています。

昔は画像処理と言えばPILでしたが、今ではPillowが画像処理の定番です。
PILは2011年頃に開発が終了していますので、特別な場合がない限りPillowを使用することをお勧めします。

ここではPillowモジュールの機能の一つである、スクリーンショット機能を使用します。

インストール

Pillowは標準モジュールではありませんので、pipでインストールする必要があります。

pip install pillow

プログラムの先頭ではPILからImageGrabモジュールをインポートしてください。

from PIL import ImageGrab

ImageGrabがスクリーンショット取得で使用するモジュールです。

スクリーンショットの取得方法

PIL.ImageGrabのgrab()メソッドで画面全体のスクリーンショットを取得できます。

screenshot = ImageGrab.grab()

取得したスクリーンショットオブジェクトはsave()メソッドで保存できます。

screenshot.save('screenshot.jpg')

または一行で以下のように記述しても同じです。

ImageGrab.grab().save('screenshot.jpg')

指定した領域内をクリッピングするにはgrab()メソッドのオプションにbboxを指定します。

ImageGrab.grab(bbox=(10, 10, 150, 150)).save("screenshot.png")

スクリーンショットの取得:seleniumモジュール

seleniumモジュールとは

seleniumモジュールはWEBブラウザ制御に使用されるモジュールです。
WEBブラウザの起動や、リンクのクリック、ログイン情報の入力など様々なブラウザ操作が行えます。

このseleniumモジュールはWEBブラウザで表示している画面のスクリーンショットを取得することができます。

インストール

seleniumモジュールはサードパーティーのモジュールなのでpipでインストールする必要があります。

pip install selenium

プログラムの先頭は以下のようにしてseleniumからwebdriverをインポートします。

from selenium import webdriver

スクリーンショットの取得方法

seleniumを使ってブラウザを起動し、スクリーンショットを取得したいサイトページを開きます。

from selenium import webdriver

URL = "https://www.google.com"

browser= webdriver.Firefox()
driver.set_window_size(1280, 720)
browser.get(URL)

サイトページを開いたら、save_screenshot()メソッドでスクリーンショットを取得・保存を行います。

driver.save_screenshot(FILENAME)

スクリーンショットの取得:PyAutoGUIモジュール

PyAutoGUIモジュールとは

PyAutoGUIモジュールはマウスの移動や、マウス座標の取得、キーボード入力などの操作をコントロールできるモジュールです。

このPyAutoGUIモジュールを使ってRPAといった自動化アプリの作成ができます。

PyAutoGUIでのRPAソフト作成については以下記事をご参照ください。

ここではPyAutoGUIモジュールの機能の一つである、スクリーンショット機能を使用します。

インストール

pyautoguiは標準モジュールではないためpipでインストールします。

pip install pyautogui

プログラムの先頭ではpyautoguiモジュールをインポートすることを忘れないでください。

import pyautogui

スクリーンショットの取得方法

pyautoguiによるスクリーンショットの取得にはpyautogui.screenshot()関数を使用します。

screenshot = pyautogui.screenshot()

取得したスクリーンショットの範囲指定にはscreenshotのオプションにregionを指定します。

region = (左からの配置位置, 上からの配置位置, 幅, 高さ)

取得したスクリーンショットを保存するにはsave()メソッドを使用します。

screenshot.save('screenshot.png')

サンプルプログラム:キーボードのPrtScキー押下後にスクショを保存

プログラム内容

以下内容のプログラムを作成します。

  • キーボードイベントを検知する
  • PrtScキー押下後にスクショを取り、保存する
  • Escキーでプログラムを終了する

キーボードイベントの検知にはpynputを使用します。
詳しいpynputの使い方は以下記事をご参照ください。

ソースコード

from PIL import ImageGrab
from pynput import keyboard

def screen_shot():
    # フルスクリーンで取得する
    screenshot = ImageGrab.grab()
    screenshot.save('screenshot.jpg')

def press(key):
    try:
        if key == keyboard.Key.print_screen:
            print('アルファベット {0} が押されました'.format(key.char))
    except AttributeError:
        if key == keyboard.Key.print_screen:
            screen_shot()

def release(key):
    if key == keyboard.Key.esc:     # escが押された場合
        return False    # listenerを止める

listener = keyboard.Listener(
    on_press=press,
    on_release=release)
listener.start()

サンプルプログラム:最前面(アクティブ)のウィンドウのみスクショを保存

プログラム内容

以下内容のプログラムを作成します。

  • キーボードイベントを検知する
  • PrtScキー押下後にスクショを取り、保存する
  • スクショは最前面(アクティブ)なウィンドウのみ
  • Escキーでプログラムを終了する

「サンプルプログラム:キーボードPrtScキー押下後にスクショを保存」のプログラムを最前面のウィンドウのみをスクショ保存するように編集します。

最前面ウィンドウのスクショを取得するためにwin32guiを使用します。

handle = win32gui.GetForegroundWindow() # 最前面のウィンドウハンドルを取得

rect = win32gui.GetWindowRect(handle) # ウィンドウの位置を取得

上記で最前面ウィンドウの位置座標を取得できるので、その座標を元に全画面スクショを切り取ります。

croped_screenshot = screenshot.crop(rect)

ソースコード

from PIL import ImageGrab
from pynput import keyboard
import win32gui

def screen_shot():
    # 最前面のウィンドウのスクショを取得する
    handle = win32gui.GetForegroundWindow() # 最前面のウィンドウハンドルを取得
    rect = win32gui.GetWindowRect(handle)   # ウィンドウの位置を取得
    screenshot = ImageGrab.grab()
    croped_screenshot = screenshot.crop(rect)
    croped_screenshot.save('screenshot.jpg')

def press(key):
    try:
        if key == keyboard.Key.print_screen:
            print('アルファベット {0} が押されました'.format(key.char))
    except AttributeError:
        if key == keyboard.Key.print_screen:
            screen_shot()

def release(key):
    if key == keyboard.Key.esc:     # escが押された場合
        return False    # listenerを止める

listener = keyboard.Listener(
    on_press=press,
    on_release=release)
listener.start()

まとめ

本記事「スクリーンショットを取得して指定フォルダに保存する(Pillow、selenium、PyAutoGUI)」はいかがでしたか。

紹介した2つのサンプルプログラムは改良すれば業務でも役に立つアプリケーションになるはずです。

例えばtkinterを使用してGUIアプリケーションにしたり、ユーザー自身で保存先を選択できるようにすれば便利な業務用アプリにできます。

ぜひ本サイトに記載されている技術を使っていろいろ作成してみてください。