准备用课程表作为练手的项目~
在搞最棘手的界面之前,先实现自动爬取教务系统的代码吧
数据爬取最简单的就是直接通过Http连接拿到html,然后通过正则拿到分组数据
不过搜索的时候发现Java下还有个jsoup更加方便:可以直接按照html的节点进行数据提取
最常用的的是jsoup.connect(url).cookies(cookies).data(data).post()
但是发现爬出来的总是有乱码,通过new String(s.getBytes("utf-8"), "gbk")
这样的方法转换编码也没有用,后来查了一下发现是服务器声明为gbk
,而html却标识为utf-8
的鬼问题
这样的问题对结果进行编码转换也无法解决,只能通过HttpUrlConnection
建立链接后,用它的InputStream
和jsoup.parse
来配合提取
下一个问题是登录的问题
Cookies
里放了一个JESESSIONID
,查了一下这个是将具体会话信息存放在服务器、通过SessionId来标识会话的方法
具体实现为服务器在申请链接时检查客户端请求中携带的SessionId是否与服务器拥有的某个Id相同,如果有则继续会话,没有或未携带则调用request.getSession()
新生成一个Id并在返回包中夹带Set-Cookie
的header交给客户端
然而安卓抓出来的返回header中总是没有Set-Cookie
,其他头都有,就是没有这个关键的Cookies信息,用BurpSuiteRepeat却发现Cookies正常返回
于是又对安卓端的请求进行抓包,发现返回包中确实有Cookies,但是cookies = connection.getHeaderFields().get("Set-Cookie").get(0).toString();
这句总是拿不到
最后终于搜到了解决办法,添加代码即可
connection.setInstanceFollowRedirects(false);
它的作用是设置不跟随重定向
于是得到登录的Cookies,即可通过查询的URL来获取课程啦
之后通过jsoup进行解析即可,很方便就能得到各个节点