この記事では、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
、そして画面上の特定の位置への移動にはclick
やmoveTo
を組み合わせるのが基本です。この手法は画面レイアウトの変更に弱いものの、個人的な定型作業を効率化する上で非常に強力です。