哥伦布

用Python写一个教务系统学生辅助demo-期末大作业

学校有开python课带我们过一遍基础后,要求完成一个期末大作业。

花了些时间去b站过了视频,加上有一点前端的基础觉得python还是挺好玩的,各种第三方库调来调去,会看文档和数据操作问题不大。

搜资料查视频写了个简易版的学生爬取教务系统资源demo 先上效果图。(赶时间写不好,勿喷)

用户名密码我用getpass隐藏了

主要功能

查看校园logo
今日课表查询
课表查询
成绩查询
校历查看

源码(大部分都加注释)

复制代码
考试结束再放出来
# python标准库 文档地址:https://docs.python.org/zh-cn/3/library/index.html
import requests #请求 参考:https://www.cnblogs.com/lanyinhao/p/9634742.html
import time #时间 参考:https://www.runoob.com/python/python-date-time.html
import getpass #CMD密码隐藏输入,pycharm不适用 参考:https://www.cnblogs.com/ld1977/p/6004723.html
import os #处理文件和目录 参考:https://www.runoob.com/python/os-file-methods.html
from datetime import date #获取日期
from selenium import webdriver #自动化测试工具 参考:https://blog.csdn.net/weixin_36279318/article/details/79475388
from selenium.webdriver.common.keys import Keys #模拟人为键盘操作
from selenium.webdriver.common.by import By #定位元素 就是和前端获取dom标签差不多 参考:https://blog.csdn.net/weixin_45242451/article/details/92847357

#chromedriver_win32是打开一个浏览器的自动化工具
# chrome_driver = r'D:\software\chromedriver_win32\chromedriver.exe'
#phantomjs是无浏览器的自动化工具
# phantomjs_driver = r'D:\software\phantomjs-2.1.1-windows\bin\phantomjs.exe'

# 打包部署 参考:https://www.cnblogs.com/yiwenrong/p/12664780.html
chrome_driver = 'chromedriver.exe'
browser = webdriver.Chrome(executable_path=chrome_driver)
# browser = webdriver.PhantomJS(executable_path=phantomjs_driver)

# 校园内网
url0 = 'http://10.0.22.17/'
# 校园网
# url0 = 'http://jwgl.thxy.cn'
#登录进去的首页
login_index='login!welcome.action'

# 登录教务系统
def login():
print("正在执行模拟登录操作中,请根据提示进行相应的操作\n")
print("请求教务系统登录页面中..\n")
browser.get(url0)

print("获取登录验证码图片的URL..\n")
jpg = browser.find_element(By.ID,"captcha_img")
img_src = jpg.get_attribute("src")

print("获取cookie..\n")
cookie_bro = browser.get_cookies()
cookie1 = cookie_bro[1]['value']

print("设置请求头..\n")
# 设置headers全局变量 请求头中UA标识很重要,去请求一个网址,session那边要知道你是什么来源
global headers
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',
'Referer': url0,
'Cookie': 'JSESSIONID='+cookie1+'; browserID=364939872',
'Connection': 'keep-alive',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Host': '10.0.22.17'
}
print("携带请求头,请求图片..\n")
img_res = requests.get(img_src, headers=headers)
img_content = img_res.content
print("正在下载登录验证码..\n")
# wb: 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
with open('check.jpg', 'wb') as f:
f.write(img_content)
print("验证码下载完成!\n")
# 打开图片
os.startfile(r'check.jpg')
print("正在预览验证码..\n")

code = input("请输入验证码:")
username = getpass.getpass("\n请输入用户名:")
password = getpass.getpass("\n请输入密码:")

# 模拟人为给dom标签输入上对应得到的数据
browser.find_element(By.ID,"account").send_keys(username)
browser.find_element(By.ID,"account").send_keys(Keys.TAB) #TAB模拟换行
browser.find_element(By.ID,"password").send_keys(password)
browser.find_element(By.ID,"j_captcha").send_keys(code)
#点击登录
browser.find_element(By.ID,"submit_btn").click()

# 获取校历
def getSchoolCalendar():
while True:
print("\n====== ★校历查询★ ======\n")
print('按r键开始执行,退出按q')
scode=input('请输入:')
if scode =='r':
# 获取时间戳
timestamp = time.time()
print('请输入需要查询校历的学年学期,比如:2021第一学期:202101,第二学期:202102,以此类推')
xnxqdm = input("请输入学期:")
url = url0 + "xlxx!getXlxx.action"
param = {
'xnxqdm': xnxqdm,
'_': timestamp
}
res = requests.get(url=url,params=param,headers=headers)
res_text = res.text
file_name = f'{xnxqdm}学期校历'
print(f'{file_name}本地生成成功:\n{res_text}')
with open(f'./{file_name}.html', 'w', encoding='utf-8') as fp:
fp.write(res_text)
elif scode =='q':
break

# 获取成绩
def getScore():
while True:
print("\n====== ★成绩查询★ ======\n")
print('按r键开始执行,退出按q')
scode=input('请输入:')
if scode =='r':
print('请输入需要查询成绩的学年学期,比如:2021第一学期:202101,第二学期:202102,以此类推')
xnxqdm = input("请输入学期:")
url = url0 + 'xskccjxx!getDataList.action'
data = {
'xnxqdm': xnxqdm,
'jhlxdm':'',
'page': 1,
'rows': 100,
'sort': 'xnxqdm,kcdm',
'order':'asc'
}
res = requests.post(url=url, data=data, headers=headers)
res_text = res.text
file_name = f'{xnxqdm}学期成绩'
print(f'{file_name}本地生成成功:\n{res_text}')
with open(f'./{file_name}.txt','w', encoding='utf-8') as fp:
fp.write(res_text)
elif scode =='q':
break

# 根据条件获取课表
def getCourse():
while True:
print("\n====== ★课表查询★ ======\n")
print('按r键开始执行,退出按q')
scode=input('请输入:')
if scode =='r':
print('请输入需要查询课表的学年学期,比如:2021第一学期:202101,第二学期:202102,以此类推')
xnxqdm = input("请输入学期:")
print("一学期一般1-18周")
zc = input("请输入第几周:")

url = url0 + 'xsgrkbcx!getKbRq.action'
param = {
'xnxqdm': xnxqdm,
'zc': zc
}
res = requests.get(url=url, params=param, headers=headers)
res_text = res.text
file_name = f'{xnxqdm}学期第{zc}周课表'
print(f'\n{file_name}本地生成成功:\n{res_text}')
with open(f'./{file_name}.txt','w', encoding='utf-8') as fp:
fp.write(res_text)
elif scode =='q':
break

# 获取今日课表
def getNowDayCourse():
while True:
print("\n====== ★今日课表查询★ ======\n")
print('按r键开始执行,退出按q')
scode=input('请输入:')
if scode =='r':
# 获取当天日期
yesterday = date.today().strftime("%Y-%m-%d")
url = url0 + "desktop!xskb.action"
param = {
'rq':yesterday
}
res = requests.get(url=url,params=param,headers=headers)
file_name = f'今日课表({yesterday})'
res_text = res.text
print(f'\n{file_name}本地生成成功:\n{res_text}')
with open(f'./{file_name}.txt',"w",encoding='utf-8') as fp:
fp.write(res_text)
elif scode=='q':
break

# 获取logo
def getLogo():
print("\n====== ★查看校园logo★ ======\n")
logo_url = url0 +'styles/images/customize/logo_school.png'

logo_res = requests.get(logo_url)
logo_content = logo_res.content
print("正在下载学院logo...\n")
with open('logo.jpg', 'wb') as f:
f.write(logo_content)
print("学院logo下载完成!\n")
# 打开图片
os.startfile(r'logo.jpg')
print("正在预览logo...\n")

def ooo():
print("正在全速开发中...\n")
# 功能菜单
def menu():
while True:
print("\n====== ★功能菜单★ ======\n")
print("0、查看校园logo 输入:0")
print("1、今日课表查询 输入:1")
print("2、课表查询 输入:2")
print("3、成绩查询 输入:3")
print("4、校历查看 输入:4")
print("5、退出脚本 输入:q")
close_status = input("\n请输入使用功能序号:")
if close_status =='0':
getLogo()
elif close_status =='1':
getNowDayCourse()
elif close_status =='2':
getCourse()
elif close_status == '3':
getScore()
elif close_status == '4':
getSchoolCalendar()
elif close_status == 'q':
print("\n谢谢使用!")
browser.quit()
break

if __name__ == "__main__":
print("\n=========== 欢迎使用广州理工学院-教务系统学生辅助脚本(学生Dev) ===========\n")
print("=========== 说明:19软件2班-南柯-期末大作业 ===========\n")
login()
menu()


 
复制代码

最后是我打包的过程(因为这东西写好了 去一台新的PC没有Python环境的支持我们是无法运行这个py文件的,所以我们需要把他打包成一个exe,打包过程中他会把我们文件中引入的第三方库自动带入)

安装打包工具

python -m pip install pyinstaller

最后在当前目录执行,准备一张ico后缀图标放在一起

pyinstaller -F --icon=jiaowu.ico 广理教务自动化学生辅助脚本.py

打包后会生成build和dict

 将自动化工具一起放进来,打包前py文件相对路径引用这个exe就行了

然后就可以发给你的小伙伴使用啦

 

posted @   南柯Dream丶  阅读(395)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
历史上的今天:
2020-11-24 Vue插槽详解(匿名,具名,作用域)
2020-11-24 Vue 父子组件挂载顺序
2020-11-24 Vue 生命周期
2020-11-24 Win10右键管理提示“该文件没有与之关联的程序来执行此操作”如何解决?
点击右上角即可分享
微信分享提示