文档章节

Java实现模拟登录正方教务抓取成绩、课表、空教室信息

二环南路上的狂奔
 二环南路上的狂奔
发布于 2016/04/06 11:34
字数 1638
阅读 385
收藏 5

 实现原理分析:

我们抓取数据,就是用代码去模拟浏览器登录,及点击链接的一步步操作,把返回的HTML数据进行解析,得到我们想要的内容,即一个简单的网络爬虫。只要熟悉http协议,熟悉web项目的开发过程。我们可以借助工具如IE插件HttpWatch、浏览器自带的开发者工具抓包分析请求过程,通过HttpClient来模拟浏览器请求,Jsoup解析网页内容,这里还要注意Cookie和Referer的使用。

HttpClient的使用过程:

1.创建GET或POST请求。

2.为请求设置头信息,设置要提交的参数。

3.创建浏览器client对象,并执行。

关于Jsoup:

可以解析文本网页内容的工具类,类似于js的选择器,可以通过id、正则表达式、选择器等来获取文本内容。

关于验证码:

  在大约2016.3.25之前正方教务是有个验证码的Bug的,后台没有验证码为空字符串的校验,所以轻松搞定。后来又去测试发现代码不行了,分析了一下返回的内容,竟然有了非空校验,另外,有篇文章所写的http://jwgl.XXX.edu.cn/default2.aspx把default2改成default6是不带验证码的入口,现在也已经不行了。那也无所谓,只要把验证码提前下载好,让用户手动输入就可以了,课程格子,超级课程表都是这么干的。

另外:当我们用浏览器登录,浏览器遇到验证码的img标签的src会去自动请求这个地址,产生验证码。而验证码的值一般是放在Session里,默认有效期是30min,但如果用Httpclient去请求他是不会解析这个地址的,所以只去请求主页,此时验证码为空,这也就是最开始为什么不用输入验证码的原因。即便需要验证码,我们也可以先下载验证码,让用户输入,或者orc识别。

关于Cookie和Referer:

其实这里的cookie并不是我们通常自己设置的cookie,而是sessionIDsessionID用来判断是同一次会话session是保存在服务器端的,它有一个生命期,客户端的cookie只是保存了id信息,关闭浏览器时,服务器端的session只要还在同一个生命期内还是同一次会话。请求登录页面如果不带着这个Cookie也就是sessionID是不行的,如果不从主页开始抓包分析,忽略了这点,会直接郁闷到死啊,坑!另外这个Cookie要和验证码保持一致,也就是如果你用浏览器去请求验证码,再手动输入到代码的参数,是不行的。因为浏览器去请求就会产生对应的Cookie和验证码,如果再用httpclient去请求主页获取Cookie,再去请求登录页面,虽然此时验证码并没有刷新。但两个Cookie是不一致的。关于Referer,Referer表示从哪个地址来的,一开始的时候我设置请求头信息,没有加Referer结果不行,后来加上就可以了。说明他后台有验证,这里注意加上就好了。

关于要提交的信息:

提交的信息有 头信息和表单信息,对于头信息,我们只需要提交Cookie和Referer就可以了。表单信息要全部提交。

大体实现过程是:

1.通过抓包分析获取每一个功能所对应的网址,及form表单提交数据,再带上头信息Cookie和Referer。2.创建GET或POST请求,给请求设置参数和头信息,创建client,执行client。3.把返回的内容解析按照相应的编码格式解析成字符串。4.用Jsoup解析返回的网页节点,获取想要的信息。

这里用的是纯JavaSe代码,可以移植到Web端或Android端,先附一张结果图:

以下以济南大学教务管理系统为例分析请求过程:

登录功能过程分析:

第一次请求主页:

第一次请求验证码页:

【如果先去请求主页,我们要带着Cookie去请求验证码页面。如果直接去请求验证码页面,它同时也产生了Cookie,所以我们第一步应该是:直接请求验证码页面,获取Cookie和验证码。】接下来:

请求登录页面http://jwgl2.ujn.edu.cn/default2.aspx:

【请求登录页面要带着Cookie和表单提交的数据也就是图中的FormData,返回的状态码是302,也就是发生了重定向,重定向到了http://jwgl2.ujn.edu.cn/xs_main.aspx?xh=学号,注意这里的参数有一个是_VIEWSTATE,其实每个表单都有一个_VIEWSTATE参数,由于鄙人不熟悉asp.net,也不清楚他是干嘛用的,但可以肯定的是,这个参数在一段时间后会变化,所以我们要先来获取这个参数,代码都在最后。】

至此,登录功能完成。

查询个人成绩过程分析:

点击信息查询--成绩查询抓包分析:

【地址栏没有变化,而抓包地址是http://jwgl2.ujn.edu.cn/xxjsjy.aspx?xh=学号&xm=姓名&gnmkdm=xxxxx,说明这是一个请求转发,Request头信息包含第一次获取的Cookie,填上相应的Referer,所以只需要设置头信息Cookie和Referer以及表单提交的信息去post请求http://jwgl2.ujn.edu.cn/xxjsjy.aspx?xh=学号&xm=姓名&gnmkdm=xxxxx就可以了。】

【然后我们可以把返回的流转化为字符串,通过Jsoup解析每一个td标签。得到我们想要的内容。】

至此,查询个人成绩功能完成。那么,查询空教室,个人课表等跟这个过程一样。

教务管理系统也是在不断更新的,不保证下面的代码以后还可以用,刚开始做我也被网上的代码误导过,但弄清楚了原理仔细分析一下就好了。

实现代码,见http://www.oschina.net/code/snippet_2688363_55215#81604

 

 

 

 

© 著作权归作者所有

二环南路上的狂奔
粉丝 3
博文 8
码字总数 8244
作品 0
济南
程序员
私信 提问
大学《数据库系统》课程设计报告

湖南科技大学计算机科学与工程学院 《数据库系统》 课 程 设 计 题 目: 教学管理系统 专 业:计算机科学与技术 年 级: 2017级 班 级: 计科三班 学 号: 170510323 姓 名: 雨 萱 完成时间:...

mzc_love
01/03
0
0
模拟登录正方教务系统

用java 编写查看课程表的程序,求指导

立足点感CK
2015/07/27
571
1
Jsoup模拟登录带验证码的教务系统(原理详解)

一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求。 我们通过Chrome浏览器进行...

巅峰小学生
2018/02/09
0
0
andriod想模拟登陆学校教务系统,可程序没反应

最近没事,想用做个andriod应用,登陆学校教务系统,然后查找课程成绩,可刚刚在网上找代码时,自己改了下,可是没反应,我会点java,求解释,代码有问题吗?

星空lee
2013/10/19
451
5
北京求份java软件工程师工作

本人在智联、前程无忧。。想求职一份java软件工程师的工作!工资要求也不高。。税后4K转正5K就行。 投了这么多简历!居然一个电话都没。实在没办法只有在论坛里求职了。。。。 求带走(本人性...

xsm4Java
2013/04/10
1K
15

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
5
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
17
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部