坐标某带专,学校日常要求每天打卡,而且要在8点前打卡,万一睡过头的话估计一睁眼就是辅导员在群里咆哮了,所以开始学习selenium打算搞一个一键打卡的脚本出来。
先考虑一下需要有什么步骤吧:1. 在特定时间打开并进入健康打卡网页.2. 定位输入框位置,并输入账号密码 3. 进入打卡页面 4. 定位需改变选项框,并将框中内容选为绿码 5. 提交 6. 设置开关,防止重复打卡,自动关闭计算机等。
需要用到这些函数,从selenium模块中导入
接下来要注意的是,在开始爬网页之前,要先安装相应浏览器webdriver,
例如我使用的是Edge,在Microsoft Edge WebDriver - Microsoft Edge Developer直接下载安装,并且记住安装位置。
接下来打开需要访问的网页:
#s = Service(r"【刚刚安装的webdriver.exe的位置】")
#driver.get('需要访问的网页的url')
在这里先试运行一下以上6行吧(以baidu为例):
1 from selenium import webdriver
2 from selenium.webdriver.common.by import By
3 from selenium.webdriver.chrome.service import Service
4
5 s = Service(r"D:\Application\edgedriver_win32\msedgedriver.exe")
6 driver=webdriver.Edge(service=s)
7 driver.get('https://www.baidu.com/')
运行以上代码后会自动打开URL为https://www.baidu.com/的网页,同样的,也可以这样打开别的页面,比如打卡系统......
好了现在已经完成第一步了,接下来需要达成的目的是:将用户号和密码输入到那个框里面,然后点击【进入健康状况上报平台】。
F12进入开发者模式,观察页面源代码:
我们爬网页时需要了解一下html,html是一种用于创建网页的标准标记语言,web开发常用的前端语言,HTML 教程 | 菜鸟教程 (runoob.com),在浏览器的开发者模式中可以直接看到网页源码。
定位到用户号输入框的name属性为“uid”,同理密码输入框的name=“upw”,【进入】按钮的name=”submit“。
idinputbox=driver.find_element(By.NAME,"uid") #定位账号(学号)输入框
pwinputbox=driver.find_element(By.NAME,"upw") #定位密码输入框
LoginButton=driver.find_element(By.NAME,"smbtn") #定位"进入健康状况上报平台"按钮
idinputbox.send_keys('【用户名】') #输入用户名
pwinputbox.send_keys('【密码】') #输入密码
LoginButton.click() #点击按钮,进入下一界面
现在已经登入打卡系统了,接下来的操作跟上边差不多。
定位“本人填报”按钮的位置,并点击:
reportbutton=driver.find_element(By.XPATH,'//*[@id="bak_0"]/div[11]/div[3]/div[4]') #这里是通过Xpath定位的,在源代码中点击要定位的元素右键可以直接复制该元素的Xpath
reportbutton.click() #点击按钮
接下来按照预想应该是进入下一界面了,但是这里会报错,
说定位不到,这是因为“本人填报”元素实际上是处在一个嵌套的表单中,需要先找到该元素所在的frame表单,定位这个表单,跳转到这个表单,上面两行代码可以修改如下:
xf=driver.find_element(By.ID, "zzj_top_6s")
driver.switch_to.frame(xf)
reportbutton=driver.find_element(By.XPATH,'//*[@id="bak_0"]/div[11]/div[3]/div[4]') #这里是通过Xpath定位的,在源代码中点击要定位的元素右键可以直接复制该元素的Xpath
reportbutton.click() #点击按钮
driver.switch_to.default_content()#切换回主文档
在解决frame表单嵌套导致定位失败的问题时参考了这篇文章:https://www.jianshu.com/p/83087c24ab19
然后就进入最后一个页面了。
定位和点击提交表格,方法和上一步骤一样。
终于可以半夜12点之前睡觉了。
但是仅此而止的话意味着如果想要这个程序发挥作用,我还得在12点后打开电脑然后......再让它自己打卡。突然想起来一个笑话,一人卖跳蚤药,招牌上写出“卖上好蚤药”。问:“何以用法?”答曰:“捉住跳蚤,以药涂其嘴,即死矣。”
最后一步,把程序加到任务计划库里
设置触发时间为12点15分,并且在代码的末尾加上关机函数,电脑保持待机,打完卡直接关机
os.system('shutdown /s /t 0') #关机
啊,终于可以睡觉了。
感觉这操作好傻啊,不过以后可以试试干点别的...