湖南工业大学教务系统爬虫(课表获取篇)

前言

之前写了模拟登陆的过程,因为爬课表需要先登录,所以没看过之前那篇博客的先回去看一下怎么通过模拟登陆获取cookie,下面是我用这些写的一个小程序和安卓应用
湖南工业大学教务系统爬虫(课表获取篇)_第1张图片湖南工业大学教务系统爬虫(课表获取篇)_第2张图片

分析

因为新版教务系统前端所使用的方式已经非常老了,他所有的页面都是采用jsp写的,这种写法的特点就是他会在后台就将页面渲染好再往前端发,所以没有json接口,我们要提取课表的话只能通过在源代码中提取

准备

我们此次获取数据需要用到的java类是:HttpURLConnection,解析html采用的是:Jsoup,第一个是jdk自带的类,第二个是一个第三方jar包

开始

课表页面地址:http://218.75.197.123:83/jsxsd/xskb/xskb_list.do ,湖南工业大学教务系统爬虫(课表获取篇)_第3张图片
我们右键检查发现这是一个表格布局,我们找到其中一项拿出来分析一下湖南工业大学教务系统爬虫(课表获取篇)_第4张图片
我们发现第一节课的所有信息都在这里面了,我们要的就是这里面的信息,要将这几行代码变成我们能过使用的json也很简单,我们首先用Jsoup将整份代码变成dom对象,然后我们通过两层循环,分别循环课表的行和列,然后每一个格子里面都是上面图片中格式的内容,先将这部分的html单独提取出来,用Element的html()这个方法,然后我们使用
来将这部分代码分割,不难发现不带的就是课程名字部分,带的我们可以根据title中的内容区分这是什么部分,好了现在基本可以解析出这整张课表了

代码
		//通过模拟登陆获取到的cookie
		String cookie = stu.getSession() ;
		//定义请求的参数 , 这个类是我自己对HttpURLConnection进行封装的,这套代码是模仿xutils进行封装的,有兴趣的同学可以找我要代码
		RequestParams request = new RequestParams("http://218.75.197.123:83/jsxsd/xskb/xskb_list.do", "POST") ;
		request.setData("xnxq01id="+year);
		request.addHead("cookie", cookie);
		
		//保存最后整理的结果
		final JSONObject resultJson = new JSONObject() ;
		//这也是我对HttpURLConnection这个类进行封装的
		Http.run(request , new NetFunction() {
			
			@Override
			public void success(ResponseParams restult) {
				//result是请求结果,里面有响应码,数据,响应头,服务器返回的新cookie
				Document html = Jsoup.parse(restult.getData()) ;
				
				JSONObject kb = new JSONObject() ;
				JSONArray classesJson = new JSONArray() ;
				kb.put("timeTable", JSONObject.parseObject(timeTable)) ;
				kb.put("kb", classesJson) ;
				resultJson.put("data" , kb) ;
				
				//按课次遍历课表
				Elements rows = html.getElementById("kbtable").getElementsByTag("tr") ;
				for(int i=1 ; i") ;
						for(String s : dataArray){
							if(s.contains("", "") ;
								classJson.put("teacherName", teacher) ;
							}else if(s.contains("", "") ;
								classJson.put("classZc", zc) ;
							}else if(s.contains("", "") ;
								classJson.put("classroom", classroom) ;
							}else if(s.contains("--------")){
								if(classJson.size() != 1){
									classJson.put("classtime", i) ;
									classJson.put("day", j+1) ;
									classesJson.add(classJson) ;
								}
								classJson = new JSONObject() ;
							}else{
								if(classJson.getString("className") == null){
									classJson.put("className", s.replaceAll("<.*?>", "")) ;
								}else{
									classJson.put("className", classJson.getString("className")+s.replaceAll("<.*?>", "")) ;
								}
							}
						}
						if(classJson.size() != 1){
							classJson.put("classtime", i) ;
							classJson.put("day", j+1) ;
							classesJson.add(classJson) ;
						}
					}
				}
			}
			
			@Override
			public void faild() {
				resultJson.put("code", "500") ;
				resultJson.put("msg", "获取数据失败") ;
				resultJson.put("data", "") ;
			}
			
			@Override
			public void error(Exception e) {
				resultJson.put("code", "500") ;
				resultJson.put("msg", "服务器异常") ;
				resultJson.put("data", "") ;
			}
		});

以上就是整个课表整理的过程,代码由于用到了一部分自己封装的东西,我后续会把整个爬教务系统的代码上传到我的github上去,目前还在写,又需要的也可以直接加我qq:1730145232

你可能感兴趣的:(湖南工业大学网站)