初学者使用的Python:如何指挥网络

简单的Web自动化之旅



图片


问题:提交作业需要浏览一个如此复杂的网页迷宫,以至于我多次将作业提交到错误的位置。另外,尽管此过程仅花费1-2分钟,但有时似乎是一个无法克服的障碍(例如,当我在深夜完成任务时,几乎记不起密码)。



解决方案:使用Python自动提交完成的作业!理想情况下,我可以保存作业,键入一些键,然后在几秒钟内加载我的工作。听起来一开始听起来确实太好了,但是后来我发现了Selenium,这是一种可以与Python一起使用来浏览网络的工具。



图片


每次我们以相同的步骤顺序在Internet上重复乏味的操作时,这是编写程序以实现流程自动化的绝佳机会。使用Selenium和Python,我们只需要编写一次脚本,然后我们可以根据需要运行任意多次,并避免重复执行重复任务(对于我而言,不可能将作业发送到错误的位置)!



在这里,我将介绍为自动(正确地)提交作业而开发的解决方案。在此过程中,我们将介绍使用Python和Selenium进行程序化Web控制的基础知识。尽管该程序有效(我每天都在使用它!),但它非常独立,因此您将无法复制和粘贴应用程序代码。但是,此处的一般方法可以应用于无限数量的情况。(如果您想查看完整的代码,可以在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”,“分配3-大图形模型.txt中的推论”)



这负责文件管理,现在程序知道要包含的类和分配。下一步是使用Selenium导航到正确的网页并加载作业。



Web控制与硒



为了开始使用Selenium,我们导入库并创建一个Web驱动程序,该驱动程序是由程序控制的浏览器。在这种情况下,我将使用Chrome作为浏览器,并将驱动程序发布到我提交作业的Canvas网站上。



import selenium
# Using Chrome to access web
driver = webdriver.Chrome()
# Open the website
driver.get('https://canvas.case.edu')


当我们打开Ca​​nvas网页时,我们面临第一个障碍-登录框!为了解决这个问题,我们将需要输入ID和密码并点击“登录”按钮。



图片



想象一下,Web驱动程序是谁以前从未看过网页的人:我们需要确切说明单击的位置,打印的内容以及单击的按钮。有几种方法可以告诉我们的Web驱动程序要查找哪些元素,它们都使用选择器。选择器是网页上元素的唯一标识符。要找到特定元素的选择器,例如“ CWRU ID”字段,我们需要查看网页的代码。在Chrome浏览器中,可以通过按Ctrl + Shift + I或右键单击任何元素并选择“查看代码”来完成此操作。这打开Chrome开发人员工具,这是一个非常有用的应用程序,可以显示任何网页HTML



为了找到“ CWRU ID”字段的选择器,我右键单击该字段,单击“查看代码”,然后在开发人员工具中看到以下内容。高亮显示的行对应于id_box元素(此行称为HTML标记)。



图片



该HTML可能看起来很庞大,但是我们可以忽略大多数信息,而将注意力集中在部分id = "username"name = "username"。 (这些称为HTML标记属性)。

id使用我们的网络驱动程序选择字段,我们可以使用属性id name我们在开发人员工具中找到的 Selenium 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()


登录后,我们会被这个有点令人生畏的工具栏所打招呼:



图片



我们再次需要在网页上浏览程序,指定要单击的确切项目以及要输入的信息。在这种情况下,我告诉程序从左侧菜单中选择课程,然后选择与我需要传递的作业相对应的课程:



# 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_assignmentssubmitted_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)


所有源代码都打包成一个脚本,可以从命令行运行。为了限制发生错误的可能性,我一次只提交一份作业,考虑到启动程序只需要5秒钟,这没什么大不了的!



这是运行程序时的样子:



图片



该程序使我有机会在加载之前确保这是正确的作业。程序完成后,我得到以下输出:



图片



在程序运行时,我可以观察到Python在为我运行:



图片



结论



使用Python的自动化技术非常适合许多任务,无论是常规任务还是我的数据科学领域。例如,我们可以使用Selenium每天自动下载新的数据文件(假设该网站没有API)。乍一看脚本似乎很乏味,但好处是我们可以使计算机以完全相同的方式重复此序列任意多次。该程序将永远不会失去焦点,并将转到Twitter。它将完全按照正确的顺序执行这些步骤(算法将正常工作,直到站点更改为止)。



我必须提到,在自动化关键任务之前,您必须小心谨慎。此示例的风险相对较低,因为我总是可以返回并重新提交任务,并且通常会仔细检查程序是否正常运行。网站发生了变化,如果您不做任何更改,最终可能会得到一个脚本,该脚本所做的事情与您最初打算的完全不同!



就投资回报率而言,此程序可为我节省约30秒的任务时间,并花费2个小时来编写代码。因此,如果我用它来完成240个作业,我将获得加分!但是,该程序的收益在于开发一个解决问题的不错的方法,并且在此过程中有很多启示。虽然我本可以花更多的时间来完成任务而不是弄清楚如何自动上交任务,但我还是很享受挑战,因为有一些问题像解决问题一样令人满意,Python证明是解决问题的一个很好的工具。 ...



图片



通过完成SkillFactory付费在线课程,了解如何从头开始或成为技能和薪资水平升级的热门职业的详细信息:











All Articles