结对作业2
作业要求 | https://edu.cnblogs.com/campus/fzzcxy/2018SE1/homework/11250 |
---|---|
作业目标 | <通过网址和cookie爬取网页信息,进行经验值计算> |
作业源代码 | https://gitee.com/chen-lilong/score |
陈冠华 | <211806368> |
陈利龙 | <211806370> |
结对感受
陈冠华:是一个代码能手,在编程的过程中出了很大的力。
陈利龙:是一个态度认真的伙伴,帮助我寻找资料和指出我的不足的代码。
结对照片
因为我国庆回家了所以没办法拍照,这是我回来后与队友拍的。
所耗费的时间
需求分析 | <30分钟> |
编程实践 | <4小时> |
代码行数 | <163行> |
分析思路
获取url和cookie,然后爬取成员和class。然后做成员数组和
第一步通过网址和cookie实现登录
第二步通过cookie来爬取网页数据
第三步获取班级人数和clas的数量
Document doc = Jsoup.connect(pro.getProperty("url")).header("Cookie", pro.getProperty("cookie")).get();
String stuNumber = doc.getElementById("menu").select("a").get(1).select("span").get(1).text();
int stuNum = stuNumber.length() - 1;
// 取得班级人数
int total = Integer.parseInt(stuNumber.substring(1, stuNum));
Elements activities = doc.getElementsByClass("interaction-row");
int classNum = activities.size();
// 获取class的数量
第四步将爬取到的课堂完成作业赋值数组,爬取学生的数据放入学生数组中。然后将经验值进行累加再放入学生数组中。最后输出在一个txt中。
int i = 0;
int ave = 0;
Student[] students = new Student[total];
for (int count1 = 0; count1 < classNum; count1++) {
String rows = activities.get(count1).select("span").text();
if (rows.indexOf("课堂完成") != -1) {
String attr = activities.get(count1).attr("data-url");
Document docSmall = Jsoup.connect(attr).header("Cookie", pro.getProperty("cookie")).get();
Elements mbMgNum = docSmall.getElementsByClass("homework-item");
// 给建立的对象数组赋值爬取的数据
if (i == 0) {
for (int count2 = 0; count2 < total; count2++) {
String name = mbMgNum.get(count2).select("span").get(0).text();
String id = mbMgNum.get(count2).select("div").get(4).text();
students[count2] = new Student(name, id, 0);
}
i = 1;
}
第五步获取课堂完成部分的题目并判断是否完成,是就对经验值进行累加。并放入学生的成绩数组中。
Elements stuSort = docSmall.getElementsByClass("homework-item");
int stuSortSize = stuSort.size();
for (int count3 = 0; count3 < stuSortSize; count3++) {
String stuSortText = stuSort.get(count3).select("span").text();
if (stuSortText.indexOf("未提交") != -1 || stuSortText.indexOf("尚无评分") != -1) {
} else {
Elements stuScore = docSmall.getElementsByClass("appraised-box cl ");
String scoreStyle = stuScore.get(count3).select("span").get(1).text();
int score = isNum(scoreStyle);
ave += score;
String name = stuSort.get(count3).select("span").get(0).text();
for (int p = 0; p < total; p++) {
if (name.equals(students[p].getName())) {
students[p].setScore(score + students[p].getScore());
}
}
}
// 分数统计 判断分数类型并计算
}
}
isNum(scoreStyle)是用来判断爬取出来的经验值是不是数字
public static int isNum(String str) {
String str1 = "";
for (int count5 = 0; count5 < str.length(); count5++) {
char ch = str.charAt(count5);
if (ch >= 48 && ch <= 57)
str1 += ch;
}
// 判断是否为数字
第五步将所有人的经验值按降序排列输出并且输出最高份最低分和平均分。
Arrays.sort(students);
// 降序排序
for (int count4 = 0; count4 < total; count4++)
System.out.println(students[count4]);
// 输出对象数组
File txt = new File("src/score.txt");
PrintWriter out = new PrintWriter(new FileWriter(txt));
out.print("最高经验值:" + students[0].getScore() + " " + "最低经验值:" + students[total - 1].getScore() + " " + "平均经验值:"
+ ave / total + "\r\n");
for (Student stu : students)
out.print(stu.toString() + "\r\n");
out.close();
// 输出文件
小结
这次作业又进一步的学习了爬取数据。并且知道怎么怎么用cookie进行模拟登录和获取cookie。并且加深了我们之间的配合。