java模拟登录学校教务系统,通过学号查询自己的成绩,将返回的html代码用jsoup解析,即可得到所需要的信息。
首先,我们要知道学校的成绩查询的IP地址或者网址,也就是处理你提交的代码的地址(后台,或许是PHP页面,也可能是JSP页面,说不定是ASP页面),这个我们可以通过浏览器自带的开发人员工具查看表单提交到的地址,或者直接查看网页的源代码获取表单的提交地址,当然,不要忘了把form表单里面的地址和当前所在的地址做连接。
(浏览器的开发者工具恕不赘述)
通过开发者工具,发现form表单的提交方法为post,请求处理的页面 和 Form Data如下:
&连接符后面的是sublime按钮,这个不用管它。
这个 Form Data的格式很容易构造,直接String就可以。
下面是获取服务器返回网页源码的java源代码,也就是一个模拟登录的代码。
Java Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public static String tPost() throws
IOException {
Scanner scanner = new Scanner(System.in ); System.out.println("请输入正确的学号:" ); String xuehao = scanner.next(); scanner.close(); // 创建URL对象 String surl = "响应的地址"; // 查以前的成绩,不需要密码 URL connURL = new URL(surl); // 打开URL HttpURLConnection httpConn = (java.net.HttpURLConnection) connURL .openConnection(); httpConn.setDoInput(true); httpConn.setDoOutput(true); // 获取HttpURLConnection对象对应的输出流 PrintWriter out = null; out = new PrintWriter(httpConn.getOutputStream()); out.write("post_xuehao=" + xuehao); out.flush(); out.close(); // 获取服务器响应 String sCurrentLine = "" ; String sTotalString = "" ; BufferedReader l_reader = new BufferedReader(new InputStreamReader( httpConn.getInputStream(), "UTF-8" )); while ((sCurrentLine = l_reader.readLine()) != null) { sTotalString += sCurrentLine + "\r\n" ; } return
sTotalString;
} |
至此,我们已经得到了服务器返回的网页的源码,下面用jsoup解析这一坨源码。
jsoup是一个第三方jar包,可以下载后直接使用,下载请戳 这里 http://download.csdn.net/detail/huangyuan_xuan/7996797
下面是用jsoup解析HTML的源代码
Java Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
public static void main( String [] args) throws IOException { // 将抓到的字符串转化为doc,方便用jsoup解析 String html = tPost(); Document doc = Jsoup.parse(html); // 获取当前学生的课程总数,因为有重修的。重修的同学和没有重修的同学的课程总数有差异。 Element count = doc.getElementsByTag( "caption" ).get( 2 ); //这个课程总数的存在位置是通过查看网页源码得到的,其网页源码如下 //<caption> // <span class="style3">成绩信息</span> (共43项) // </caption> String caption = count.toString(); int BeginIdex = caption.indexOf( '(' ) + 2 ; int EndIdex = caption.indexOf( ')' ) - 1 ; int classCount = Integer .parseInt(caption.substring(BeginIdex, EndIdex)); //通过上面的过程,我们就获得了该学生的课程总数 //因为返回的页面很有规律,都是一些TR和TD的表格,看一看有用信息所在的位置,直接将参数写死,不用改变。 for ( int flag = 10 ; flag <= classCount + 9 ; flag++) { // 得到课程名称 Element tr = doc.getElementsByTag( "tr" ).get(flag); String coursetd = tr.getElementsByTag( "td" ).get( 5 ).toString(); int BIndex = coursetd.indexOf( ";" ) + 1 ; int EIndex = coursetd.lastIndexOf( "<" ); String className = coursetd.substring(BIndex, EIndex); // 得到该课程的学分 String credittd = tr.getElementsByTag( "td" ).get( 7 ).toString(); BIndex = credittd.indexOf( ";" ) + 1 ; EIndex = credittd.lastIndexOf( "<" ); String credit = credittd.substring(BIndex, EIndex); // 得到课程成绩 String scoretd = tr.getElementsByTag( "td" ).get( 9 ).toString(); BIndex = scoretd.indexOf( ";" ) + 1 ; EIndex = scoretd.lastIndexOf( "<" ); String courseScore = scoretd.substring(BIndex, EIndex); // 得到补考或者重修的成绩 String score_td = tr.getElementsByTag( "td" ).get( 10 ).toString(); BIndex = score_td.indexOf( ";" ) + 1 ; EIndex = score_td.lastIndexOf( "<" ); String course_Score = score_td.substring(BIndex, EIndex); // 输出信息 System.out.println(className); System.out.println( "学分" + "\t\t" + "原考成绩" + "\t\t" + "重修/补考成绩" ); System.out.print(credit + "\t\t" ); System.out.print(courseScore + "\t\t" ); System.out.println(course_Score + "\t\t" ); } } |
效果如下
特别感谢:LiuNing提供的解析HTML的方法,节省了我很多的时间,因为我已开始是想用 正则 来获取这些信息的。