問題:宿題を提出するには、迷惑なWebページをナビゲートする必要があるため、何度も間違った場所に課題を提出してしまいました。さらに、このプロセスには1〜2分しかかかりませんが、乗り越えられない障害のように見える場合があります(たとえば、夜遅くにタスクを完了しすぎてパスワードを思い出せない場合など)。
解決策: Pythonを使用して、完了した課題を自動的に提出してください!理想的には、割り当てを保存し、いくつかのキーを入力して、作業を数秒でロードできます。最初は本当だとは思えませんが、PythonでWebをナビゲートするために使用できるツールであるSeleniumを発見しました。
同じ一連のステップでインターネット上で退屈なアクションを繰り返すたびに、これはプロセスを自動化するプログラムを書く絶好の機会です。 SeleniumとPythonでは、スクリプトを1回記述するだけで、何度でも実行でき、繰り返しのタスクを繰り返す必要がなくなります(私の場合、ジョブを間違った場所に送ることはできません)。
ここでは、割り当てを自動的に(かつ正しく)提出するために開発したソリューションについて説明します。その過程で、プログラムによるWebコントロールのためにPythonとセレンを使用する基本について説明します。このプログラムは動作しますが(私は毎日使用しています!)、それは非常に個別であるため、アプリケーションのコードをコピーして貼り付けることはできません。ただし、ここでの一般的な方法は、無制限の状況に適用できます。(完全なコードを確認したい場合は、GitHubから入手できます)。
アプローチ
自動化の楽しい部分に入る前に、ソリューションの全体的な構造を理解する必要があります。計画を立てずにコーディングを始めることは、時間を浪費し、イライラするのに最適な方法です。完成したクラスの課題をCanvas(私の大学の「学習管理システム」)の正しい場所に送信するプログラムを書きたいのですが。まず、提出するジョブ名とクラスをプログラムに伝える方法が必要です。簡単な方法で、クラスごとに子フォルダーを含む完了した割り当てを保存するフォルダーを作成しました。子フォルダに、特定のジョブにちなんだ名前の付いた完成したドキュメントを入れました。プログラムはフォルダによってクラス名を、ドキュメント名によってタスク名を見つけることができます。
以下は、クラス名がEECS491で、タスクがタスク3-大規模なグラフィックモデルでの出力の例です。
ファイル構造(左)と完全割り当て(右)。
プログラムの最初の部分は、フォルダーをループして、Pythonタプルに保存するジョブとクラスを見つけるループです。
# os for file management
import os
# Build tuple of (class, file) to turn in
submission_dir = 'completed_assignments'
dir_list = list(os.listdir(submission_dir))
for directory in dir_list:
file_list = list(os.listdir(os.path.join(submission_dir,
directory)))
if len(file_list) != 0:
file_tup = (directory, file_list[0])
print(file_tup)
( 'EECS491'、 'Assignment 3-Inference in Larger Graphical Models.txt')
これにより、ファイル管理が処理され、プログラムは、含めるクラスと割り当てを認識します。次のステップは、Seleniumを使用して正しいWebページに移動し、ジョブをロードすることです。
SeleniumによるWebコントロール
Seleniumを使い始めるために、ライブラリーをインポートし、プログラムによって制御されるブラウザーであるWebドライバーを作成します。この場合、ブラウザーとしてChromeを使用して、ジョブを送信するCanvas Webサイトにドライバーを投稿します。
import selenium
# Using Chrome to access web
driver = webdriver.Chrome()
# Open the website
driver.get('https://canvas.case.edu')
Canvas Webページを開くと、最初の障害、つまりログインボックスに直面します。これを回避するには、IDとパスワードを入力して、ログインボタンを押す必要があります。
WebドライバーがWebページを見たことがない人だと想像してください。クリックする場所、印刷する内容、クリックするボタンを正確に指示する必要があります。検索する要素をWebドライバーに指示する方法はいくつかあり、すべてセレクターを使用しています。セレクターは、Webページ上の要素の一意の識別子です。特定の要素のセレクタを見つけるには、「CWRU ID」フィールドと言い、Webページのコードを調べる必要があります。 Chromeでは、Ctrl + Shift + Iを押すか、任意の要素を右クリックして[コードの表示]を選択することにより、これを行うことができます。これが開きますChrome Developer Toolsは、あらゆるWebページの基礎となるHTMLを表示する非常に便利なアプリケーションです。
「CWRU ID」フィールドのセレクターを見つけるには、フィールドを右クリックして[コードの表示]をクリックし、開発者ツールで以下を確認しました。強調表示された行はid_box要素に対応します(この行はHTMLタグと呼ばれます)。
このHTMLは圧倒的に見えるかもしれませんが、ほとんどの情報を無視して、パーツ
id = "username"
とに焦点を当てることができname = "username"
ます。 (これらはHTMLタグ属性として知られています)。Webドライバーを使用
してフィールドを選択するに
id
は、属性id
または name
開発者ツールで見つかりました。Selenium Webドライバーには、Webページ上の要素を選択するさまざまな方法があり、多くの場合、同じ要素を選択する方法はいくつかあります。
# Select the id box
id_box = driver.find_element_by_name('username')
# Equivalent Outcome!
id_box = driver.find_element_by_id('username')
これでプログラムがにアクセスできるよう
id_box
になり、キーの入力や(ボタンを選択した場合は)押すなど、さまざまな方法でプログラムと対話できます。
# Send id information
id_box.send_keys('my_username')
パスワード入力フィールドとログインボタンについても同じプロセスを実行し、Chromeデベロッパーツールに表示される内容に応じてそれぞれを選択します。次に、アイテムに情報を送信するか、必要に応じてアイテムをクリックします。
# Find password box
pass_box = driver.find_element_by_name('password')
# Send password
pass_box.send_keys('my_password')
# Find login button
login_button = driver.find_element_by_name('submit')
# Click login
login_button.click()
ログインするとすぐに、この少し威圧的なツールバーが
表示されます。クリックする正確なアイテムと入力する情報を指定して、プログラムを再度Webページにナビゲートする必要があります。この場合、左側のメニューからコースを選択するようにプログラムに指示し、次に、渡す必要がある割り当てに対応するクラスを指定します。
# Find and click on list of courses
courses_button = driver.find_element_by_id('global_nav_courses_link')
courses_button.click()
# Get the name of the folder
folder = file_tup[0]
# Class to select depends on folder
if folder == 'EECS491':
class_select = driver.find_element_by_link_text('Artificial Intelligence: Probabilistic Graphical Models (100/10039)')
elif folder == 'EECS531':
class_select = driver.find_element_by_link_text('Computer Vision (100/10040)')
# Click on the specific class
class_select.click()
プログラムは、最初のステップで保存したフォルダー名を使用して正しいクラスを見つけます。この場合、selectメソッドを使用し
find_element_by_link_text
て特定のクラスを検索します。要素の「リンクテキスト」は、ページを見るとわかる別のセレクタにすぎません。
このワークフローは少し面倒に見えるかもしれませんが、プログラムを作成するときに一度だけ実行する必要があることに注意してください。その後、必要に応じて[実行]を何回でもクリックすると、プログラムがこれらのすべてのページに移動します。
ページを検証するのと同じプロセスを使用します-要素を選択します-要素と対話して、さらにいくつかの画面を通過します。最後に、ジョブ送信ページにアクセスします。
この時点でフィニッシュラインは見えましたが、最初はこの画面に戸惑いました。[ファイルの選択]フィールドをクリックするのは簡単ですが、アップロードするファイルを選択するにはどうすればよいですか。答えは信じられないほど簡単です!
Choose File
セレクターを使用してフィールドを見つけ、メソッドsend_keys
を使用して正確なファイルパス(file_location
以下のコードで指定)をブロックに渡します。
# Choose File button
choose_file = driver.find_element_by_name('attachments[0][uploaded_data]')
# Complete path of the file
file_location = os.path.join(submission_dir, folder, file_name)
# Send the file location to the button
choose_file.send_keys(file_location)
正確なファイルパスを送信することで、フォルダーナビゲーションプロセス全体をスキップして、必要なファイルを見つけることができます。パスを送信すると、次の画面が表示され、ファイルが読み込まれて送信の準備ができていることが示されます。
「タスクの送信」ボタンを選択してクリックすると、タスクが送信されます!
# Locate submit button and click
submit_assignment = driver.find_element_by_id('submit_file_button')
submit_assignent.click()
クリーニング
ファイル管理は常に重要なステップです。再送信したり、古いジョブを失ったりしないようにしたいと思います。最善の解決策は
completed_assignments
、ファイルをフォルダーに保存submitted_assignments
して、ダウンロードしたらすぐにフォルダーに移動することだと考えました。コードの最後のビットはosモジュールを使用して、完了したジョブを正しい場所に移動します。
# Location of files after submission
submitted_file_location = os.path.join(submitted_dir, submitted_file_name)
# Rename essentially copies and pastes files
os.rename(file_location, submitted_file_location)
すべてのソースコードは、コマンドラインから実行できる1つのスクリプトにパッケージ化されています。エラーの可能性を制限するために、私は一度に1つのジョブのみを送信します。これは、プログラムの開始に約5秒しかかからないことを考えると大したことではありません。
プログラムを実行すると、次のようになります
。プログラムは、ロードする前にこれが正しいジョブであることを確認する機会を与えてくれます。プログラムが終了すると、次の出力が得られます。
プログラムの実行中に、Pythonの実行を確認できます。
結論
Pythonによる自動化技術は、一般的なデータサイエンス分野でも、多くのタスクでも優れています。たとえば、Seleniumを使用して毎日新しいデータファイルを自動的にダウンロードすることができます(WebサイトにAPIがない場合)。一見スクリプトを書くのは退屈に思えるかもしれませんが、利点は、コンピュータにこのシーケンスを必要なだけ何度でも同じ方法で繰り返させることができることです。プログラムは決して焦点を失うことはなく、Twitterに行きます。完全なシーケンスで正確に手順を実行します(サイトが変更されるまで、アルゴリズムは正常に動作します)。
重要なタスクを自動化する前に注意する必要があることを述べなければなりません。私は常に戻ってタスクを再送信できるため、この例は比較的リスクが低く、通常はプログラムが機能するかどうかを再確認します。 Webサイトは変化し、プログラムを変更しないと、本来の目的とはまったく異なるスクリプトを実行することになります。
ROIに関しては、このプログラムを使用すると、タスクごとに約30秒節約でき、書き込みに2時間かかります。それを使用して240の割り当てを完了すると、時間内にプラスになります!ただし、このプログラムのメリットは、問題に対するクールなソリューションを開発することにあり、その過程で多くのことを教えます。私の時間は、課題を自動的に提出する方法を理解するよりも、課題を完了するために効率的に費やすことができたかもしれませんが、課題を完全に楽しんでいました。 ...
SkillFactoryの有料オンラインコースを受講して、スキルと給与の注目の職業をゼロから取得する方法の詳細をご覧ください。
- 機械学習コース(12週間)
- Data Science (12 )
- (9 )
- «Python -» (9 )