java模拟登录校内成绩查询网站,将获得的HTML代码用jsoup解析

java模拟登录学校教务系统,通过学号查询自己的成绩,将返回的html代码用jsoup解析,即可得到所需要的信息。

首先,我们要知道学校的成绩查询的IP地址或者网址,也就是处理你提交的代码的地址(后台,或许是PHP页面,也可能是JSP页面,说不定是ASP页面),这个我们可以通过浏览器自带的开发人员工具查看表单提交到的地址,或者直接查看网页的源代码获取表单的提交地址,当然,不要忘了把form表单里面的地址和当前所在的地址做连接。

(浏览器的开发者工具恕不赘述)

通过开发者工具,发现form表单的提交方法为post,请求处理的页面 和 Form Data如下:


 


 

&连接符后面的是sublime按钮,这个不用管它。

这个Form Data的格式很容易构造,直接String就可以。

下面是获取服务器返回网页源码的java源代码,也就是一个模拟登录的代码。

 

 

 JavaCode 

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的源代码

 

 

 JavaCode 

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));

 

//通过上面的过程,我们就获得了该学生的课程总数

 

//因为返回的页面很有规律,都是一些TRTD的表格,看一看有用信息所在的位置,直接将参数写死,不用改变。

 

 

  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");

   

  }

 

 }

 

 

效果如下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值