一个查询暨大宿舍账户余额的小程序

一个查询暨大宿舍账户余额的小程序

查询暨南大学宿舍电费的Python脚本:dorm_balance.py
今天正好开始选课了,不过因为我的课已经修完了,所以我这一次就不用选课了。于是我就想研究一下能不能设计一个自动选课的程序。研究了好久,最后意识到这个问题很复杂,还需要继续学习,不过在研究这个问题的过程中发现了Python的selenium包,这个包可以自动驱动浏览器进行一些操作然后获取数据。于是就想应该可以解决一个简单的问题——通过暨南大学能耗系统查询宿舍的账户余额。

首先打开这个网页,需要登录:

用户名和密码都是宿舍号,例如查询我们宿舍的:

下面将介绍我是如何使用selenium包实现这个自动查询功能的。

安装chromedriver驱动

chromedriver下载地址。点击进入即可选择自己需要的版本下载安装。

安装selenium包

在终端运行:

1
pip install selenium

然后就可以开始写程序了:

首先需要定义驱动的浏览器:

1
2
3
4
5
6
7
from selenium import webdriver
from os import environ
chromedriver = "/usr/local/bin/chromedriver"
environ['webdriver.chrome.driver'] = chromedriver
driver = webdriver.Chrome(chromedriver)
driver.get('http://10.136.2.5/JNUWeb/')
driver.implicitly_wait(3) # 隐式等待

然后是找到用户名、密码和登录按钮的位置。打开检查,根据Element找到这些元素的位置,虽然包中查找元素有很多种方式,但是发现还是使用find_element_by_xpath()最为方便,其中xpath用下图中的方法即可直接获取:

1
2
3
4
5
6
account = driver.find_element_by_xpath('//*[@id="login-userName11"]')
passwd = driver.find_element_by_xpath('//*[@id="login-password"]')
account.send_keys(dormid) # 提交用户名
passwd.send_keys(dormid) # 提交密码
login = driver.find_element_by_xpath('//*[@id="loginBtn"]')
login.click() # 点击登录

下面一步就是在点击登录之后的页面的Element中找账户余额的xpath了,一个方便寻找的办法是先选中这个箭头:

然后就能鼠标指哪,Element亮哪了。

然后继续:

1
2
balance = driver.find_element_by_xpath('//*[@id="messagebox-1001-displayfield-inputEl"]/span[1]').text
print(dormid, "宿舍的账户余额为:", balance)

最后关闭浏览器:

1
driver.close()

封装成函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def dorm_balance(dormid = "T30332"):
"""
查询暨南大学各个宿舍的账户余额
:param dormid: 宿舍号,默认为我的宿舍,T30332
:return: 宿舍的账户余额
示例:
dorm_balance("T30332")
dorm_balance("T30333")
"""
from selenium import webdriver
from os import environ
chromedriver = "/usr/local/bin/chromedriver"
environ['webdriver.chrome.driver'] = chromedriver
driver = webdriver.Chrome(chromedriver)
driver.get('http://10.136.2.5/JNUWeb/')
driver.implicitly_wait(3)
account = driver.find_element_by_xpath('//*[@id="login-userName11"]')
passwd = driver.find_element_by_xpath('//*[@id="login-password"]')
account.send_keys(dormid)
passwd.send_keys(dormid)
login = driver.find_element_by_xpath('//*[@id="loginBtn"]')
login.click()
balance = driver.find_element_by_xpath('//*[@id="messagebox-1001-displayfield-inputEl"]/span[1]').text
print(dormid, "宿舍的账户余额为:", balance)
driver.close()
return balance

测试

1
2
3
4
5
dorm_balance("T30332")
dorm_balance("T30333")

T30332 宿舍的账户余额为: 25.62
T30333 宿舍的账户余额为: 6.29

旁边宿舍的电费快没了!

补注

2018年6月22日下午。
又试了一下,发现这个程序在查询不同宿舍的时候会有不同的情况出现,查询我们宿舍的时候是弹框,查询其他宿舍却是直接进入!!!跟昨晚不一样了!然后我又稍稍改动了一下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
def dorm_balance1(dormid = "T30332"):
"""
查询暨南大学各个宿舍的账户余额
:param dormid: 宿舍号,默认为我的宿舍,T30332
:return: 宿舍的账户余额
示例:
dorm_balance("T30332")
dorm_balance("T30333")
"""
from selenium import webdriver
from os import environ
chromedriver = "/usr/local/bin/chromedriver"
environ['webdriver.chrome.driver'] = chromedriver
driver = webdriver.Chrome(chromedriver)
driver.get('http://10.136.2.5/JNUWeb/')
driver.implicitly_wait(3)
account = driver.find_element_by_xpath('//*[@id="login-userName11"]')
passwd = driver.find_element_by_xpath('//*[@id="login-password"]')
account.send_keys(dormid)
passwd.send_keys(dormid)
login = driver.find_element_by_xpath('//*[@id="loginBtn"]')
login.click()
driver.implicitly_wait(3)
balance = driver.find_element_by_xpath('//*[@id="messagebox-1001-displayfield-inputEl"]/span[1]').text
print(dormid, "宿舍的账户余额为:", balance)
driver.close()
return balance

def dorm_balance2(dormid = "T30333"):
"""
查询暨南大学各个宿舍的账户余额
:param dormid: 宿舍号,默认为我的宿舍,T30332
:return: 宿舍的账户余额
示例:
dorm_balance("T30332")
dorm_balance("T30333")
"""
from selenium import webdriver
from os import environ
chromedriver = "/usr/local/bin/chromedriver"
environ['webdriver.chrome.driver'] = chromedriver
driver = webdriver.Chrome(chromedriver)
driver.get('http://10.136.2.5/JNUWeb/')
driver.implicitly_wait(3)
account = driver.find_element_by_xpath('//*[@id="login-userName11"]')
passwd = driver.find_element_by_xpath('//*[@id="login-password"]')
account.send_keys(dormid)
passwd.send_keys(dormid)
login = driver.find_element_by_xpath('//*[@id="loginBtn"]')
login.click()
driver.implicitly_wait(10)
balance = driver.find_element_by_xpath('//*[@id="infolist-1019"]/div/div[3]/span[2]').text
print(dormid, "宿舍的账户余额为:", balance)
driver.close()
return balance


def dorm_balance(dormid = "T30333"):
try:
dorm_balance2(dormid)
except:
dorm_balance1(dormid)
else:
print("查询未出错!")

dorm_balance("T30332")

也就是把两种情况都试试!

# Python

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×