首先分析网页,找到教务处登录的验证码

然后用 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 实现武科大教务处自动抢课相关推荐

  1. python抢课_用 Python 实现武科大教务处自动抢课

    首先分析网页,找到教务处登录的验证码 然后用 Python 直接把验证码下载到本地(整个程序通过 requests 库实现): def GetRandCode(): url = r'http://jw ...

  2. python实现南大教务处通知更新进行自动推送

    这是一个简易的南京大学教务处公告更新自动推送系统,其基于python+mysql,通过邮件来进行推送, 还有很多功能待完善,目前代码写得还很烂>_<,希望广大朋友提出宝贵意见. #codi ...

  3. 周杰伦演唱会门票还能这样抢?看过来!我用Python实现了大麦网自动抢票功能

    相信想去周董演唱会的大家都用过大麦网抢票吧? 可是-抢不到啊!!! 该说不说 我抢到了 那么,今天带大家用Python来制作一个自动抢票的脚本小程序! 知识点: 面向对象编程 selenium 操作浏 ...

  4. python实现复旦大学选课系统自动抢课神器抢课软件Courcegoblin抢课软件ver 1.0

    朋友最近遇上选课困难,手速慢,总是抢不到心仪的课程,我目前正好找不到爬虫项目练手,于是写了个面向复旦选课系统的抢课小软件帮助朋友抢课 首先需要这些模块: import requests import ...

  5. Python selenium 实现大麦网自动抢票,简单的实现全购票过程

    前言 大麦网是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域 今天,我们要用代码来实现他的购票过程 先来看看完成后的效果是怎么样的 开发环境 版 本:anaconda( ...

  6. 亲测可用,利用Python实现自动抢课脚本

    借助pyautogui库,我们可以轻松地控制鼠标.键盘以及进行图像识别,实现自动抢课的功能 1.准备工作 我们在仓库里提供了2个必须的文件,包括: auto_get_lesson_pic_recogn ...

  7. python抢课程序_自学Python3个月,写出自动抢课小程序,分享我的学习经验!

    很多没有编程基础的同学入门Python没有方法,今天我们就来看看一位小哥自学Python后总结的学习经验,希望对你有所帮助. 我刚学python3个月不到,分享一下我的学习经验. 半年前从某大牛同学那 ...

  8. 一文带你读懂Python的5大特点与8大应用方向!

    关注头条号,私信回复资料会有意外惊喜呦------最后一张照片有资料. 2017年互联网领域薪资增幅最高的Top15职位中,新兴技术岗位普遍排在前列.而Python 作为当下人工智能.数据分析等领域的 ...

  9. python是什么语言开发的-少儿编程有什么好处?儿童编程课程学习Python的4大原因...

    儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...

  10. python做数据和大数据区别_不懂Python,不懂大数据的人,和咸鱼有什么区别?

    原标题:不懂Python,不懂大数据的人,和咸鱼有什么区别? 在这个处处充斥着大数据影响的时代之下,不懂Python,不懂大数据,你就可能轻易地错过身边的黄金. 我们生活在数据密布的环境中,就像< ...

最新文章

  1. 浪潮服务器开始虚拟化,(浪潮服务器-虚拟化解决方案.ppt
  2. 发布Web应用程序时发生的“xx.aspx.cs文件不存在”错误
  3. Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)——无非是在传统遍历过程中修改叶子结点加入后继结点信息(传统是stack记录),然后再删除恢复...
  4. svg大小自适应_网格自适应的 2 种方法——实现更高效的计算
  5. 针对移动互联网应用的网络建设和优化
  6. 按照鬼哥学so变化,四,第一章的例子
  7. nodejs pm2的简单应用
  8. springBoot构建Restful webService接口(医院)
  9. 联想p720装系统_教你装系统第六节(装系统需要注意那些?)
  10. STM32 电容触摸屏I2C转USB实现
  11. win10系统如何删除不用的输入法
  12. IE浏览器卸载命令行
  13. Catching Cheaters (LCS变形)
  14. Docker应用(一)Elasticsearch
  15. 近期技术讨论贴(持续更新:12-10)
  16. Python实现线性回归和梯度下降算法
  17. CSS 重构:样式表性能调优
  18. 《应用程序性能测试的艺术(第2版)》目录—导读
  19. 员工积分制管理系统V1.0 介绍
  20. 于明:尝鲜Fusion APU新品

热门文章

  1. excel 复制到mysql_excel导入数据到mysql
  2. python爬取ajax_Python爬虫如-何爬取ajax网页之爬取雪球网文章
  3. 使用.NET Core和Vue搭建WebSocket聊天室
  4. 职业资格计算机操作员,职业资格 计算机操作员
  5. 博科 HP H3C 华为FCSAN交换机配置业务zone以及联级配置
  6. 中国(2009-2017)全国各省结婚率和离婚率数据可视化
  7. 探讨广东技术师范大学Windows下MentoHUST上网认证
  8. 程序人生 | 文艺程序员使用代码发展诗歌
  9. gatk过滤_「简化基因组」如何过滤用GATK分析得到的SNP
  10. 二行代码解决全部网页木马(含iframe/script木马)