Android抓取正方系统课程——实现自己的课程表
上一篇博客讲解了如何使用http协议模拟登陆正方系统,今天继续实现如何抓取课程表并显示在Android界面上,效果如图:
由于偷懒,在界面上没下太多功夫,看得过去就行了哈哈哈。
在我们第一次点击 专业推荐课表查询 的时候,浏览器干了这么件事。
Request URL:http://210.38.162.117/(4nqfqf55wv4suyi0aewkdgiy)/tjkbcx.aspx?xh=131110142&xm=%D0%A4%C9%D9%D0%C7&gnmkdm=N121601
Request Method:GET
Host:210.38.162.117
Referer:http://210.38.162.117/(4nqfqf55wv4suyi0aewkdgiy)/xs_main.aspx?xh=131110142
它向服务器发起了一次get,请求的路径是
http://210.38.162.117/(4nqfqf55wv4suyi0aewkdgiy)/tjkbcx.aspx?xh=131110142&xm=%D0%A4%C9%D9%D0%C7&gnmkdm=N121601
其实和查成绩的路径很类似,
xh是学号,xm是Url编码过的你的名字,gnmkdm在查询课表的时候为N121601。
/**
* 专业课表查询的url
*/
String queryTimeTableUrl = "http://210.38.162.117/(sxaiuuqeeivmbu555ha1bd55)/tjkbcx.aspx?xh={xh}&xm={name}&gnmkdm=N121605";
String REFERER="http://210.38.162.117/(sxaiuuqeeivmbu555ha1bd55)/xs_main.aspx?xh=131110142";
String HOST="210.38.162.117";
/**
* 第一次查询的时候只需访问链接
*/
public void queryTimeTableFirstTime() throws UnsupportedEncodingException {
queryTimeTableUrl = queryTimeTableUrl.replace("{xh}", account).replace("{name}", URLEncoder.encode(name, "gb2312"));
final Request request = new Request.Builder()
.url(queryTimeTableUrl)
//必须带上登陆成功是返回的链接和Host
.addHeader("Referer", REFERER)
.addHeader("Host", HOST)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
showToast("课表查询失败");
}
@Override
public void onResponse(Response response) throws IOException {
if (response.isSuccessful()) {
BufferedReader br = new BufferedReader(new InputStreamReader(response.body().byteStream(), "gb2312"));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
parseTimeTableHtml(sb.toString());
}
}
});
}
之后要做的是就是解析html页面了,我简单抽取了部分html代码,如下:
这一部分保存了功课表的内容
<table id="Table6" class="blacktab" rules="all" border="1" height="132" width="100%">
<tr>
<td colspan="2" rowspan="1" width="2%">时间</td>
<td align="Center" width="14%">星期一</td>
<td align="Center" width="14%">星期二</td>
<td align="Center" width="14%">星期三</td>
<td align="Center" width="14%">星期四</td>
<td align="Center" width="14%">星期五</td>
<td align="Center" width="14%">星期六</td>
<td align="Center" width="14%">星期日</td>
</tr>
<tr>
<td colspan="2">早晨</td>
<td align="Center"> </td>
<td align="Center"> </td>
<td align="Center"> </td>
<td align="Center"> </td>
<td align="Center"> </td>
<td align="Center"> </td>
<td align="Center"> </td>
</tr>
<tr>
<td rowspan="4" width="1%">上午</td>
<td width="1%">第1节</td>
<td align="Center" rowspan="2" width="7%">计算机组成原理<br>2节/周(1-17)<br>张凤英<br>田师208<br></td>
<td align="Center" rowspan="2" width="7%">汇编语言程序设计<br>2节/周(1-17)<br>陈生庆<br>田师211<br></td>
<td align="Center" width="7%"> </td>
<td align="Center" rowspan="2" width="7%">教育学<br>2节/周(1-16)<br>刘奕涛<br>田师208<br></td>
<td align="Center" rowspan="2" width="7%">汇编语言程序设计<br>2节/双周(1-17)<br>陈生庆<br>锡科407<br><br><br>软件工程<br>2节/单周(1-17)<br>陈世基<br>锡科405<br></td>
<td align="Center" width="7%"> </td>
<td align="Center" width="7%"> </td>
</tr>
<tr>
<td>第2节</td>
<td align="Center"> </td>
<td align="Center"> </td>
<td align="Center"> </td>
</tr>
<tr>
<td>第3节</td>
<td align="Center" rowspan="2">汇编语言程序设计<br>2节/单周(1-17)<br>陈生庆<br>田师211<br></td>
<td align="Center" rowspan="2">数据库系统原理<br>2节/单周(1-17)<br>张海峰<br>田师201<br></td>
<td align="Center" rowspan="2">计算机组成原理<br>2节/周(1-17)<br>张凤英<br>田师208<br></td>
<td align="Center" rowspan="2">软件工程<br>2节/单周(1-17)<br>陈世基<br>锡科505<br></td>
<td align="Center" rowspan="2">网络基础<br>2节/双周(1-17)<br>吴华光<br>锡科407<br></td>
<td align="Center"> </td>
<td align="Center"> </td>
</tr>
<tr>
<td>第4节</td>
<td align="Center"> </td>
<td align="Center"> </td>
</tr>
<tr>
<td rowspan="4" width="1%">下午</td>
<td>第5节</td>
<td align="Center" rowspan="2">数据库系统原理<br>2节/双周(1-17)<br>张海峰<br>锡科405<br></td>
<td align="Center"> </td>
<td align