Python登录大连交通大学教务在线实现成绩查询
来源:互联网 发布:ug4.0编程刀路下载 编辑:程序博客网 时间:2024/04/27 18:37
本文章为小川先生原创,转载可以,请标明出处。
每次听说出成绩了, 然后就急急忙忙上教务, 点开网站, 输入帐号, 密码, 验证码, 然后还要点好多次才能看到成绩. 然而作为一个懒癌晚期患者, 这是没有办法忍受的. 那好吧, 自己写个工具好了.
Idea 1. POST登录教务, 然后查成绩
python3.4
先登录好吧. 我这里使用的是Chrome浏览器和自带的调试工具, 按F12就可呼出.
上教务咯.(jw.djtu.edu.cn)
按F12, 然后点Network, 然后输入帐号密码验证码, 然后点登录. 好的, 然后你就会看到下面的Network窗口一直冒出数据. 滚轮滑到最上边. 这里看到有一个POST请求.
点进去.
这个URL提示我们了, 这是一个security_check, 应该就是向服务器提交我们的帐号密码, 把窗口往下拖.
不小心看到浏览器偷偷提交的数据了, 哈
第一个参数groupId, 我也不知道干啥的, 可能跟教务的权限控制有关? 哎呀, 不小心泄漏太多- –
第二个参数j_username, 用户名, 不解释
第三个参数login, 应该是说明行为的, 不管, 照抄
第四个参数j_password, 密码, 明文!!!
第五个参数j_captcha, 咋一看, 这一堆数字啥玩意儿啊, 唉, 怎么好像是我刚才输入的验证码.
既然参数都搞懂了, 那就用postman(Chrome 插件)试试吧, 哈哈
填入URL, 这个就是刚才抓包时显示的Request URL.
User-Agent也在刚才抓的那个包里, 在Request Headers里. 很多网站用UA判断网络请求是人发起的, 还是机器发起的. 比如python默认的UA就是python 3.4/ , 还有就是一些客户端识别, 以前很常见的那种软件, 用它发微博就显示来自iPhone, 也是这个原理, 就是发微博的时候, 使用iPhone默认的UA.
选择第二个,x-www-from-urlencoded. 这是默认的表单提交方式.
如图所示, 填入必要参数, 对了, 验证码的话….直接看浏览器里教务的图片吧, 然后填在这里
点Send.
唉嘛, 这是咋回事, 参数应该都是对的啊~~~, 好吧, 要不试试interceptor, 兴许跟cookies有关.
装好后, 在postman的右上角开启它, 再点Send, 唉, 怎么就好使了.
其实是interceptor使用了chrome浏览器的 Cookie, 所以提交就好使了.
为啥带上cookie就好使了呢, 这邪门.
其实是这样的, 你的浏览器加载验证码的时候, 服务器会给你一个JESSIONID, 用于作为用户的临时识别代码, 所以他能判断你获取到了哪张验证码, 所以才能判断验证码是否正确.
盗取别人的cookie的话, 差不多相当于盗取了他用户的临时使用权, 这就是为啥你点了一些奇怪的链接之后, 你的qq或者其它的帐号就被盗了. (恶意网页代码扒你的保存在电脑上的cookie, 然后用他去提交数据)
好了, 瞎BB了那么多, 该上主题了.
当然, 咱这个方法还是要输入验证码的, 所以先自动获取验证码的图片, 然后人眼识别, 然后输入验证码. 登录成功.
先获取验证码:
开F12调试, 多点几次验证码, 就能看出规律了.
http://jw.djtu.edu.cn/academic/getCaptcha.do?0.06245193560607731
后面的一堆数字其实就是随机数.
Python有个random模块.
里面有个random.random()方法
返回一个[0,1)的小数
>>>random.random()0.6363492206638173>>>random.random()0.8982103132246348>>>random.random()0.20045321977485753>>>random.random()0.18511221787593868
python3获取验证码, 并写到本地目录的jwpost.jpg文件, 而且返回cookie值:
def getCheckcode(cookie=None):url = 'http://jw.djtu.edu.cn/academic/getCaptcha.do?' + str(random.random())res = superxc.xcUrlopen(url, ck=cookie)with open('jwpost.jpg', 'wb') as f:f.write(res.read())if cookie==None:ck = res.info()['Set-Cookie']ck = ck[0:ck.find(';')]return ck
superxc是我自己的一个库, 里面的xcUrlopen:
def xcUrlopen(url, data=None, ck=None):req = urllib.request.Request(url, data)req.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36')if ck!=None:req.add_header('Cookie', ck)res = urllib.request.urlopen(req)return res
urllib.request.Request()创建一个Request对象, data必须是已经编码过的.
req.add_header()添加协议头UA
xcUrlopen返回一个Request对象, 可以像文件对象, 使用read()之类的方法
Python实现教务在线登录:
def xcLogin(cookie):url = 'http://jw.djtu.edu.cn/academic/j_acegi_security_check'while True:while True:sys.stdout.write('Code:')sys.stdout.flush()os.system('eog jwpost.jpg')checkcode = input()if checkcode=='-1':getCheckcode(cookie)else:breakdta = {}dta['groupId'] = ''dta['j_username'] = '1418140323'dta['login'] = '登录'dta['j_password'] = 'yourPassword'dta['j_captcha'] = checkcodedta = urllib.parse.urlencode(dta).encode('utf-8')res = superxc.xcUrlopen(url, dta, cookie)s = res.read().decode('gbk')if s.find('验证码不正确')!=-1:print('Error checkcode')getCheckcode(cookie)elif s.find('密码不匹配')!=-1:print('Wrong password')exit()elif s.find('不支持框架')!=-1:print('Login success.')breakelse:print('Unknow erro.')exit()
os.system() 是执行命令. eog jwpost.jpg 就是调用ubuntu默认的图片查看器打开验证码图片.
为什么上面用sys.stdout.write()呢, 因为直接用input(“Code:”)的话, 验证码弹出的时候, 命令行界面是不显示’Code:’的, 要等验证码图片被关闭后才能显示, 不友善, 所以改成这sys.stdout.write()
被要求输入验证码时, 可以输入-1, 表示验证码太模糊, 请求再来一张.
表单数据必须编码后才能提交, 表单数据是不是看着像dict, 没错, 就是它.
urllib.parse.urlencode(dta) 把dict编码成可提交数据,
楼上.encode(‘utf-8’) 服务器交换数据默认使用utf-8编码
好了, 现在你应该会使用python登录教务在线了, 查询成绩嘛, 再来一个GET就好了.
Idea 2. 超级课程表成绩查询
手机打开超级课程表, 然后点成绩查询.
然后右上角, 使用Safari打开, 然后复制URL到电脑上, 用浏览器打开.
URL差不多是这样的
http://112.124.54.19/Score/score.html?schoolIdentity=7937305C7B2C414514D8431493656089&identity=***bu gei kan***
identity好像是个人身份识别码
scholIdentity是学校识别码, 如果你跟我一样, 那么咱应该是校友, 握手- –
Idea 3. 大交助手成绩查询
微信关注大交助手, 绑定后, 它会给你分配一个openid, 用作用户身份识别.
你点成绩查询, 照样在Safari打开.
URL是类似这样的
http://djzs.vipsinaapp.com/chengji.php?openid=**bu gei kan**
如果openid不写的话, 好像直接返回大交助手作者的成绩信息- –
喂, 喂, 这网址咋一看, 像SAE的, 一个post直接查成绩, 不用帐号密码验证码. 当然了, 帐号是否安全, 不好说. 哈哈
再次膜拜这位大神.
作者水平有限, 大家一起学习.哈哈
更多关于Python爬虫教程, 自行doodle.
最后的最后, 展示下我写的成绩查询, 基于Idea 2, 超级课程表.
再次声明, 海燕是个坑货- –
本文章为小川先生原创,转载可以,请标明出处。
- Python登录大连交通大学教务在线实现成绩查询
- Python模拟登陆大连交通大学教务在线
- python爬虫实战之模拟正方教务系统登录查询成绩
- python爬虫实战之模拟正方教务系统登录查询成绩
- python爬虫获取郑大教务在线成绩数据
- python爬虫登录正方教务管理系统获取成绩数据
- python爬虫——正方教务系统成绩查询
- python爬虫获取强智科技教务系统学科成绩(模拟登录+成绩获取)
- 大连交通大学IPTV使用方法
- 用phpcurl实现模拟登录带验证码urp教务系统获取成绩
- (微信开发)PHP curl模拟登陆教务系统查询成绩查询课表实现微信查成绩差课表功能
- Android客户端利用OKhttp3,Jsoup简洁详细实现登录教务官网,并获取成绩,课程表,培养计划等
- 江西理工大学正方教务系统查成绩(模拟登录)
- java爬虫之登录到教务系统抓取成绩
- JSP+Servlet+JavaBean+JDBC实现用户登录,及成绩查询
- 利用python爬取教务系统中成绩
- python 爬虫实战--登陆学校教务系统获取成绩信息
- Python —爬取教务管理系统,个人成绩
- 深刻理解Python中的元类(metaclass)
- hadoop2.6.3学习第二节:安装和配置
- iOS开发之Xcode6之后不再自动创建Pch预编译文件
- C语言编译执行过程详解
- python[二]:Eclipse安装下载python插件
- Python登录大连交通大学教务在线实现成绩查询
- disconf-注解式分布式配置
- iOS block简单使用
- 使用两个栈实现一个队列
- 杭电hdu 5147 Sequence II (树状数组)
- disconf-基于xml分布式配置管理mysql
- echarts 饼状图 折线图 圆柱图
- Unity学习笔记(5) --- Unity的界面排版:AutoLayout详解——关于高度height的计算
- Mybatis对应jdbcType类型