作业要求 | 目标要求 |
---|---|
作业目标 | 学会用cookie跳过登录信息模拟登陆网页并爬取数据 |
作业源代码 | 码云仓库 |
队员1 | 211806411 |
队员2 | 211806420 |
一、结对感受与工作照片
此第二次结对编程依然由我,来自计算机工程系软件工程的 王善泽 ,和我的结对同伴,同样来自计算机工程系软件工程的 余奇棚,使用 eclipse 共同完成。
结对的感受:第二次结对编程,比第一次熟悉了很多,减少了前期的磨合阶段,像是对于代码的规范问题和代码复审的讨论等。可以更加快的进入专注的状态,一个口述,一个敲代码,期间交换角色交替进行。能更快速响应代码出现的问题,还能减少bug的产生,能够写出更高的代码质量。
对对方的评价
我对奇棚的评价:优秀!
奇棚对我的评价:优秀!
二、需求分析时间,编码时间与代码行数、Commit记录
PSP各个阶段 | 预估时间(分钟) | 实际记录(分钟) |
---|---|---|
计划:明确需求和其他因素,估计以下的各个任务需要多少时间 | (填在计划阶段花费的时间) | (此项应该和预估值一致) |
开发(包括下面8项子任务) | (以下都填预估值) | (以下都填实际花费值) |
--需求分析(包括学习新技术、新工具的时间) | 180 | 480 |
--生成设计文档(整体框架的设计,各模块的接口,用时序图,快速原型等方法) | 60 | 120 |
--设计复审(和同事审核设计文档,或者自己复审) | 30 | 30 |
--代码规范(为目前的开发制定或选择合适的规范) | 30 | 30 |
--具体设计(用伪代码,流程图等方法来设计具体模块) | 30 | 30 |
--具体编码 | 300 | 600 |
--代码复审 | 180 | 300 |
报告 | ** | ** |
--测试报告(发现了多少bug,修复了多少) | 300 | 480 |
--计算工作量(多少行代码,多少次签入,多少测试用例,其他工作量) | 60 | 60 |
--事后总结,并提出改进计划(包括写文档、博客的时间) | 60 | 120 |
总共花费的时间(分钟) | 1230 | 2250 |
三、需求分析并实现的步骤
1、直接通过网络爬取云班课的数据
使用url抓取云班课的活动列表,测试打印title的结果应该是“云班课-活动列表”,结果输出“用户-登录”,说明用户需要登录,这时就要手动设置cookie或者模拟登陆方式,前者简单,所以选择前者。
2、根据老师发的教程一步步摸索,找到Microsoft Edge关于云班课cookie中的login_token,将cookie信息复制进去,测试结果为“云班课-活动列表”,表示成功。
//手动设置cookie
String cookie = a.getProperty("cookie");
String url = a.getProperty("url");
Connection connect = Jsoup.connect(url);
Document document = connect
.header("Cookie", cookie)
.get();
3、开始尝试爬取数据。爬取课堂完成的具体网址,将其装入数组。
//建立哈希表,并将爬取到的网址存入其中
Set<String> seth=new HashSet<>();
Elements b = document.getElementsByClass("interaction-row");
for(int i=0;i<b.size();i++) {
if(b.get(i).toString().contains("课堂完成部分")) {
String c=b.get(i).attr("data-url");
seth.add(c);
}
}
5、根据对应的网址爬取不同课堂完成的学号、姓名、经验值。
//抓取学号姓名成绩
for(String x:seth) {
String stUrl=x;
Document documents = Jsoup.connect(stUrl).header("Cookie", cookie).get();
Elements ele = documents.getElementsByClass("homework-item");
for(int i=0;i<ele.size();i++) {
String name = ele.get(i).select("span").get(0).text();
String id = ele.get(i).getElementsByClass("member-message").get(0).child(1).text();
int base =0;
boolean bl = ele.get(i).getElementsByClass("homework-info").text().contains("未提交");
if(!bl) {
String st = ele.get(i).getElementsByClass("appraised-type").get(1).select("span").get(1).text();
if(st.equals("尚无评分")) {
}
else {
String exp = st.substring(0,st.indexOf("分"));
float temp = Float.parseFloat(exp);
6、将经验值进行计算,降序进行排列。
7、输出到指定txt文本。
将输出方式设置为文本文件输出
四、参考资料
- Markdown 高级技巧|菜鸟教程
- jsoup教程
- 各个jsoup视频
- 将Java程序的输出结果写到txt文件中的方法
- 各个jsoup视频
- 及其他优秀同学的线下指导
五、题外话
·相比上次结对作业的原型设计来说,这次做的过程中真是极度的艰难,每次都心态崩溃的想放弃了如果是一个人的话。但是看到结对伙伴那么的认真且努力,至少,我不能扯后腿啊。硬是咬牙坚持了下来。如果放弃的话,那这次作业就只能是奇棚一个人全部完成了,我们是结对伙伴对对方都有了解,这次作业对我们两个都是挑战,而我们也都很努力了,其他的因素我们也都改变不了,我们只有一条路,向前走就可以了,哪怕是每天只努力一点。
·所以为什么别人能做出来啊???希望下次上去讲的小伙伴可以重点讲一下思路、怎么学习的、对于突发BUG有哪些解决方法。目前我和奇棚是先从要求里分析一下可能要用到的知识点并进行分析,然后尝试一下下代码,遇到问题的话主要的解决方法是从云班课找资源、博客园搜问题和B站看视频,也会去中国大学慕课网看看。但是依旧做不出来。有的时候是思路问题、有的是BUG解决不了。
·最后感谢一下那些支撑着我们活下去并学习的东西!
-
吃完就感觉什么都能坚持下去了!没啥困难的,接着努力就好了