前导篇: 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