前导篇: Java登录方正教务系统
在Java登录方正教务系统中,已经知道了如何登录到方正教务系统,以及在于服务器交互的过程中,Cookie的作用,还有隐藏字段_VIEWSTATE的作用,还处理了乱码问题,现在我们登录以后获取对应的课程表
需要获取的数据
通过火狐自带的抓包工具可以看到,点击信息查询->学生课表以后,浏览器通过GET方式提交xh(学号),xm(姓名),gnmkdm(固定值)等三个数据给服务器,下面我们来分别获取这三个数据

- 获取xh(学号)
学号在前导篇里面属于登录时,用户输入的数据,所以这里不用获取,在登录时保存在成员变量中即可
- gnmkdm
对于获取课表来说,这个参数为N121603
- xm(姓名)
我们在浏览器里面可以很容易看到,页面的右上角有 欢迎您:XX同学 的提示文字,在前导篇里面,我们说了,返回码302代表着登录成功,302代表着服务器要求浏览器跳转到一个指定网址,也就是登录成功后看到的主页,所以我们可以在登录的时候,将服务器要求我们跳转的网址保存下来,访问这个网址,也就是主页,然后通过正则表达式或者String.find()方法,提取出姓名

我们在前导篇登录的函数中获取返回码以后,顺带获取这个字段
/**
* 登陆
*
* @throws IOException
*/
public void load() throws IOException {
//省略登录代码,在前导篇中有
getNameByUrl(conn.getHeaderField("Location"));
}
访问主页,获取姓名
/**
* 获取名字
* @param url
* @return
*/
public String getNameByUrl(String url) {
url = "http://218.197.80.27/" + url;
try {
URL Url = new URL(url);
HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(2000);
conn.setRequestProperty("Cookie", cookie);
BufferedReader read = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
StringBuffer sb = new StringBuffer();
String temp;
while ((temp = read.readLine()) != null) {
sb.append(temp);
}
Pattern pattern = Pattern.compile("xm=..");
Matcher matcher = pattern.matcher(sb.toString());
matcher.find();
this.name = sb.substring(matcher.start() + 3, matcher.end());
System.out.println(name);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
所有数据都获取完了,接下来就是获取课表信息了
/**
* 获取课表
*/
public void getKB() throws UnsupportedEncodingException {
System.out.println("读取课表");
String url = "http://218.197.80.10/xskbcx.aspx?xh=" + id + "&xm="
+ URLEncoder.encode(this.name, "GB2312") + "&gnmkdm=N121603";
System.out.println("获取课表的参数: " + url);
URL Url;
try {
Url = new URL(url);
HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(2000);
conn.setRequestProperty("Cookie", cookie);
conn.setRequestProperty("Referer",
"http://218.197.80.10/xs_main.aspx?xh=13150227");
conn.setInstanceFollowRedirects(false);
conn.setDoOutput(true);
BufferedReader read = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
StringBuffer sb = new StringBuffer();
String temp;
while ((temp = read.readLine()) != null) {
sb.append(temp);
}
//打印出含有课表的网页源码
System.out.println(sb);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
由于在控制台,输出只有一行,不便于查看,所以我复制到输出到记事本中,将后缀改名为.html,然后用浏览器打开,结果截图如下,接下来的就交给正则表达式搞定了,依次提取出需要的信息,这就是超级课程表一类软件的原理,模拟浏览器的行为,获取数据

666666