python登录教务系统_记python登陆学校教务系统踩过的坑

最近开发关于学校服务类小程序,小程序后台需要从学校的系统获取到各同学的信息,所以语言优先选择了python,并用了Django框架。之前也有写过一些爬虫,但都是用其他语言写的。对python并不熟悉,所以这次开发踩了不少坑,也走了不少弯路。在这里总结一下,分享给同样有需要的人。

学校的登陆流程是这样的:

f7f8b8aa86c31b6335e2f92764fc9462.png

登陆流程图

正确登陆流程应该是上图的那样的,但是如果登陆错误是不会获取到302页的,而是直接返回登陆页,python获取到的状态码也是200。

在这里我就犯了一个很严重的错误,我一直以为我post登陆是正确的,从而把bug定位到【python获取不到302验证页】这个问题上,一开始先百度,得出的答案是在requests.post请求中添加allow_redirects=False来禁止网页重定向,我发现还是没有获取到302页,从而转向更底层的httplib和自定义自己的urlib的重定向类。发现还是不行,困扰了我一天,终于在我祭出fiddler之后,bug慢慢显现出来。

fd第一步:抓包

通过fd分别抓取浏览器和pycharm Post请求包

23aa2732b177616fe1896e78ffdabea4.png

fd抓包

fd第二步:对比

c2a083675721a1cab970e9e883ea7713.png

pycharm_post表单

3797ef3d23e8bb291c1f132728be9563.png

firefox_post表单

对比pycharm和浏览器向教务系统服务器发出的请求包内容发现,

username,password,imgcode以及cookies两边都是一样的

而user_lb这个字段两边不一样pycharm请求的是中文浏览器则是乱码

难道就是因为这个字段编码问题导致服务器验证失败?

接下来分析一下pycharm的编码

在python3中默认是Unicode编码,我们在使用requests发送post请求的时候,python会默认使用utf-8编码data表单数据,而学校的表单却是以gbk编码提交,是真的很奇葩,目前来说只有非常古老的网站才采用gbk编码了。

下面我们来改一下代码

postdata = {

'imgcode': input(),

'password':input(),

'user_lb':'学生',----> 'user_lb':'学生'.encode('gbk'),

'username':input(),

}

提示:在Python3中,decode是把二进制字符串解码成Unicode码,encode则是把Unicode码转换成对应的二进制字符串

修改完以后再一次验证

3c4999338ce2aad6d71c03eeff91208e.png

pycharm_post登陆

就此困扰了我两天的问题终于成功解决,拿到了sessid,之后通过设置相应的cookies便可以对学生信息页进行相应的操作了。

贴个登陆时序图方便理解吧

031f9a71feb1c70da83ca534065e0950.png

login时序图

总结:我最后只用了【.encode('gbk')】就解决了问题,所以说请求的时候,编码很重要,编码错误很可能导致服务端拿不到正确的请求内容,从而爬虫也接收不到正确的响应内容。

fa721083f6c339df15f4d45255a816d8.png

本文原创

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值