本文使用python的selenium模块实现一个自动打卡程序
本文结构:首先介绍三个预备知识,大佬可以跳过啦。然后直接上手代码(因为这个代码真的超级超级简单)。不过 不建议没接触过这个模块的旁友直接看代码。毕竟不同的网页处理方法还是不一样的。
本文尽可能详细地介绍原理,致力于让读者看完能够写出各种不同打卡网页的程序。
selenium模块简介
这个模块允许我们使用py程序来操作Chrome、Firefox等主流浏览器,实现自动化测试。
我们要让电脑帮我们用浏览器做一件事情,就要告诉它先点哪里,输入什么内容,然后再点哪里。这个“点哪里”就是通过selenium模块的定位来实现的:
它提供了八种定位方法,感兴趣的朋友可以看一下。这里主要介绍程序中用到的三种:(具体使用方法在代码部分讲)
方法 | 作用 |
---|---|
find_element_by_id() | 通过元素的id定位 |
find_element_by_name() | 通过元素的name定位 |
find_element_by_xpath() | 通过元素的xpath定位 |
这个id
、name
和xpath
是什么呢?其实就是网页中某个内容的属性。
我们知道一个网页是由许多元素组成的,比如你正在浏览的这个博客,其中有博主我的头像、你正在看的文字、左下角的点赞按钮(疯狂明示)等等等等。程序员在写网页的时候,为了方便使用辨别这些元素,会给元素加上不同的id
和name
,就像我们的名字一样。
name
和id
的区别在于,name
就像我们的名字,而id
像我们的身份证号。可能有重名的人,但没有同样的身份证号。(这么说并不严谨,但是姑且这么理解吧 其它的区别对于这个程序也不是很重要 )值得注意的是,并不是每一个元素都要有name
或者id
属性。所以我们还需要第三种方法XPath
定位
比如你正在浏览的这个博客,按下F12
,点击element
查看源代码,有的标签是这样的:我们说的
比如这个div标签就只有id
属性
可以看到上图的input标签既有id
这个属性,又有name
这个属性。
接下来安装selenium:
pip install Selenium
浏览器驱动
selenium本身不具有打开浏览器的能力,需要各个浏览器的驱动配合。接下来我们安装一个浏览器驱动:下载之前查清楚自己浏览器的版本!
Chrome浏览器版本对应
Chrome各种版本驱动下载
其他浏览器可以自行百度下载地址
下载完浏览器驱动,还需要配置一下环境变量让你的程序能找得到这个驱动:(环境变量里存的路径就是告诉电脑,在需要运行某个程序的时候可能可以去哪里找。系统在收到一个程序运行命令以后,会到这个环境变量表里一个个路径查看有没有你要的程序)
我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将你的驱动存放路径如“F:\ChromeDriver”目录添加到Path的值中。比如:Path字段;F:\ChromeDriver
配置完环境变量,就可以使用下面的代码获取浏览器驱动driver了:
driver = webdriver.Chrome()
模拟鼠标点击、填写
以下面这个网页为例,我需要填写学号、密码然后点击“登陆”按钮。那么首先,如何在使用程序来定位这几个需要填写/点击的位置?用上面介绍的方法!
F12
找到Elements源码,然后点击下图左边的鼠标图标,再点击上图中需要输入学号的位置——寻找这个元素的源码
我们找到了这个:
可以看到这个标签有一个name属性,其值为userid
。那么我们就使用它的name来定位吧!代码:
driver.find_element_by_name('userid').send_keys('你的学号')
上图driver
是在本文驱动安装处获取的浏览器驱动
一行代码就搞定了学号填写!是不是很简单?!对于其它我们需要填的地方,如法炮制即可。
遇到没有name
属性的标签怎么办?比如说下面这个“登陆”按钮:
没关系!它有id
啊。让我们用id
来定位:
driver.find_element_by_id('formSubmitBtn').click()#点击登录
XPath定位
有的位置没有id
也没有name
,只有class
,怎么办,难道用class
来定位?但是别的元素也有相同的class
。那我们只能用xpath
了(实际上,前面的定位用xpath应该都没问题,因为每个页面元素都必有一个唯一的xpath)
如何找到某个输入框的xpath:右键单击输入框的代码打开菜单以后按照下图操作:
找到一个输入框的xpath以后,我们将其存在一个变量中(因为直接使用会很长。。。当然你直接粘贴到相应位置也没啥问题)
movement = "/html/body/div[1]/form/div[3]/div[2]/label[1]"#当日没有移动的按钮
driver.find_element_by_xpath(movement).click()#点选按钮
几个细节
博主示例的这个网站在填写打卡信息以后,需要点击“提交”然后过一会儿才会弹出确认窗口,还需要确认一次提交。但是在点击“提交”按钮的同时,确认窗口还没出现。所以我们在两次点击之间使用一个sleep让程序暂停那么一会儿,等这个窗口出来了,再点击确认。
driver.find_element_by_xpath(submit).click()#点击提交
time.sleep(2)
driver.find_element_by_xpath(check).click()#点击确定
完整代码
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyrsistent._transformations import inc
# 只需修改下面三项即可 学号 密码 打卡网址
username = "登陆账号"
password = "对应密码"
url = "此处填写打卡网址"
# 下面是每次填报的时候几个需要填写的地方,F12找到这些位置的 full XPath
movement = "/html/body/div[1]/form/div[3]/div[2]/label[1]"#有无移动
touch = "/html/body/div[1]/form/div[4]/div[2]/label[1]"#有无接触史
condition = "/html/body/div[1]/form/div[5]/div[2]/label[1]"#健康状况
quarantine = "/html/body/div[1]/form/div[6]/div[2]/label[1]"#是否隔离
inCollege = "/html/body/div[1]/form/div[7]/div[2]/label[1]"#是否在校
submit = "/html/body/div[1]/form/div[8]/a"#提交
check = "/html/body/div[3]/div[2]/div[2]/a[2]"#最后的确定按钮
# 模拟登陆打卡
def do_login(driver):
# driver.maximize_window() 将窗口最大化
# 找到登录框 输入账号密码
driver.find_element_by_name('userid').send_keys(userName)
driver.find_element_by_name('userpwd').send_keys(password)
driver.find_element_by_id('formSubmitBtn').click()#点击登录
driver.find_element_by_xpath(movement).click()
driver.find_element_by_xpath(touch).click()
driver.find_element_by_xpath(condition).click()
driver.find_element_by_xpath(quarantine).click()
driver.find_element_by_xpath(inCollege).click()
driver.find_element_by_xpath(submit).click()#点击提交
time.sleep(2)
driver.find_element_by_xpath(check).click()#点击确定
time.sleep(1)
if __name__ == '__main__':
# 模拟浏览器打开网站
driver = webdriver.Chrome()
driver.get(url)
# 登录并打卡
do_login(driver)
print("打卡结束")
time.sleep(1)#终端给你时间确认已经打卡成功
driver.quit()
写完程序就可以打成exe啦,添加一下开机启动,或者不添加放桌面手动启动也很方便啊哈哈。打包exe教程
声明:本博客仅供学习交流使用,请勿将本博客所写内容用于违法行动。所造成的一切后果本博主并不承担
配置到服务器实现打卡全自动
自从写完这个程序我就在想,万一哪天我一个早上不用电脑,岂不是错过了打卡。或者还要为了打卡开一次电脑,岂不是更麻烦。大佬提供了一个思路:直接把程序放到服务器上,定时启动。哈哈哈哈妙啊!(明明是自己菜连这都想不到)
于是有了下面这篇博客将自己的打卡程序配置上服务器,完成全自动操作 so easy~