第二次结对编程

作业要求 <第二次结对作业:班级成绩表>
作业目标 <爬取云班课上的数据>
作业源代码 [pair]https://gitee.com/ender29/pair
罗童 <211803324>
许培腾 <211804229>
预计 实际
需求分析 5min
学习时间 5-8h 6-7h
编码时间 1-2h 2h
代码量 100-200 203
运行时间 1.5min

1. 结对的感受

罗童(me):本来打算这次我把比较难的登录部分做了,把提取经验部分让他完成,但因为我没用准确获取到每个课堂完成部分的页面(只获取到第一个)所以他接着做时遇到了许多问题,我把这个问题解决后把后面的都做完了,他相信我能完成。

许培腾:我感觉这次作业难度还好,有比较明显的思路,就是实际操作起来还是会因为一些知识点的不清楚或者遗忘,卡壳,导致编写过程比较久。

2. 需求分析

  1. 在线获取网页
  2. 全班同学课堂完成部分的经验
  3. 按要求对经验排序,并统计出相应的数据

3. 思路

​ 通过htmlunit库解析出xml对象,再通过jsoup解析。htmlunit是无界面浏览器,操作和使用浏览器的逻辑很像,也可以通过选择器进行DOM操作比如登录,获取输入框HtmlForm form = (HtmlForm) page.getByXPath("//form[@class='account-from']").get(0);通过getByXPath()方法获取表单类型的HtmlForm表单对象,通过getInputByName() 分别方法获取HtmlTextInput文本输入框和HtmlPasswordInput密码输入框对象。setValueAttribute()设置你的账户密码。通过选择器获取HtmlButton按钮对象,再通过调用click()方法进入的页面。

还是通过类似点击的方式进入一个又一个页面。

解析使用的还是Jsoup,原因是这个库的官方文档只支持英文,功能方法很多,很难有效找到想要的方法,其他有的教程提到的功能也很少。

分类几个模块,一个模块是返回到活动页面的html对象
还一个模块就是累加经验值,返回Set集合学生对象的类型。

4. 难点

在获取某个课堂完成部分全班经验值后,没有找到返回之前活动页面,也就是上一个页面的相关方法,会导致一直重复爬取该页面,于是又重新获取了活动页面,
这样就能够获取新的课堂完成部分全班经验值页面。但是有个缺点就是加载时间会很长,相当于每次都是重新加载然后渲染js和配置一些服务。
* 没有解决的一个问题:在获取经验值时,有些同学的经验值获取不到,测试:单纯获取了
这个部分的颜色,只要参加了就是绿色,没参加就是灰色。发现某些原网页抓取该部分是绿色,
但是htmlunit转换成xml解析出来是灰色样式。因为默认设置的score是0,所以这部分同学经验是0。有少部分这种情况。

4. 效果

  因为那个问题不知道怎么解决,统计出来会有误差。

结果如下(部分):

参考文献

5.优化

  感觉运行时间太长了,优化了返回活动页面的代码,不再使用重新请求的方式。通过重新点击的方式返回到活动页面。
优化 之前 现在
运行速度 1.5min 40s
原文地址:https://www.cnblogs.com/ender29/p/13756794.html