作业要求 | 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获取众多经验值活动,然后再利用关键字"课堂完成部分"筛选出课堂完成部分的活动
再利用正则表达式获取网址并存入已经创建好的数组
(在过程中我们发现获取到的网址和页面中的网址是不一样的,网页后台关于课堂完成部分网址完全没问题,可以从后台获取直接打开)
但是获取到的网址好像和网页后台的链接网址有着略微的不同,获取到的网址中用&代替了原先的&
不过没关系,既然获取的时候代替了一次,那获取之后就再代替一次,负负得正就很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