zoukankan      html  css  js  c++  java
  • 第二次结对作业:班级成绩表

    作业要求 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

  • 相关阅读:
    洛谷P2219 [HAOI2007]修筑绿化带(单调队列)
    CF1059E Split the Tree(倍增)
    CF1059D Nature Reserve(二分)
    洛谷P4199 万径人踪灭(manacher+FFT)
    洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)
    洛谷P4867 Gty的二逼妹子序列(莫队+树状数组)
    CF932E Team Work(第二类斯特林数)
    JZOJ4307. 【NOIP2015模拟11.3晚】喝喝喝
    洛谷 P2519 [HAOI2011]problem a
    构建秘钥对验证的SSH体系
  • 原文地址:https://www.cnblogs.com/211806419yejiehui/p/13752589.html
Copyright © 2011-2022 走看看