这个作业属于哪个课程 | <软件工程实践-2023学年-W班> |
---|---|
这个作业要求在哪里 | <软件工程实践寒假作业> |
这个作业的目标 | <学习爬取数据> |
其他参考文献 | CSDN |
目录
1 PSP表格
2代码设计
3抓包分析
4.程序编写
5.测试
6.性能优化
7.心得体会
代码地址 helloyzl30 / Project-java · GitCode
1 PSP表格
PSP Stage | Activity | Estimated Time (minutes) | Actual Time (minutes) |
---|---|---|---|
Planning | 计划 | 60 | 50 |
• Estimate | 估计时间 | 60 | 50 |
Development | 开发 | 600 | 300 |
Analysis | 需求分析 (包括学习新技术) | 600 | 400 |
Design Spec | 生成设计文档 | 60 | 40 |
Design Review | 设计复审 | 50 | 80 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 40 |
Design | 具体设计 | 100 | 150 |
Coding | 具体编码 | 600 | 540 |
Code Review | 代码复审 | 100 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 100 | 300 |
Reporting | 报告 | 60 | 120 |
Test Repor | 测试报告 | 60 | 40 |
Size Measurement | 计算工作量 | 10 | 40 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 30 |
Total | - | 2560 | 2240 |
2代码设计
刚开始拿到题目以后我先对题目进行了分析 分析里面所需要用的技术 首先要对网站内容进行爬取 会设计到爬虫技术 然后需要对数据进行解析 要设计到json技术 同时也要对文件进行 写入 也用到了文件类相关的一些知识
代码中会有一个主类 代码总体设计模式是这样的 :
首先通过ARGS去接受用户传递的两个参数,一个参数是输入文件的名字,一个参数是输出文件的名字 拿到这两个参数 首先创建一个FILE对象里面的参数是输入文件的名字 获取到FIle对象以后开始对File对象进行解析 然后创建一个集合 将解析出来的数据放入集合中 然后将集合开始遍历
当集合中对象的值 是我们所需要的值类似于players , result women 1m springboard这样的字符串时候 我在集合中加了if语句 如果是这些字符串将会 执行if语句中的代码 先对对应的网站进行访问 访问下来的数据通过fastjson进行 解析 然后写到文件中 如果集合中的对象字符串不能识别的话 我将会返回ERROR的字符串写到 output.txt中
3抓包分析
这是对比赛成绩进行抓包的截图
这是对比赛选手进行抓包的截图
4.程序编写
下方是对运动员数据进行采集的代码
String web = “https://api.worldaquatics.com/fina/athletes?gender=&discipline=&nationality=&name=&page=1&pageSize=50”;
String getdata = getdata(web);
JSONObject jsonObject = JSON.parseObject(getdata);
JSONArray sports = jsonObject.getJSONArray(“content”);
for (Object sport : sports) {
JSONObject jsonObjectSp = JSON.parseObject(String.valueOf(sport));
String fullName = jsonObjectSp.getString(“fullName”);
fileWriter.write(“fullName:”+fullName);
fileWriter.write(“\n”);
String gender = jsonObjectSp.getString(“gender”);
if (gender.equals(“M”)){
gender=“Male”;
}else {
gender=“Female”;
}
fileWriter.write(“gender:”+gender);
fileWriter.write(“\n”);
String nationality = jsonObjectSp.getString(“nationality”);
fileWriter.write(“country:”+nationality);
fileWriter.write(“\n”);
fileWriter.write(“-----”);
fileWriter.write(“\n”);
fileWriter.write(“…”);
fileWriter.write(“\n”);
fileWriter.write(“-----”);
fileWriter.write(“\n”);
首先我们通过url去访问带有运动员数据的接口接口会返还给我们一组json数据,我们通过fastjson对json数据进行 解析 解析以后结果我写入到txt中
这是对 women 1m springboard数据进行爬取以及解析的代码
String web = “https://api.worldaquatics.com/fina/events/09649153-aa3f-46eb-9c39-1ac7498b8eaa”;
String getdata = getdata(web);
System.out.println(getdata);
JSONObject jsonObject = JSON.parseObject(getdata);
JSONArray sports = jsonObject.getJSONArray(“Heats”);
Object Obeject = sports.get(0);
JSONObject jsonObject1M = JSON.parseObject(Obeject.toString());
JSONArray results = jsonObject1M.getJSONArray(“Results”);
for (Object result : results) {
JSONObject jsonObject1 = JSON.parseObject(String.valueOf(result));
String rank = jsonObject1.getString(“HeatRank”);
String fullName = jsonObject1.getString(“FullName”);
JSONArray dives = jsonObject1.getJSONArray(“Dives”);
String totalPoints = jsonObject1.getString(“TotalPoints”);
String Score1;
String Score2;
String Score3;
String Score4;
String Score5;
int i=1;
fileWriter.write( "Full Name:"+fullName);
fileWriter.write("\n");
fileWriter.write( "Rank:"+rank);
fileWriter.write("\n");
fileWriter.write( "Score:");
for (Object dive : dives) {
i++;
JSONObject jsonObjectDive = JSON.parseObject(dive.toString());
String divePoints = jsonObjectDive.getString("DivePoints");
if (i==6){
fileWriter.write(divePoints);
}else {
fileWriter.write(divePoints+"+");
}
System.out.println(divePoints);
}
fileWriter.write( "="+totalPoints);
fileWriter.write("\n");
fileWriter.write("-----");
fileWriter.write("\n");
fileWriter.write("...");
fileWriter.write("\n");
fileWriter.write("-----");
fileWriter.write("\n");
这块代码大致实现思路与运动员相同 但是这个代码的独到之处是里面设计到了双重FOR循环 以及是运动员场次小分是需要再进入一层循环才可以 取到的 对于此我直接设置了循环次数 因为当最后一次分数写入的时候是不能写+需要换成=的 所以我设置当i=6的时候 我遍将=换成了+这次无疑是简便了 代码的逻辑
5.测试
首先我们将程序打成jar包 然后设置后input.txt 然后在cmd窗口进行执行 java -jar springboot-0.0.1-SNAPSHOT.jar input.txt output.txt 命令运行结果如下
输入截图
输出截图
我们可以看到程序符合我们预期
6.性能优化
在本次程序设计中我最开始采用的json解析框架Gson,但是经过我使用以后我认为其的解析速率不高,然后我换了fastjson来对json数据解析,在使用fastjson对数据进行以后我程序的运行速率提升了一个很快的速度,同时还有一个性能优化的点是我之前的程序设计过于冗余 我会将一些常用的方法封装起来 会使代码的可读性提升了非常之多
7.心得体会
经过此次开发,我学习到了很多知识,例如网站的抓包知识,我之前做网站爬取的时候会直接将网页爬取下来再进行解析那样会增加了特别多的工作量,但是经过此次开发以后我发现抓包无疑会让效率提升特别多,因为从网站抓包得来的数据直接就通过fastjson解析以后我就可以直接用来使用了,还有就是程序开发之前一定要先想好此次的开发设计以及流程,但我这次开发是 一遍进行开发一遍进行设计的 为此踩了很多的坑 也浪费了很多时间 下次我要再进行开发的话 我首先会将这个程序设计 设计好 相关技术查阅好以后再进行开发