学校的教务系统是正方的,在大学期间无论是选课、报名还是查成绩,几乎都要和它打交道,上学期在积累了一定的爬虫和web知识后,我就想着用Python模拟登陆教务系统,实现在命令行里方便地进行成绩或课表的查询。

首先先来看看登陆的过程。

首先是向default.aspx POST过去了一些字段,其中txtUserName是我的学号,TextBox2是密码,RadioButtonList1是学生选项,还有个txtSecretCode是验证码。

此外,还出现了__EVENTVALIDATION和__VIEWSTATE这两个相对陌生的东西,百度了一下:

__EVENTVALIDATION:

__EVENTVALIDATION只是用来验证事件是否从合法的页面发送,只是一个数字签名,所以一般很短。

“id”属性为“__EVENTVALIDATION”的隐藏字段是ASP.NET 2.0的新增的安全措施。该功能可以阻止由潜在的恶意用户从浏览器端发送的未经授权的请求.

为了确保每个回发和回调事件来自于所期望的用户界面元素,ASP.NET运行库将在事件中添加额外的验证层。服务器端通过检验表单提交请求的内容,将其与“id”属性为“__EVENTVALIDATION”隐藏字段中的信息进行匹配。根据匹配结果来验证未在浏览器端添加额外的输入字段(有可能为用户在浏览器端恶意添加的字段),并且该值是在服务器已知的列表中选择的。ASP.NET运行库将在生成期间创建事件验证字段,而这是最不可能获取该信息的时刻。像视图状态一样,事件验证字段包含散列值以防止发生浏览器端篡改。

说明:“id”属性为“__EVENTVALIDATION”隐藏字段一般在表单的最下方,如果表单在浏览器端尚未解析完毕时,用户提交数据有可能导致验证失败。

__VIEWSTATEViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。 ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。 当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值

了解了这么多后,我们知道这两个字段肯定是不可缺少的,那么它们可以从哪获取到呢?

我们右键查看网页的源代码,在源代码中发现了两个type为hidden的输入框,它们的值正是我们所需要的。

在此,我们可以先构造一个payload字段:

payload={'__VIEWSTATE':'','txtUserName':'','TextBox2':'','txtSecretCode':'','RadioButtonList1':'','Button1':'','lbLanguage':'','hidPdrs':'','hidsc':'','__EVENTVALIDATION':'',

}

对于__EVENTVALIDATION和__VIEWSTATE值的获取我用了BeautifulSoup这个库。

soup=BeautifulSoup(index.content,'lxml')

value1=soup.find('input',id='__VIEWSTATE')['value']

value2=soup.find('input',id='__EVENTVALIDATION')['value']

登录时还要输入图形验证码,这种验证码大部分都倾斜和粘连,用简单的OCR估计处理不了,所以我就把验证码下载到了本地然后显示出来手动输入,此处用到了PIL库。

我使用requests库处理get和post请求,第一行使用requests.Session()会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。这样我们就不用额外操心cookie的变更与存储了。

s=requests.Session()

index=s.get(url,headers=headers)

img=s.get(checkcode,stream=True,headers=headers)

with open('checkcode.gif','wb') as f:

f.write(img.content)

image=Image.open('checkcode.gif')

image.show()

最后把各字段该输入的输入,该赋值的赋值,整合到payload字典里就行啦

payload['txtUserName']=raw_input("UserName:")

payload['TextBox2']=raw_input("Password:")

payload['txtSecretCode']=raw_input("checkcode:")#下面的value1和value2都不需要转码,直接post过去即可。在此浪费了好长时间

payload['__VIEWSTATE']=value1

payload['__EVENTVALIDATION']=value2

payload['RadioButtonList1']= '%D1%A7%C9%FA'post1=s.post(url,data=payload,headers=headers)

POST过去后我们发现http状态码返回的是302,302代表的意思是 Move temporarily

这样的重定向是临时的,我们还要继续向原有地址发送以后的请求。

我们直接找到成绩查询的url:http://xk2.edu.cn/xscjcx.aspx?xh=xxxxxx&xm=xxx&gnmkdm=N121605

此URL中xh是学号,xm是经过URL编码的学生姓名。

后面我们要做的和前面所讲的差不多,首先要通过GET方法获取页面源代码,从中取得__EVENTVALIDATION和__VIEWSTATE的值,然后再次POST过去。

data={'btn_zcj':'%C0%FA%C4%EA%B3%C9%BC%A8',#学年成绩:btn_xn 历年成绩:btn_zcj

'ddlXN':'','ddlXQ':'','__EVENTVALIDATION': '','__EVENTTARGET':'','__EVENTARGUMENT' :'','__VIEWSTATE':'','hidLanguage':'','ddl_kcxz':'',

}#注意!先获取框架源代码,提取__EVENTARGUMENT和__VIEWSTATE值后作为post内容进行下一步

get_source=s.get('http://xk2.edu.cn/xscjcx.aspx?xh=xxxxxx&xm=xxx&gnmkdm=N121605',headers=headers).content

soup=BeautifulSoup(get_source,'lxml')

value3=soup.find('input',id='__VIEWSTATE')['value']

value4=soup.find('input',id='__EVENTVALIDATION')['value']

data['__VIEWSTATE']=value3

data['__EVENTVALIDATION']=value4

get_score=s.post('http://xk2.edu.cn/xscjcx.aspx?xh=xxxxxx&xm=xxx&gnmkdm=N121605',data=data,headers=headers)print (get_score.content)

最后通过解析get_score.content中的源代码就可以获得历年成绩数据了。

python输入学号返回成绩_Python模拟登陆正方教务系统并抓取成绩单相关推荐

  1. 用java模拟登录正方教务系统,抓取课表和个人成绩等数据

    之前学了一些java web的编程,理解了web应用的原理后,就突然想到,可以用java模拟登录吉珠的教务系统,然后爬取里面的课表.成绩.个人信息等等数据,然后就可以写成一个简易的课表APP. 一.第 ...

  2. php模拟登陆,php实现模拟登陆正方教务系统

    本文主要介绍通过php的curl库实现正方教务系统的登陆,由于正方教务系统每年可能会有一些更新,因此本文是针对2018年而言,所介绍一些模拟登陆正方的方法,希望能帮助到大家. 1.保存登陆界面的验证码 ...

  3. php模拟登陆正方教务系统(2018年)

    php模拟登陆正方教务系统(2018年) 本文主要介绍通过php的curl库实现正方教务系统的登陆,由于正方教务系统每年可能会有一些更新,因此本文是针对2018年而言,所介绍一些模拟登陆正方的方法. ...

  4. Java--使用httpClient模拟登陆正方教务系统获取课表

    最近形如课程格子与超表课程表应用如雨后春笋般涌现,他们自动获取课程表是怎么实现的呢.于是我用Java实现了一下模拟登陆正方教务系统获取课表的过程. 首先,我们先了解一下网站登录的原理:当我们输入学号, ...

  5. python输入学号查成绩_Python实践学习笔记:模拟登录教务系统实现微信查成绩

    python+selenium+itchat模拟登录学校教务系统,获取个人成绩,通过微信发送. 先看看最终效果: 〇.背景 学习python一段时间,觊觎学校的教务系统很久了. 寒假开始,大部分同学陆 ...

  6. java模拟登录新版正方_java 模拟登陆正方教务系统

    比较懒,主要说一下思路.. 1.首先正方教务系统的验证码当你不去向服务器申请的时候,可以直接无视它不需要去输入验证码.可以通过浏览器屏蔽学校教务系统的图片就可以直接输入账号密码回车进去.. 2.通过抓 ...

  7. 正方教务系统连接服务器失败,模拟登陆正方教务系统,重定向一直解决不了〉...

    回复讨论(解决方案) 在线等,拜托各位 返回 这个网站没有使用 cookie 传递 sessionid 而是通过 url 传递的 所以你把这个写死是不行的: http://jwxt.nbut.cn / ...

  8. php模拟登陆青果教务系统,模拟登录 - php CURL模拟登陆正方教务系统

    代码如下 $cookie_file = tempnam('./temp','cookie'); $login_url = 'http://211.64.47.129/default_ysdx.aspx ...

  9. java实现模拟登陆正方教务系统

    java实现模拟登陆学校教务管理系统 全部代码总览 此版本无注释,请赏脸移步本人GitHub:https://github.com/1243418950/Jwgl import java.io.Buf ...

最新文章

  1. JAVA按钮设置组合快捷键
  2. 西藏监狱首次奏响《婚礼进行曲》
  3. python命名空间更改_在Python中使用ElementTree改变命名空间前缀
  4. MySQL 数据库常用命令—where like union 排序 分组 连接
  5. 计算机课玩手机检讨500,玩手机检讨书500字
  6. Chrome 隐藏 SSL 证书信息 禁止禁用 DRM
  7. 主要矛盾和次要矛盾_次要GC,主要GC与完整GC
  8. zbbix服务器搭建_zabbix服务器的搭建
  9. exchange边缘服务器的安装条件和介绍
  10. 拖拽上传及读取文件实现
  11. 【渝粤教育】电大中专电商运营实操 (7)作业 题库
  12. 修改Android序列号(Serial Number)
  13. 74HC595芯片级联的测试万能代码
  14. PS第三课--套索和魔棒工具
  15. C++计算两平面之间的夹角
  16. Android 仿微博客户端 ViewPaper
  17. 业务性管理(business continuity management)
  18. mbp touchbar设置_新款 MBP 配备 Touch Bar 如何关机?
  19. MAC OS无法开机问题解决
  20. 三维vr全景摄影展示满足产品720立体浏览

热门文章

  1. Linux configure 参数解释,程序的这装,卸载
  2. TCP之深入浅出send和recv
  3. ACE的接受器(Acceptor)和连接器(Connector):连接建立模式
  4. COM与.NET调用DCOM组件
  5. Kinect学习(四):提取深度数据
  6. MySQL python update 语句
  7. linux命令怎么打开优盘,Linux下U盘使用具体步骤
  8. 洛谷 1072 Hankson 的趣味题——质因数界限讨论
  9. 日常shell使用小结
  10. maven+springmvc+dubbo+zookeeper