Java爬取赛事网站
参与社区的问题回答
问题 | 回答 |
---|---|
这个作业属于哪个课程 | 软件工程-23年春季学期 |
这个作业要求在哪里 | 软件工程实践第二次作业—文件读取 |
这个作业的目标 | 完成对澳大利亚网球公开赛相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序 |
其他参考文献 | 无 |
Gitcode项目地址
点击这里前往查看源码
运行🛠️
Java -jar AOSearch.jar input.txt output.txt
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 90 |
• Estimate | • 估计这个任务需要多少时间 | 30 | 90 |
Development | 开发 | 570 | 630 |
• Analysis | • 需求分析 (包括学习新技术) | 120 | 60 |
• Design Spec | • 生成设计文档 | 60 | 60 |
• Design Review | • 设计复审 | 60 | 90 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
• Design | • 具体设计 | 60 | 90 |
• Coding | • 具体编码 | 180 | 180 |
• Code Review | • 代码复审 | 30 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 90 | 90 |
• Test Repor | • 测试报告 | 30 | 30 |
• Size Measurement | • 计算工作量 | 30 | 30 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 30 | 30 |
total | 合计 | 690 | 810 |
💡
解题思路描述
- 获取有关网站中 : players,results 的相关json 数据
实现: 开发者工具,监听页面加载的网络请求,找到json,通过预览确定是哪个文件
问题
players出现和results一开始出现问题,监听中没有出现
采用 jsoup,爬取网页页面里面的内容,就可以找到源地址,然后再打开
接口设计和实现过程
把所有的json放在一个文件夹,然后通过fastjson, 在Lib.java 工具类里面去访问
实现: 举例:players.json的调用
编写中的测试
设置 项目调试配置,构建并运行,主函数 args的 arg[0],arg[1]
关键代码展示
outFile 循环输出到 output文件
public void outPutAllPlayers(BufferedWriter bw) {
try {
allPlayers temp = getAllPlayers();
int num = Integer.parseInt(temp.getAllPlayersNums());
System.out.println(num);
for (int i=0;i< num;i++) {
allPlayers.Players tempMedals=temp.playersList.get(i);
bw.write("full_name"+tempMedals.getFull_name()+"\n");
bw.write("short_name:"+tempMedals.getShort_name()+"\n");
bw.write("gender:"+tempMedals.getGender()+"\n");
bw.write("Birth_place:"+tempMedals.getBirth_place()+"\n");
bw.write("coach:"+tempMedals.getCoach()+"\n-----\n");
}
bw.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
读取 Json 文件
/**
* @param fileName:
* @return str
* @ClassName: readJsonFile
* @author 14533
* @description TODO
* @date 2023/2/26 14:52
*/
public static String readJsonFile(String fileName) throws FileNotFoundException {
String str="";
FileInputStream inputStream = new FileInputStream(fileName);
try {
int ch=0;
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
StringBuffer sb = new StringBuffer();
try {
while ((ch=br.read())!=-1) sb.append((char)ch);
br.close();
str=sb.toString();
return str;
}catch (IOException e) {
e.printStackTrace();
return null;
}
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
性能改进
共计 788 个选手信息,包括大量的图片信息,创建java类,先json读取指定json内容然后再返回
class allPlayers {
private String players;
public List<Players> playersList;
/**
* @ClassName Players:
* @author 14533
* @description TODO
* @date 2023/2/26 14:21
*/
public static class Players {
private String full_name;
private String short_name;
private String gender;
private String birth_place;
private String coach;
public Players() { }
/**
* @param fullname:
* @param shortname:
* @param sgender:
* @param birthplace:
* @param coachs:
* @return void
* @author 14533
* @description TODO
* @date 2023/2/26 14:29
*/
public void setPlayers(String fullname, String shortname, String sgender, String birthplace, String coachs) {
full_name = fullname;
short_name = shortname;
gender = sgender;
birth_place = birthplace;
coach = coachs;
}
public String getFull_name() {return full_name;}
public String getShort_name() {return short_name;}
public String getGender() {return gender;}
public String getBirth_place() {return birth_place;}
public String getCoach() {return coach;}
}
/**
* @param total:
* @param listPlayers:
* @return null
* @author 14533
* @description TODO
* @date 2023/2/26 14:31
*/
public allPlayers(String total, List<Players> listPlayers) {
players = total;
playersList = listPlayers;
}
public String getAllPlayersNums() { return players; }
}
单元测试
junit 选择test用例
列举:
测试 查询比赛中的选手的信息如果没有选手系统会不会出错
@Test
public void whichPlayerTestNull() {
boolean flag = false;
JSONArray winners = null;
JSONArray uuids = JSONArray.parseArray("['240324-69652871-6852368']");
for(int i = 0; i < uuids.size(); i++) {
flag = true;
}
assertTrue(flag);
}
@Test
public void whichPlayerTestEmpty() {
JSONArray winners = null;
JSONArray uuids = JSONArray.parseArray(null);
for(int i = 0; i < uuids.size(); i++) {
flag = true;
}
assertTrue(flag);
}
两个测试类,用判断是否能进去for做断言的结果
情况 | 结果 |
---|---|
传入的选手uuid不在选手列表 | 循环继续但return不输出结果 |
传入null,表示没有获取到uuid | 循环不继续,程序直接退出 |
调整
循环结果强制退出输出 null
for循环前判断 uuids.size() 长度 == 0 跳过循环输出 error
异常处理
- 文件读取都添加了,文件读取不到的异常处理
FileNotFoundException
- 对付无法转义,阻止程序出现编译失败
UnsupportedEncodingException
- 其他的没发现,统一有问题就直接捕获
IOException
心路历程与收获
- 对Java类的相互引用,封装,测试有了更深的了解
- 学会了运用 fastJson调用json文件
- 学习了阿里巴巴代码编写规范后,对企业级编码的规范有了了解,也发现这样写代码最后检查也更加方便
- 优化了Idea的自定义注释
- 对先打代码还是先写计划有了体会,在计划会省去很多不必要的边写边改的过程,而且可以在编写之前解决大部分对代码不熟悉的部分,减轻过程中因为知识受限造成的问题
- 单元测试不是很明白
- 总的来说:掌握了 fastjson,junit,Lib类编写,主函数调用这样的方式。还有在测试和总结和收集数据方面的欠缺。