python 网页自动打卡_Python-selenium包 实现自动打卡

一、配置要求:Python 安装 selenium 包

安装 chrome 及 XPath Helper 扩展程序

安装 chrome 版本对应的 chromedriver 程序并配置环境变量安装 selenium 包

selenium 包可以通过 pip 安装,速度太慢建议使用清华镜像:

pip install selenium

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium

2. 安装 XPath Helper 扩展程序

安装 chrome 后,在 chrome 网上应用商店 搜索并添加 XPath Helper 扩展程序。

重启 chrome,网址右侧出现 X 小黑盒表示安装成功。

3. 安装 chromedriver 程序,并配置环境变量

首先查看 chrome 版本:浏览器右上角的三个点 - 帮助 - 关于 Google Chorme,笔者版本是 86.0.4240.111。前往 chromedriver 镜像网站 进入对应版本区,本文对应 86.0.4240.22/,选择相应系统的压缩包安装。

将压缩文件解压到 chrome 安装目录下,并复制该路径,右键此电脑 -属性 - 高级系统设置 - 高级 - 环境变量 - 系统变量 - 双击Path - 新建 - 将复制的路径粘贴到里面 - 确定保存。

二、编写程序导入需要的包

from selenium import webdriver

import time

import random

# time 和 random 包用于避免被系统识别出程序打卡

2. 定义“仿真”函数,其实就是将 time.sleep 函数穿插在程序中,让程序在运行的各个节点暂停随机时间再继续执行,这样运行就没有规律性

def sleep(a = 1, b = 2):

time.sleep(random.uniform(a, b))

3. 编写打卡程序需要提前说明的一点点知识

程序的运行步骤和真实打卡步骤一致,本质就是告诉程序在这里输入这个,然后点击那个链接,再点击...... 因此编写程序也就是将每个步骤代码化,selenium 包提供了非常强大的实现功能。当然打卡其实只是客户端的功能,而 selenium 除了客户端,还能实现服务器端的操作,有兴趣可以去 selenium 官网 学习。设置作业浏览器

#使用 chrome

driver = webdriver.Chrome()访问指定 url / 返回当前 url

driver.get('url')

driver.current_url

#对于一些会加载或跳转的页面,程序有时不能及时更新url,因此返回当前url可以很好地排除错误定位页面元素

HTML 代码中包含各种各样的标签,如

等,其中每个标签中都有各自的属性,常用属性如 href, id, name, class, type 等。selenium 主要通过标签 + 属性的方式定位元素。

find_element_by_id

find_element_by_name

find_element_by_xpath

find_element_by_link_text

find_element_by_partial_link_text

find_element_by_tag_name

find_element_by_class_name

find_element_by_css_selector对定位好的元素进行操作

本文主要涉及输入、单击和获取元素的标签内容的功能

#定位元素

a = find_element_by_*

#输入操作

a.send_keys('content')

#单击操作

a.click()

#获取元素标签内容

a.get_attribute('innerHTML')

4. 编写程序主体

#设置登陆的用户名和密码

username = 'username'

password = 'password'

#打开chrome浏览器并访问登录网站的url

driver = webdriver.Chrome()

driver.get('https://ids.xmu.edu.cn/authserver/login?service=https://xmuxg.xmu.edu.cn/login/cas/xmu')

#打开后暂停1到2秒

sleep()

打开后看到网站需要输入用户名和密码,如何定位这两个输入框呢?F12 调出控制台查看网站源码,这里强烈建议在新窗口显示源码,同时代码编写过程不要调整测试窗口大小,否则网页排版可能会因为浏览器窗口宽度变化而改变,导致代码失效(XPath 定位方法非常依赖排版)。

打开控制台后,鼠标右键用户名的输入框 - 检查,就能在源码看到浏览器自动帮你定位到用户名的 标签,包括 id = "username", name = "username", placeholder = "用户名/username" 等属性,优先使用 id 定位,因为 id 在 HTML 文档中是唯一的。定位好元素后,将之前定义的 username 传递给 标签,同理定位并传值给 password 对应的 标签。

driver.find_element_by_id('username').send_keys(username)

driver.find_element_by_id('password').send_keys(password)

sleep()

输入完成后,用同样的方法定位并单击 登录/Login 的 标签,这里使用的是 class_name 方法。

driver.find_element_by_class_name('auth_login_btn').click()

sleep()

需要点击 Daily Health Report 应用进入打卡功能,url 为:https://xmuxg.xmu.edu.cn/app/214。

右键 - 检查,定位到该元素的源码,如下所示:

可以看到,这个元素是一个

标签,只有 class 一个属性,并且属性的值与其他应用的 class 属性值相同,因此不能仅靠 class_name 方法定位这个元素。这里作者使用了标签文本的模糊条件进行定位:

driver.find_element_by_xpath("//*[contains(text(), 'Daily Health Report')]").click()

driver.current_url

因此考虑直接用 get 方法跳转到目标网页(由于已经成功登录,因此用户名和密码会被保存在网站 php 的 session 中,不关闭浏览器,直接跳转到新网页不会导致登录状态失效的问题):

#driver.find_element_by_xpath("//*[contains(text(), 'Daily Health Report')]").click()

driver.get('https://xmuxg.xmu.edu.cn/app/214')

sleep(11, 14)

#由于网站应用加载时间较长,因此需要让程序sleep较长时间避免网站加载不全,出现程序定位不到元素的情况

进入应用后,定位并点击我的表单:

driver.find_element_by_xpath("//*[contains(text(), '我的表单')]").click()

sleep()

然后需要定位下拉框:请选择/是。如果当前显示(div 标签的 placeholder 属性)的是“请选择”,则单击该下拉框,并单击“是”,否则不用更改,返回“检测到您已打卡!”。

在源码中下拉框的

标签只有 class 一个属性,并且已选是和请选择两种状态下,class 的值并不一致,并且这个值还与日期下拉框的 class 值相同,意味着如果使用 class_name 方法或 @class 条件方法都不能准确定位到我们需要的下拉框。

这时可以利用 XPath 方法,用绝对路径定位元素。在源码中右键下拉框对应的源码 - Copy - Copy XPath 或 Copy full XPath,然后使用 xpath 方法定位(一时用一时爽,一直用emmm)。

slt_btn = driver.find_element_by_xpath('/html/body/div[1]/div/div/div/div/div[2]/div[1]/div/div/div[3]/div/div[22]/div/div/div/span[1]')

print('当前状态:', slt_btn.get_attribute('innerHTML'))

sleep()

if '是' not in a.get_attribute('innerHTML'):

a.click()

sleep()

#单击 是

driver.find_element_by_xpath('/html/body/div[8]/ul/div/div[3]/li/label').click()

sleep()

#保存

......

else:

print('检测到您已打卡!')

选择好以后,定位并点击保存,网页会弹出一个确认框,这时就不能调取源码定位,需要使用 switch_to_alert 方法确认。

#单击保存,弹出确认框

driver.find_element_by_xpath('/html/body/div[1]/div/div/div/div/div[2]/div[1]/div/div/span/span').click()

#获取确认框

confirm = driver.switch_to_alert()

sleep()

#确认

confirm.accept()

print('打卡成功!')

主体程序写完以后,如果程序执行过程出现错误需要返回一个报错提示,可以使用 try - except 语句。程序执行完成以后,关闭 chromedriver 进程,否则程序留会在后台占用内存。全部代码整合好后如下所示:

username = 'yq520'

password = '520yq'

def sleep(a = 1, b = 2):

time.sleep(random.uniform(a, b))

driver = webdriver.Chrome()

sleep()

try:

driver.get('https://ids.xmu.edu.cn/authserver/login?service=https://xmuxg.xmu.edu.cn/login/cas/xmu')

sleep()

#输入用户名和密码

driver.find_element_by_id('username').send_keys(username)

driver.find_element_by_id('password').send_keys(password)

sleep()

#单击登录

driver.find_element_by_class_name('auth_login_btn').click()

sleep()

#直接跳转到应用页面

driver.get('https://xmuxg.xmu.edu.cn/app/214')

sleep(11, 14)

#打开我的表单

driver.find_element_by_xpath("//*[contains(text(), '我的表单')]").click()

sleep()

#下拉框判断:请选择/是

slt_btn = driver.find_element_by_xpath('/html/body/div[1]/div/div/div/div/div[2]/div[1]/div/div/div[3]/div/div[22]/div/div/div/span[1]')

print('当前状态:', slt_btn.get_attribute('innerHTML'))

sleep()

if '是' not in slt_btn.get_attribute('innerHTML'):

#下拉选项

slt_btn.click()

sleep()

#单击 是/Yes

driver.find_element_by_xpath('/html/body/div[8]/ul/div/div[3]/li/label').click()

sleep()

#单击保存

driver.find_element_by_xpath('/html/body/div[1]/div/div/div/div/div[2]/div[1]/div/div/span/span').click()

#确认弹框

confirm = driver.switch_to_alert()

sleep()

confirm.accept()

print('打卡成功!')

else:

print('检测到您已打卡!')

except:

print('打卡未完成啊啊啊啊啊!!!')

driver.quit()

三、将脚本添加到任务计划程序库

程序写好了还不是要动手双击运行?还不是一样会忘记。莫急,让电脑定时执行就好啦。右键此电脑 - 管理 - 系统工具 - 任务计划程序 - 任务计划程序库 - Microsoft - Windows - 创建任务

名称任取,单击触发器 - 新建 - 设置每天,开始执行时间,在高级设置中,可以设置随即延迟时间(“仿真”功能),重复任务间隔及持续时间长度。笔者的设置如下:

保存以后点击操作 - 新建 - 添加程序或脚本,把写好的 Python 脚本添加进去,还可以根据需求在条件、设置选项卡进行个性化设置,设置完保存就好啦!

学校的健康打卡系统记录了学生的填写历史,避免重复填写的麻烦,已经非常方便了!笔者编写自动打卡程序主要是防止有时忘记打卡,影响评奖评优,另一方面也是为了研究 selenium 包的使用。如果身体不适还是要根据身体真实情况修改前面的选项再保存,校友别举报哈(狗头保命)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值