第二次结对编程
作业要求 | <第二次结对作业:班级成绩表> |
---|---|
作业目标 | <爬取云班课上的数据> |
作业源代码 | [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. 效果
因为那个问题不知道怎么解决,统计出来会有误差。
结果如下(部分):
参考文献
- 参考CSDN模拟登录163.com
- https://blog.csdn.net/fjssharpsword/article/details/51480475
- Jsoup结合htmlunit
- https://blog.csdn.net/qq_34160679/article/details/80611375
- Htmlunit官网
- https://htmlunit.sourceforge.io/
5.优化
感觉运行时间太长了,优化了返回活动页面的代码,不再使用重新请求的方式。通过重新点击的方式返回到活动页面。
优化 | 之前 | 现在 |
---|---|---|
运行速度 | 1.5min | 40s |