見出し画像

【Selenium×Python】入力フォームを自動化しよう!

ライトラジオリスナーの私ですが、某深夜ラジオの入力フォームで名前やら住所やらの手入力がめんどくさくなってたので、自動で入力するプログラムを書いてみました。
ステッカーとか欲しいもので、住所とか省かずにいきたいんですよね(笑)。

はじめに

この記事では、Pythonというプログラミング言語のSeleniumというパッケージを使用します。インストール方法などは割愛します。ご了承ください(参考にしたサイトを最後にまとめますのでそちらをご参照ください)。
また、この記事内で紹介したコードを実行した際に発生する不利益については一切の責任を負いかねます。並びにご了承ください。

説明

フォームのイメージ

Google formsで作成

私が自動入力したいフォームをそのまま載せるのもいかがなものかと思ったので、Google formsで同じような内容のページを作成しました。

パッケージのインポート

from time import sleep
from selenium import webdriver 
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select

処理を一時的に停止させるための”sleep”以外は、全てSeleniumからのインポートになります。今回は、ChromeではなくEdgeをブラウザとして使用する前提のコードとなっています。その際に、ドライバーは必ずインストールしておいて下さい。

変数

driver_path = r"C:\XXX\XXX\XXX\XXX\msedgedriver.exe"
url = "https://1242.com" #自動入力したいサイトのURL
my_rname = "XXXX"
my_age = 20
my_job = "大学生/大学院生"
my_listen = "FM東京"
my_pref = "東京都"
my_mail = "XXX@1242.com"
my_name = "ニッポン放送"
my_zip_1 = "100"
my_zip_2 = "8439"
my_address = "東京都千代田区有楽町1丁目9-3"
my_tel_1 = "03"
my_tel_2 = "3287"
my_tel_3 = "1111"

この内容自体は入力したいフォームに大きく依存します。個人情報を多く含むので、その部分についてはニッポン放送の会社情報を拝借しました。
ここで、気をつけていただきたいのは"driver_path"の部分です。Windowsなどでパスをコピーしてそのまま貼り付けると、エラーになることがあります。クォーテーションマークの前の"r"は残しておく必要があります。

初期設定

service = Service(driver_path)
driver = webdriver.Edge(service=service)
driver.get(url)

ドライバーの設定です。ネットを見ていると、serviceオブジェクトを作らない方法が掲載されていますが、どうやら古いバージョンの書き方のようです(参考文献の【3】)。

テキストボックス

text = driver.find_element(By.NAME, "検索する文字列")
text.send_keys("テキスト")

テキストボックスへの入力は、テキストボックスの名前で検索して行いました。
他の部分もそうですが、ブラウザのデベロッパーツールでサイトのプログラムを確認して行います。
これに関しても、"find_element_by_name"という関数を使っているサイトがありましたが、この書き方もどうやら古いようです。

ラジオボタン

radio_button = driver.find_element(By.XPATH, '/html/body/div[2]/form/div[1]/div[3]/div[2]/label[1]')
radio_button.click()

これが最善なのかはわかりませんが、XPATHで要素を特定しました。ブラウザのデベロッパーツールでXPATHをコピーしたものをそのまま貼り付けました。ただ、どの部分をコピーするのかよくわからないので、何個か試したのですが、ラジオボタンは"label"が対応しているようです。

ドロップダウン

dropdown = driver.find_element(By.XPATH, '/html/body/div[2]/form/div[1]/div[4]/div[2]/div/select[1]')
Select(dropdown).select_by_value("選びたい文字列")

ドロップダウンもXPATHを指定します。内容の選び方についても、今回のように指定の文字列を選択する場合と上からの番号(インデックス)で指定するやり方が複数あります(詳しくは参考文献【2】)。

コード全体

from time import sleep
from selenium import webdriver 
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select

driver_path = r"C:\XXX\XXX\XXX\XXX\msedgedriver.exe"
url = "https://1242.com"
my_rname = "XXXX"
my_age = 20
my_job = "大学生/大学院生"
my_listen = "FM東京"
my_pref = "東京都"
my_mail = "XXX@1242.com"
my_name = "ニッポン放送"
my_zip_1 = "100"
my_zip_2 = "8439"
my_address = "東京都千代田区有楽町1丁目9-3"
my_tel_1 = "03"
my_tel_2 = "3287"
my_tel_3 = "1111"


rname = driver.find_element(By.NAME, "rname")
rname.send_keys(my_rname)

age = driver.find_element(By.NAME, "age")
age.send_keys(my_age)

gender = driver.find_element(By.XPATH, '/html/body/div[2]/form/div[1]/div[3]/div[2]/label[1]')
gender.click()

job = driver.find_element(By.XPATH, '/html/body/div[2]/form/div[1]/div[4]/div[2]/div/select[1]')
Select(job).select_by_value(my_job)

listen = driver.find_element(By.XPATH, '/html/body/div[2]/form/div[1]/div[5]/div[2]/div/select[1]')
Select(listen).select_by_value(my_listen)

prefecture = driver.find_element(By.XPATH, '/html/body/div[2]/form/div[1]/div[6]/div[2]/div/select[1]')
Select(prefecture).select_by_value(my_pref)

email = driver.find_element(By.NAME, "email")
email.send_keys(my_mail)

name = driver.find_element(By.NAME, "name")
name.send_keys(my_name)

zipcode1 = driver.find_element(By.NAME, "zipcode1")
zipcode1.send_keys(my_zip_1)

zipcode2 = driver.find_element(By.NAME, "zipcode2")
zipcode2.send_keys(my_zip_2)

sleep(1)

address = driver.find_element(By.NAME, "address")
address.clear()
address.send_keys(my_address)

tel1 = driver.find_element(By.NAME, "tel1")
tel1.send_keys(my_tel_1)

tel2 = driver.find_element(By.NAME, "tel2")
tel2.send_keys(my_tel_2)

tel3 = driver.find_element(By.NAME, "tel3")
tel3.send_keys(my_tel_3)

# 動作確認時間:20秒
sleep(20)

# 入力時間:10分
# sleep(600)

# driver.close() 

最後に

今回初めて、Seleniumを使いました。完全に自動化するのには、もう少し工夫がいりそうです。ただ、サーバーの負荷などを考えると、ちょっと便利になったでとどめておいたほうが良さそうだなと思います。

参考文献(リンクは執筆当時)

【1】難しいけど、網羅度が高い

【2】操作が一覧で分かりやすい

【3】旧バージョンからの変更点

【4】テキストボックス専用。とても分かりやすい

この記事が気に入ったらサポートをしてみませんか?