第二次结对作业:班级成绩表

作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/homework/11248
作业目标 由从本地网页爬取数据进阶成通过网络爬取云班课的数据
作业源代码 https://gitee.com/tudoukuaipao/pair
队员1 211806388 ——黄志辉
队员2 211806419 ——叶杰晖

结对的过程

这次的第二次结对是第一次结对的老搭档了,由于有了第一次的磨合,第二次的合作也显得相对熟练,我们在结对之旅中相互学习

(ps:咳咳,感觉我向志辉学习的比较多,他对问题的梳理方面还是很有一手的,得加把劲了)


结对历程

本次代码行数为245行,需求分析时间2小时,编码时间6小时


需求分析的思路

1.定义数据(建立Student.java文件)

  ![](https://img2020.cnblogs.com/blog/1528260/202009/1528260-20200930114430085-1620454554.png)

2.导入cookie

对于cookie还是第一次用到,对于这个陌生的操作,一开始还有点手无足措,但是打开云班课有老师发的资料

再加上通过网络搜索将cookie加以了解熟悉,于是。。下面的代码被敲出来了

        String path = Team.class.getResource("config.properties").getPath();
	Properties properties = new Properties();
	properties.load(new FileInputStream(path));
	Document document = Jsoup.connect(properties.getProperty("url"))
				.header("Cookie", properties.getProperty("cookie")).timeout(10000).get();

3.课堂完成部分的获取

首先呢,得找一下规律,观察下图


通过观察我们发现所有的活动都存在一个叫做"interaction-rows"的大盒子里

然后各个活动,则是分布在大盒子下叫做"interaction-row"的小盒子里

所以我们利用interaction-row获取众多经验值活动,然后再利用关键字"课堂完成部分"筛选出课堂完成部分的活动

再利用正则表达式获取网址并存入已经创建好的数组

(在过程中我们发现获取到的网址和页面中的网址是不一样的,网页后台关于课堂完成部分网址完全没问题,可以从后台获取直接打开)

但是获取到的网址好像和网页后台的链接网址有着略微的不同,获取到的网址中用&amp代替了原先的&

不过没关系,既然获取的时候代替了一次,那获取之后就再代替一次,负负得正就很nice

所以就产生了如下的代码

      String webPgFirst[] = new String[100];
		int num = 0;
		// 获取所有关于课堂完成部分的div 
		Elements divA = document.getElementsByClass("interaction-row");
		for (Element d : divA) {
			if (d.text().contains("课堂完成部分")) {
				String txt = d.toString();
				Pattern number = Pattern.compile("data-url="(\S+)"");
				Matcher matcher = number.matcher(txt);
				String x = "";
				if (matcher.find()) {
					x = matcher.group(1);
					webPgFirst[num] = x.replace("&", "&");		
				}
				num++;			
			}
		}

4.获取总成员数

      String idCount = document.getElementById("menu-content-box").select("a").get(1).select("span").get(1).text();
		int stuCount = 0;
		stuCount = Integer.parseInt(idCount.substring(1, idCount.length() - 1));
		stuList = new Student[stuCount];

5.通过for循环和正则表达式获取计算每个人的经验成绩

for (int i = 0; i < num; i++) {
			Document student = Jsoup.connect(webPgFirst[i]).header("Cookie", properties.getProperty("cookie"))
					.timeout(10000).maxBodySize(0).get();
			Elements stuExp = student.getElementsByClass("homework-item");
			for (Element p : stuExp) {
				// 经验值姓名id
				String txt = p.toString();
				String x = "";
				Pattern number1 = Pattern.compile("(\d+) 分</span>");
				Matcher matcher1 = number1.matcher(txt);

6.成绩获取完之后对成绩进行排序并保存成txt文件等操作

                Arrays.sort(stuList);
		File file = new File("libs/Score.txt");
		PrintWriter out = new PrintWriter(new FileWriter(file));
		String first = "最高经验值为:"+stuList[0].getExp()+","+"最低经验值为:"+stuList[allNum-1].getExp()+","+"平均经验值为:"+aver/allNum;
		out.print(first+"
");
		for(Student stu:stuList)
			out.print(stu.toString()+"
");
		out.close();
	}

学习过程

在此次作业中遇到的问题就是对于上学期所掌握知识的遗忘,有时候会突然摸不着脑袋,比如IO流,好在网络提供了许多平台供我们参考复习

将学到的知识用起来还有很长一段路要走

完成作业中用到的资料网站

Java-IO流———— https://blog.csdn.net/sinat_37064286/article/details/86537354

原文地址:https://www.cnblogs.com/211806419yejiehui/p/13752589.html