文章目录
软件工程实践第二次作业——个人实战
这个作业属于哪个课程 | https://bbs.csdn.net/forums/FZU_university |
---|---|
这个作业要求在哪里 | <https://bbs.csdn.net/topics/619295152 |
这个作业的目标 | 爬取,文件操作,异常处理 ,单元测试 |
其他参考文献 | 《构建之法》https://blog.csdn.net/kobepaul123/article/details/128796839 |
1.Gitcode项目地址
https://devcloud.cn-north-4.huaweicloud.com/codehub/project/de7b03c40d0d4f408249dcfe7024be11/codehub/2692109/home?ref=master&filePath=222200424
2.psp表格
psp | Personal Software Process Stages | 预估耗时 | 实际耗时间 |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 1000 | 900 |
Development | 开发 | 700 | 800 |
• Analysis | • 需求分析 (包括学习新技术) | 70 | 70 |
• Design Spec | • 生成设计文档 | 20 | 20 |
• Design Review | • 设计复审 | 5 | 5 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
• Design | • 具体设计 | 50 | 50 |
• Coding | • 具体编码 | 300 | 400 |
• Code Review | • 代码复审 | 10 | 10 |
• Test | • 测试(自我测试,修改代码,提交修改) | 20 | 30 |
Reporting | 报告 | 50 | 50 |
• Test Report | • 测试报告 | 50 | 60 |
• Size Measurement | • 计算工作量 | 20 | 20 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 20 |
合计 | 2335 | 2465 |
3.解题思路描述
3.1获取信息
在最初的需求中,我需要从目标网页(https://olympics.com/zh/paris-2024/medals)上抓取每日奖牌数据。为了实现这一需求,我选择了使用 Selenium 驱动的 WebDriver 来加载网页,并利用 JSoup 来解析网页的内容。这种方式可以处理包含动态加载内容的网页,因为 WebDriver 可以模拟浏览器行为,加载完整页面和触发懒加载等。
3.2将获取到的信息保存在本地txt文件中。
3.3处理信息方便后续操作
获取的部分信息与实现需求无关,因此要对信息进行处理。
3.4编写接口
3.5单元测试
参考邹欣老师的博客
4.设计与实现过程
1.用户输入
正常的输入只需要调用不同的功能接口,而对于异常输入分为两种情况,一种是功能二的不规范日期异常,一种是用户乱输,对于不同的情况就需要做不同的处理。
2.爬取
因为网站数据随界面滚动而出现新内容,我通过模拟界面滚动来实现爬取。
3.功能实现
按要求实现所需功能
爬取
5.功能实现与关键代码展示
6.程序性能改进
刚开始爬取时,我直接使用 WebDriver.get(url) 访问页面,并获取页面源代码。然而,这种方法在处理动态内容时存在问题,因为页面中的奖牌数据是只有滚动页面时,新的奖牌数据才会显示出来。因此,仅仅抓取初始页面并不足以获得完整数据。
逐步改进:引入滚动模拟:为了解决懒加载问题,我添加了一个 JavaScript 代码来模拟页面滚动。通过使用 JavascriptExecutor.executeScript,每次滚动 200px,并在每次滚动后等待 1.5 秒,确保新内容能成功加载。这一步的改进解决了动态内容加载的问题,使得我能够获取更多数据。
页面滚动逻辑:通过引入滚动模拟,解决了懒加载问题,确保动态内容能成功加载。
数据去重:通过使用 Set 来存储数据,避免了重复抓取同一奖牌信息,进一步优化了性能。
7.单元测试改进
测试
覆盖率
8.异常处理
在文件读取和写入过程中,确保捕捉并处理异常,处理异常都是用try-catch捕获,而不抛给调用者。
BufferedReader br = null;
try {
//在try-catch中获取文件
br = new BufferedReader(new FileReader(“example.txt”));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
//异常捕获
System.err.println("Error reading file: " + e.getMessage());
}
9.心得体会
本次作业让我学习了网页数据爬取的相关操作,也让我对 Java 编程的基本语法和异常处理机制的使用等更加熟练。单元测试的内容是第一次接触,在以后的项目也会多加使用单元测试来多多测试自己写的项目。这次项目的开发经历极大地锻炼了我解决问题的能力,对我来说是一次宝贵的经验。