181006 安卓-爬取数据

准备用课程表作为练手的项目~
在搞最棘手的界面之前,先实现自动爬取教务系统的代码吧

数据爬取最简单的就是直接通过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建立链接后,用它的InputStreamjsoup.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进行解析即可,很方便就能得到各个节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值