Pythonで業務効率化 Webページへログインし、スクリーンショット・保存を自動化する方法と実例

Python Selenium

インターネット上のデータを効率的に取得するWebスクレイピングは、業務の自動化やデータ分析に欠かせない技術です。特に、PythonのSeleniumライブラリを活用することで、動的なWebページからのデータ取得やスクリーンショットの保存が簡単に行えます。さらに、取得した情報をPDF形式で保存すれば、帳票保存やレポート作成の手間を削減できます。

本記事では、PythonとSeleniumを使用したWebスクレイピングの活用により、スクリーンショットの自動取得、データのPDF保存までの具体的な方法を、実際のコード例を交えて解説します。経理業務において、これらの技術を活用することで、業務の効率化を図り、時間を大幅に削減できるでしょう。

PythonとSeleniumを活用したWebスクレイピング

Seleniumとは?

Seleniumは、Webブラウザを自動操作するためのフレームワークです。Pythonと組み合わせることで、ログインが必要なページやJavaScriptによって動的に変化するWebページからデータを取得することができます。

Seleniumを使うための環境設定

Seleniumを使うためには、まず環境設定を行う必要があります(Python、およびエディタはインストール済の前提です)。
環境設定は主に次の内容になりますが、具体的な手順方についてはこちらの記事で詳しく紹介していますので、こちらをご覧ください。
経理業務でPythonのWEBスクレイピングを活用する方法と具体例

  • Seleniumのインストール
  • ブラウザのドライバを準備する
  • ブラウザのバージョンを確認する
  • Seleniumとブラウザドライバの接続

Seleniumの基本的な活用例とその方法

Seleniumの基本的な活用例

Seleniumを使えば次の様なことが自動化できます。

  • ログインフォームの自動入力
  • Webページ内の特定要素のデータ抽出
  • ボタンやリンクのクリック操作
  • スクロールやページ遷移の自動化

Seleniumの基本的使用手順

Seleniumの基本的使用手順については、こちらの記事で詳しく紹介していますので、こちらをご覧ください。
経理業務でPythonのWEBスクレイピングを活用する方法と具体例

ID、パスワードの入力、ログインの自動化

業務において、管理画面にアクセスするためには、ID、パスワードを入力しログインすることが必要な場合がほとんどです。
Seleniumを使って、ウェブページにログインするコード例は次のとおりです。環境設定のうえ、こちらのコードをコピーし、×××の箇所にURL、特定した要素を入力し実行すれば、ログインまでが自動で行うことができます。
なお、インポートするモジュールやパッケージが未だインストールされていない場合は、ターミナルで「pip install ×××」のコマンドを実行し、インストールすることが必要です。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select  # Selectをインポート
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep

# Chromeオプションを設定
options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)  # ブラウザが閉じないように設定

# ChromeDriverのサービスを設定
cService = Service(executable_path='×××\chromedriver.exe') # クロームドライバーが格納されているファイルパス
driver = webdriver.Chrome(service=cService, options=options)
actionChains = ActionChains(driver)

# 暗黙的な待機時間を設定
driver.implicitly_wait(10)

# ログインページを開く
url_login = 'https://×××'
driver.get(url_login)

# ID入力
text_box = driver.find_element(By.XPATH, '×××') #ID入力箇所の要素
text_box.send_keys('×××')
sleep(5)      
        
# パスワード入力
text_box = driver.find_element(By.XPATH, '×××') #パスワードを入力箇所の要素
text_box.send_keys('Minacia202412')    

# ログインボタンをクリック
btn = driver.find_element(By.XPATH,'×××')  #ログインボタンの要素   
btn.click()
sleep(10)

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

次に、スクリーンショットの自動取得方法について説明します。

スクリーンショット自動化を活用するシナリオ

昨今、ウェブサイトから帳票やデータをダウンロードすることが多くなり、例えば、請求書等の証票をダウンロードして、適切なファイル名にしたうえでPDF保存するといった作業は地味に時間を取られます。これらの作業をSeleniumにより自動化することで大幅に作業時間を短縮することができます。
また、ウェブページの全体または一部をスクリーンショットして、それを帳票や監査資料としてPDF保存することも多いと思います。経理業務において、スクリーンショットを利用するシナリオは次の様なものがあります。

  • 証跡の保存(Webページの状態を記録)
  • 監査用のデータとして利用
  • 自動レポート作成の一部として活用

Seleniumでスクリーンショットを撮る方法

特定要素のスクリーンショットを撮る方法

特定要素のみスクリーンショットを撮る方法は簡単です。
要素を指定して「element.screenshot(‘element_screenshot.png’)」のコマンドを実行すれば可能です。

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://×××')
element = driver.find_element(By.ID, '×××')
element.screenshot('element_screenshot.png')
driver.quit()

ただ、要素のみスクリーンショットを撮ることはほとんどないと思いますので、以下、実用的な方法を説明します。

画面全体をスクリーンショットする方法

現在のディスプレイに表示されている画面全体をスクリーンショットをする方法は次のとおりです。
なお、ファイル名、保存先を指定する方法についてはこちらの記事で詳しく説明していますので、こちらをご覧ください。
Pythonで経理業務を効率化:ダウンロードファイルのリネームと所定フォルダへの移動を自動化

import pyautogui
import os

# 画面全体のスクリーンショットを取得
img_full = pyautogui.screenshot()

# 保存先の指定
movebase_dir = "./screenshots"  # 保存フォルダを指定
os.makedirs(movebase_dir, exist_ok=True)
data = 'full_screenshot.png'
file_path = os.path.join(movebase_dir, data)
img_full.save(file_path)

pyautoguiscreenshot() メソッドを使用します。
この様にすれば、画面全体を撮ることができますので、実用的です。
ただ、画面全体ではなく、特定部分のみのスクリーンショットを撮り保存することの方が実務では圧倒的にニーズが多いと思います。
次に範囲を指定しスクリーンショットする方法を説明します。

スクリーンショットの範囲を指定する方法

import pyautogui
import os

# スクリーンショットの範囲を指定
prtsc_range = (500, 200, 1000, 800)  # 必要に応じて変更

# スクリーンショットの取得
img1 = pyautogui.screenshot(region=prtsc_range)

# 保存先の指定
movebase_dir = "./screenshots"  # 保存フォルダを指定
os.makedirs(movebase_dir, exist_ok=True)
data = 'part_screenshot.png'
file_path = os.path.join(movebase_dir, data)
img1.save(file_path)

「prtsc_range = (500, 200, 1000, 800)」の部分を適宜変更して、スクリーンショットする範囲を調整してください。
この様にすれば、取得したい部分のみスクリーンショットすることができるので、一番実用的だと思います。

以下が、範囲指定してスクリーンショットする一連のコードの例になります。
実際に業務で使用しているコードになりますので、ファイルパスやURL等入れることで使用できるようになると思います。是非、ご活用ください!

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select  # Selectをインポート
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
import os
import shutil
import pyautogui
from PIL import Image 

# 保存フォルダを指定 
movebase_dir = "./screenshots"  # 保存フォルダのパス

#スクリーンショットの範囲を指定
prtsc_range = (500,200,1000,800)   #必要に応じて変更

#ダウンロードフォルダパス指定
downloadsdir_path = '.\Downloads"  # ダウンロードフォルダを指定

# Chromeオプションを設定
options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)  # ブラウザが閉じないように設定

# ChromeDriverのサービスを設定
cService = Service(executable_path='.\chromedriver.exe')  # クロームドライバーが保存されているフォルダを指定
driver = webdriver.Chrome(service=cService, options=options)
actionChains = ActionChains(driver)

# 暗黙的な待機時間を設定
driver.implicitly_wait(10)

# ログインページを開く
url_login = 'https://www.×××'  # URLを指定

driver.get(url_login)

try:
    # D入力
    text_box = driver.find_element(By.XPATH, '×××')
    text_box.send_keys('×××')
    sleep(5)         
        
    # パスワード入力
    text_box = driver.find_element(By.XPATH, '×××')
    text_box.send_keys('×××')    

    # ログインボタンをクリック
    btn = driver.find_element(By.XPATH,'×××')     
    btn.click()
    sleep(10)
          
    # 施設選択
    btn = driver.find_element(By.XPATH,'×××')     
    btn.click()
    sleep(10)   
        
    # 月選択
    driver.switch_to.default_content()      
    btn = driver.find_element(By.XPATH,'×××')     
    btn.click()
    btn = driver.find_element(By.XPATH,'×××')         
    btn.click()
    
    #表示する       
        
    elem = driver.find_element(By.XPATH,'×××')
   btn.click()    
    sleep(5)
    
    #スクリーンショット
    data = 'screenshot.pdf'    #PDF形式で保存
    img1 = pyautogui.screenshot(region=prtsc_range)
    file_path = os.path.join(movebase_dir,data)
    img1.save(file_path)            
    
  #ブラウザを閉じる
    driver.quit()    

except Exception as e:
    print(f"エラーが発生しました: {e}")

# スクリプト終了を防ぐ
input("終了するには Enter キーを押してください...")

    

おわりに

本記事では、PythonのSeleniumを活用したWebスクレイピングの基本から、スクリーンショットの自動取得、データのPDF保存の方法までを解説しました。これらの技術を活用することで、日々の業務を効率化し、手間を省くことが可能になります。ぜひ実践してみてください!

コメント

タイトルとURLをコピーしました