PythonのpyautoguiでWebフォーム入力を自動化する

この記事では、pyautoguiライブラリを使い、ウェブサイト上のフォームにデータ構造から情報を読み取って自動的に入力し、送信するスクリプトの作成方法を解説します。この手法は、繰り返し発生するデータ入力作業を効率化するのに役立ちます。

注意:この方法は画面の座標に依存するため、ウィンドウの位置やサイズ、画面解像度が変わると動作しなくなります。個人的な自動化タスクに適した手法です。


目次

1. 準備:座標の特定とデータ構造

pyautoguiによる自動化の最初のステップは、操作対象となる各フォーム要素(入力欄、ボタンなど)の画面上のXY座標を特定することです。マウスを要素の上に置いて座標を調べるユーティリティスクリプトなどを使って、あらかじめ座標を調べておきます。

次に、フォームに入力するデータを、Pythonの扱いやすい形式(ここでは辞書のリスト)で準備します。

# フォームの各要素の画面座標
NAME_FIELD = (450, 320)
AGE_FIELD = (450, 400)
GENDER_RADIO = (450, 480) # '男性'オプションの座標
SUBMIT_BUTTON = (450, 700)
SUBMIT_ANOTHER_LINK = (550, 250)

# 入力するデータ
form_data = [
    {'name': 'Taro', 'age': 30, 'gender': 'Male', 'comments': 'First entry.'},
    {'name': 'Hanako', 'age': 25, 'gender': 'Female', 'comments': 'Second entry.'},
    {'name': 'Kenji', 'age': 42, 'gender': 'Male', 'comments': 'Third entry.'},
]

2. 自動入力スクリプトの実装

スクリプトは、準備したform_dataリストをループ処理し、各辞書のデータをフォームに一つずつ入力していきます。

メインループと入力開始 forループで各個人のデータを処理します。ループの開始時にtime.sleep()を入れることで、ユーザーがブラウザのフォーム画面をアクティブにするための準備時間を確保します。

import pyautogui
import time

pyautogui.PAUSE = 0.5 # 各操作後に0.5秒のポーズを入れる

for person in form_data:
    print(">>> 5秒後に次の入力を開始します。中断するにはCtrl-Cを押してください。<<<")
    time.sleep(5)

    # 最初のフィールド(名前)をクリックしてフォームにフォーカスを合わせる
    pyautogui.click(NAME_FIELD[0], NAME_FIELD[1])

テキストフィールド、ラジオボタンの操作 pyautogui.typewrite()でテキストを入力します。文字列の末尾に'\t'(タブキー)を追加することで、次のフォーム要素に自動でフォーカスを移動させることができます。ラジオボタンやドロップダウンリストは、キーボードの矢印キー('right', 'down'など)で操作します。

    # 名前と年齢を入力(各入力後にタブで移動)
    pyautogui.typewrite(person['name'] + '\t')
    pyautogui.typewrite(str(person['age']) + '\t')

    # 性別ラジオボタンを操作
    if person['gender'] == 'Female':
        pyautogui.press('right') # '男性'から右キーで'女性'を選択
    pyautogui.press('tab')

    # コメントを入力
    pyautogui.typewrite(person['comments'] + '\t')

フォームの送信と次の入力への待機 最後のフィールド入力後、Enterキーを押してフォームを送信し、次のフォームが表示されるまで待機してから、次のループに移ります。

    # 送信ボタンを押す
    pyautogui.press('enter')
    print(f"{person['name']}の情報を送信しました。")
    
    # フォームの送信完了ページが表示されるまで待機
    time.sleep(3)
    
    # 「別の回答を送信」リンクをクリックして次の入力に備える
    pyautogui.click(SUBMIT_ANOTHER_LINK[0], SUBMIT_ANOTHER_LINK[1])

3. 完成したコード全体

これまでの要素をすべて統合した、完全なフォーム自動入力スクリプトを以下に示します。

import pyautogui
import time

# 1. 座標とデータの設定
NAME_FIELD = (450, 320)
AGE_FIELD = (450, 400)
GENDER_RADIO = (450, 480)
SUBMIT_BUTTON = (450, 700)
SUBMIT_ANOTHER_LINK = (550, 250)

form_data = [
    {'name': 'Taro', 'age': 30, 'gender': 'Male', 'comments': 'First entry.'},
    {'name': 'Hanako', 'age': 25, 'gender': 'Female', 'comments': 'Second entry.'},
]

pyautogui.PAUSE = 0.5
pyautogui.FAILSAFE = True

# 2. メインループ
for person in form_data:
    print(">>> 5秒後に次の入力を開始します。フォームのウィンドウをアクティブにしてください。<<<")
    time.sleep(5)
    
    print(f"{person['name']}の情報を入力中...")
    pyautogui.click(NAME_FIELD[0], NAME_FIELD[1])
    
    pyautogui.typewrite(person['name'] + '\t')
    pyautogui.typewrite(str(person['age']) + '\t')
    
    if person['gender'] == 'Female':
        pyautogui.press('right')
    # 男性(Male)の場合はデフォルトなので何もしない
    pyautogui.press('tab')

    pyautogui.typewrite(person['comments'] + '\t')
    
    pyautogui.press('enter')
    print("情報を送信しました。")
    
    time.sleep(3) # 送信完了ページを待つ
    pyautogui.click(SUBMIT_ANOTHER_LINK[0], SUBMIT_ANOTHER_LINK[1])

print("すべてのデータの入力が完了しました。")

まとめ

pyautoguiを使えば、あらかじめ定義したデータ構造と画面座標に基づいて、手作業のフォーム入力を完全に自動化することができます。テキスト入力にはtypewrite、オプション選択にはpress、そして画面上の特定の位置への移動にはclickmoveToを組み合わせるのが基本です。この手法は画面レイアウトの変更に弱いものの、個人的な定型作業を効率化する上で非常に強力です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次