用 Python 实现武科大教务处自动抢课
首先分析网页,找到教务处登录的验证码
然后用 Python 直接把验证码下载到本地(整个程序通过 requests 库实现):
def GetRandCode():url = r'http://jwxt.wust.edu.cn/whkjdx/verifycode.servlet'ans = foo.get(url)with open('randcode.jpg', 'wb') as file:file.write(ans.content)
找到验证码之后继续找到登录的api,我们可以发现网页发出了一个 post 请求,还有相关参数:
接着要实现登录就非常简单了,我先简单写了个登录的实现:
foo = foo = requests.session()
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36",
}def Login(username, password, randcode):url = r'http://jwxt.wust.edu.cn/whkjdx/Logon.do?method=logon'information = {'USERNAME': username, 'PASSWORD': password, 'RANDOMCODE': randcode}ans = foo.post(url, data = information, headers = headers)ans.raise_for_status()ans.encoding = ans.apparent_encodingif ans.text.find(r'http://jwxt.wust.edu.cn/whkjdx/framework/main.jsp') != -1:return Trueelse:return False
测试了一下发现是可以正常登录的,紧接着就要做获取选课列表了,方法同上。
我发现本学期的获取选课列表的地址是 http://jwxt.wust.edu.cn/whkjdx/xkglAction.do?method=toFindxskxkclb&xnxq01id=2017-2018-2&zzdxklbname=1&type=1&jx02kczid=null
很明显参数 xnxq01id
应该就是学期号了,规则也很容易发现。然后我就直接用Python实现了一下,然后发现网页会返回没有访问权限的消息。回过头分析登录过程,发现还有一个 SSO(点对点登录)的 API,然后试了一下新的登录函数:
def Login(username, password, randcode):url = r'http://jwxt.wust.edu.cn/whkjdx/Logon.do?method=logon'SSOurl = r'http://jwxt.wust.edu.cn/whkjdx/Logon.do?method=logonBySSO'information = {'USERNAME': username, 'PASSWORD': password, 'RANDOMCODE': randcode}ans = foo.post(url, data = information, headers = headers)ans.raise_for_status()ans.encoding = ans.apparent_encodingans2 = foo.post(SSOurl, headers)ans2.raise_for_status()if ans.text.find(r'http://jwxt.wust.edu.cn/whkjdx/framework/main.jsp') != -1:return Trueelse:return False
通过新的登录函数可以正常获取公选课选课列表。具体实现如下:
def GetCoursesList():url = r'http://jwxt.wust.edu.cn/whkjdx/xkglAction.do?method=toFindxskxkclb&xnxq01id=2017-2018-2&zzdxklbname=1&type=1&jx02kczid=null'ans = foo.get(url, headers = headers)ans.raise_for_status()ans.encoding = ans.apparent_encodingCoursesList = re.findall(r'<td height="23" style="text-overflow:ellipsis; white-space:nowrap; overflow:hidden;" width="\d+" title=".*"', ans.text)XKLJList = re.findall("javascript:vJsMod\(\'.*\'", ans.text)keyname = ['kcmc', 'kkdw', 'zyfx', 'xf', 'yxrs', 'yl', 'skjs', 'skzc', 'sksj', 'skdd', 'kcsx', 'kcxz', 'fzm', 'xbyq']result = []item = {}bar = 0index = 0for i in CoursesList:Left = i.find(r'title="')Right = i[Left + 7:].find(r'"')text = i[Left + 7:Left + Right + 7]#print(i)#print(text)item[keyname[bar]] = textbar = bar + 1if (bar == 14):Left = XKLJList[index].find("'")Right = XKLJList[index][Left + 1:].find("'")text = XKLJList[index][Left + 1:Left + Right + 1]item['xklj'] = textindex = index + 1result.append(item)item = {}bar = 0return result
其中正则表达式匹配所有网页列表中的信息,每 14 项是一个课程的全部信息,具体信息对应哪些,可以看列表的表头,我用字典来保存这些课程的信息,然后存到一个列表里,每个信息的拼音简写就是字典中对应的键的名称,然后又有一个 xklj
用来保存选课时需要通过 get
访问的链接,这样实现选课就非常简单了,只需要对这个链接发送 get
请求即可:
def ChoseCourseByLink(link):url = 'http://jwxt.wust.edu.cn' + linkans = foo.get(url, headers = headers)ans.raise_for_status()ans.encoding = ans.apparent_encodingreturn ans.text
然后用同样的办法构造学分制选课的列表:
def GetCoursesList2():url = r'http://jwxt.wust.edu.cn/whkjdx/xkglAction.do?method=toFindxskxkclb&xnxq01id=2017-2018-2&zzdxklbname=6&type=1&jx02kczid=null'ans = foo.get(url, headers = headers)ans.raise_for_status()ans.encoding = ans.apparent_encodingCoursesList = re.findall(r'<td height="23" style="text-overflow:ellipsis; white-space:nowrap; overflow:hidden;" width="\d+" title=".*"', ans.text)XKLJList = re.findall("javascript:vJsMod\(\'.*\'", ans.text)keyname = ['kcmc', 'kkdw', 'zyfx', 'xf', 'yxrs', 'yl', 'skjs', 'skzc', 'sksj', 'skdd', 'kcsx', 'kcxz', 'fzm', 'xbyq']result = []item = {}bar = 0index = 0for i in CoursesList:Left = i.find(r'title="')Right = i[Left + 7:].find(r'"')text = i[Left + 7:Left + Right + 7]#print(i)#print(text)item[keyname[bar]] = textbar = bar + 1if (bar == 14):Left = XKLJList[index].find("'")Right = XKLJList[index][Left + 1:].find("'")text = XKLJList[index][Left + 1:Left + Right + 1]item['xklj'] = textindex = index + 1result.append(item)item = {}bar = 0return result
这样一个简单的抢课库就实现了,抢课的时候只需要调用相关的接口就行了,最终全部代码在我的 Github 上:https://github.com/Rugel/wustjwxt
转载于:https://www.cnblogs.com/Uwgl/p/8468923.html
用 Python 实现武科大教务处自动抢课相关推荐
- python抢课_用 Python 实现武科大教务处自动抢课
首先分析网页,找到教务处登录的验证码 然后用 Python 直接把验证码下载到本地(整个程序通过 requests 库实现): def GetRandCode(): url = r'http://jw ...
- python实现南大教务处通知更新进行自动推送
这是一个简易的南京大学教务处公告更新自动推送系统,其基于python+mysql,通过邮件来进行推送, 还有很多功能待完善,目前代码写得还很烂>_<,希望广大朋友提出宝贵意见. #codi ...
- 周杰伦演唱会门票还能这样抢?看过来!我用Python实现了大麦网自动抢票功能
相信想去周董演唱会的大家都用过大麦网抢票吧? 可是-抢不到啊!!! 该说不说 我抢到了 那么,今天带大家用Python来制作一个自动抢票的脚本小程序! 知识点: 面向对象编程 selenium 操作浏 ...
- python实现复旦大学选课系统自动抢课神器抢课软件Courcegoblin抢课软件ver 1.0
朋友最近遇上选课困难,手速慢,总是抢不到心仪的课程,我目前正好找不到爬虫项目练手,于是写了个面向复旦选课系统的抢课小软件帮助朋友抢课 首先需要这些模块: import requests import ...
- Python selenium 实现大麦网自动抢票,简单的实现全购票过程
前言 大麦网是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域 今天,我们要用代码来实现他的购票过程 先来看看完成后的效果是怎么样的 开发环境 版 本:anaconda( ...
- 亲测可用,利用Python实现自动抢课脚本
借助pyautogui库,我们可以轻松地控制鼠标.键盘以及进行图像识别,实现自动抢课的功能 1.准备工作 我们在仓库里提供了2个必须的文件,包括: auto_get_lesson_pic_recogn ...
- python抢课程序_自学Python3个月,写出自动抢课小程序,分享我的学习经验!
很多没有编程基础的同学入门Python没有方法,今天我们就来看看一位小哥自学Python后总结的学习经验,希望对你有所帮助. 我刚学python3个月不到,分享一下我的学习经验. 半年前从某大牛同学那 ...
- 一文带你读懂Python的5大特点与8大应用方向!
关注头条号,私信回复资料会有意外惊喜呦------最后一张照片有资料. 2017年互联网领域薪资增幅最高的Top15职位中,新兴技术岗位普遍排在前列.而Python 作为当下人工智能.数据分析等领域的 ...
- python是什么语言开发的-少儿编程有什么好处?儿童编程课程学习Python的4大原因...
儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...
- python做数据和大数据区别_不懂Python,不懂大数据的人,和咸鱼有什么区别?
原标题:不懂Python,不懂大数据的人,和咸鱼有什么区别? 在这个处处充斥着大数据影响的时代之下,不懂Python,不懂大数据,你就可能轻易地错过身边的黄金. 我们生活在数据密布的环境中,就像< ...
最新文章
- 浪潮服务器开始虚拟化,(浪潮服务器-虚拟化解决方案.ppt
- 发布Web应用程序时发生的“xx.aspx.cs文件不存在”错误
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)——无非是在传统遍历过程中修改叶子结点加入后继结点信息(传统是stack记录),然后再删除恢复...
- svg大小自适应_网格自适应的 2 种方法——实现更高效的计算
- 针对移动互联网应用的网络建设和优化
- 按照鬼哥学so变化,四,第一章的例子
- nodejs pm2的简单应用
- springBoot构建Restful webService接口(医院)
- 联想p720装系统_教你装系统第六节(装系统需要注意那些?)
- STM32 电容触摸屏I2C转USB实现
- win10系统如何删除不用的输入法
- IE浏览器卸载命令行
- Catching Cheaters (LCS变形)
- Docker应用(一)Elasticsearch
- 近期技术讨论贴(持续更新:12-10)
- Python实现线性回归和梯度下降算法
- CSS 重构:样式表性能调优
- 《应用程序性能测试的艺术(第2版)》目录—导读
- 员工积分制管理系统V1.0 介绍
- 于明:尝鲜Fusion APU新品
热门文章
- excel 复制到mysql_excel导入数据到mysql
- python爬取ajax_Python爬虫如-何爬取ajax网页之爬取雪球网文章
- 使用.NET Core和Vue搭建WebSocket聊天室
- 职业资格计算机操作员,职业资格 计算机操作员
- 博科 HP H3C 华为FCSAN交换机配置业务zone以及联级配置
- 中国(2009-2017)全国各省结婚率和离婚率数据可视化
- 探讨广东技术师范大学Windows下MentoHUST上网认证
- 程序人生 | 文艺程序员使用代码发展诗歌
- gatk过滤_「简化基因组」如何过滤用GATK分析得到的SNP
- 二行代码解决全部网页木马(含iframe/script木马)