###はじめに
最近アレ
の影響があり、私の置かれている状況ではMicrosoftFormsを毎朝早くまでに送信しなければいけなくなりました。それを「めんどくさいな」と考えた私はpythonのwebスクレイピングを習うついでにFormsの自動回答を実装することにしました。
1.作成環境
・macOS X Catalina 10.15.7 ・chorme 86.0.4240.80 ・Python 3.7.4 ・Homebrew###2.モジュールのインストール
コマンドプロントでseleniumをインストールします。
pip install selenium
Homebrewを用いてwebdriderをinstallします。Homebrewを入れていない場合はまずHomebrewを入れていください
brew install chromedriver
###3.コードの作成
seleniumにあるwebdriverをインポートする。
処理をして秒止めるsleepをインポートする。
from selenium import webdriver
from time import sleep
selenium自体に処理を待つのモジュールがあるのですが試してみたところうまいことページ遷移後の動作がうまくいかなかったのでsleep()で動作を止めることになります。
下記の場合は10秒処理を止めます。
sleep(10)
ウェブブラウザを立ち上げurl = '***'の***にformsのURLを入れます。
browser = webdriver.Chrome()
url = '***'
browser.get(url)
formsのURLをいれるとログイン画面に行くのでメールアドレスを入力するtext-boxの要素を調べます。
⌘ + option + i でデベロッパーツールを開き 左上にある下記マークを押すことで要素の指定ができます。
調べるとMicrosoft formsではi0116のidが使用されています。(変わっているかもしれませんので作成時にチェックをすることをお勧めします)
browser.find_element_by_id()を使用することでidから要素を指定できます。
.send_keys(email)でテキストボックスにemailを記入できます。emailは各自指定してください。
同じようにしてボタンのidを探します。.click()とすることでその要素をクリックします。
browser.find_element_by_id('i0116').send_keys(email)
browser.find_element_by_id('idSIButton9').click()
sleep(3)
同じようにしてパスワード画面とログイン維持確認画面入力します。
browser.find_element_by_id('i0118').send_keys(password)
browser.find_element_by_id('idSIButton9').click()
sleep(3)
browser.find_element_by_id('idSIButton9').click()
sleep(3)
するとformsの回答画面に行きます。
formsの回答部分にはidが指定されていないためxpathを指定していきます。
・ラジオボタンを押したい場合
browser.find_elements_by_xpath("//input[@value='***']")[0].click()
***には入力したいラジオボタンのvalueをデベロッパーツールで探して入力してください
・textboxを入力する場合
browser.find_elements_by_xpath("//input[@class='***']")[0].click()
***には入力したいラジオボタンのclassをデベロッパーツールで探して入力してください
browser.find_elements_by_xpath()では指定したxpathにあてはまるものがリスト化されて取得されるため1つ目が[0]、2つ目が[1]、3つ目が[2]のようになっています。そのためtextboxの2つ目へ文字を入れたい場合は[0]が[1]になります。
入力が完了すれば送信ボタンを押すコードを入力します。
browser.find_element_by_xpath("//button[@title='送信']").click())
最後にブラウザのタブを閉じて終了
browser.quit()
###全体のソースコード
from selenium import webdriver
from time import sleep
email = '各自入力'
password = '各自入力'
url = '各自入力'
browser = webdriver.Chrome()
browser.get(url)
browser.find_element_by_id('i0116').send_keys(email)
browser.find_element_by_id('idSIButton9').click()
sleep(3)
browser.find_element_by_id('i0118').send_keys(password)
browser.find_element_by_id('idSIButton9').click()
sleep(3)
browser.find_element_by_id('idSIButton9').click()
sleep(3)
#formsに入力したい事柄で変化します。
browser.find_elements_by_xpath("//input[@value='各自入力']")[0].click()
browser.find_elements_by_xpath("//input[@value='各自入力']")[0].click()
sleep(3)
browser.find_element_by_xpath("//button[@title='各自入力']").click()
sleep(10)
browser.quit()
###4.cronで時間を指定
レンタルサーバーを借りていない私はmacにあるcronを用いて自動実行します。
システム環境設定のセキュリティーとプライバシーの鍵を解除し+から/usr/sbin/crn
を選択し開きます。
ターミナルを開いてcrontab -e
と入力します。
・毎日6時に実行する場合(*は全て実行するということです。)
# 分 時間 日 月 曜日 python 保存されているディレクトリ(必ず絶対パスを入力)
0 6 * * * python form_send
cronはスリープ状態では実行されていないのでその前1分間だけスリープ解除する設定にします。
システム環境設定の省エネルギーからスケジュールを選択し時間を入力します。
(1日に何度も実行しその時だけ立ち上げたい時はpmset
を活用するといいでしょう)
###5.後書き
初めて記事を書きました。
記事を書くのは意外と根気が入りましたが理解度アップと暇つぶしには良かったと思います。
相当不純な動機でMicrosoft formsの自動回答を作成しましたが良いものに活用していただければ大変喜びます。
最後まで読んでいただきありがとうございました。
※Windows版は執筆されません。