第二次结对作业
作业要求 | https://edu.cnblogs.com/campus/fzzcxy/2018SE1/homework/11250 |
---|---|
作业目标 | 在线爬取云班课经验值 |
作业源代码 | https://gitee.com/hshzbc/pair |
队员1 | 211806387--黄世辉 |
队员2 | 211806424--张家豪 |
代码行数 | 130 |
---|---|
需求分析时间 | 1.5h |
编码时间+学习时间 | 10h |
分析需求的思路
1.Cookie的设置:
首先确定这次的爬虫需要登录才可获取信息,所以得进行Cookie的设置,模拟登录.由于采集频次不高、采集周期短,所以可以直接在爬虫程序中手动设置 HTTP 请求中的 Cookie 属性(就是先在网站上面登录,复制登陆后的 cookies).
Properties prop = new Properties();
prop.load(new FileInputStream("./resources/config.properties"));
// 用connect的方法携带cookies连接到云班课,在线解析
Document doc = Jsoup.connect(prop.getProperty("url")).header("Cookie", prop.getProperty("cookie")).get();
2.获取云班课中课堂完成部分的每个div,从中得到url:
通过网页源代码分析出每个活动是一个div,div的class名都是"interaction-row",里面的data-url存着活动页面的地址
Elements elements = doc.select("div[class=interaction-row]");
for (Element p : elements) {
if (p.text().contains("课堂完成部分")) {
String url = p.attr("data-url");
urlNum[un] = url;
un++;
}
}
3.成功进入url后,获取信息,存储信息
-
姓名所在
-
学号所在
-
经验值
-
创建一个对象数组存储数据
①. Student是一个POJO类,变量有name,id,scorem,包含一个全参构造方法和一个无参构造方法,重写ToString(),equals()方法,实现Comparable接口.
②.在循环中存信息进入Student数组中,根据find()函数返回的值判断该学生是否已存在数组中,存在则叠加经验值,不存在就加入数组中.
③.利用Arrays.sort()方法进行排序
④.io流实现输出txt文件
File txt = new File("score.txt");
PrintWriter out = new PrintWriter(new FileWriter(txt));
String first = "最高经验值为:" + stuList[0].getScore() + "," + "最低经验值为:" + stuList[stuNum - 1].getScore() + ","
+ "平均经验值为:" + aver / stuNum;
out.print(first + "\r\n");
for (Student stu : stuList)
out.print(stu.toString() + "\r\n");
out.close();
不会的知识的学习过程、记录修改优化的过程
在cookie的设置方面参照了老师提供的范文,用了最简单粗暴的手动设置方法,没有什么问题,存储数据方面一开始是想集合比较合适的,但缺漏确实是比较多,再加上先给自己放了两天假...导致进度有点赶,用了对象数组进行存储.有一个问题是排序的时候,如果数组原本设置过大,会导致后面的数据都是null,当调用排序方法时会出现空指针的错误:,解决方案是在最先获取到班级的成员数,把对象数组的大小设死.在最后的.txt格式输出结果时,明明也添加了转义换行符,输出还是一坨:
查阅相关资料后了解到
流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“/n”,(如果以"文本"方式打开一个文件,那么在读字符的时候,系统会把所有的"/r/n"序列转成"/n",在写入时把"/n"转成"/r/n" archim 's opinion )。二进制流是非解释性的,一次处理一个字符,并且不转换字符。
通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件(例如图形或字处理文档),或者读取鼠标输入,或者读写调制解调器。
如果用文本方式打开文件,会把“0D 0A”自动变换成“/n”来存在内存中。写入的时候反向处理。 而二进制方式打开的话,就不会有这个过程。