一般项目流程
项目需求
功能描述
- 自动查询某个歌手的所有热门歌曲
- 自动获取每一首歌的基础信息,专辑信息
- 自动获取每一首歌的热门评论,最新评论
- 对所有的热门评论进行统计形成词云
用到的技术点和知识点
API
| 查询某个歌手歌单信息的API | http://neteaseapi.youkeda.com:3000/artists?id=xxxx | id - 歌手id | | —- | —- | —- | | 获取每首歌详细信息的API | http://neteaseapi.youkeda.com:3000/song/detail?ids=xxxx,xxxx | ids - 歌曲id,查询多个歌曲用逗号分开 | | 获取每首歌评论的API | http://neteaseapi.youkeda.com:3000/comment/music?id=xxxx&limit=xxxx | id - 歌曲id,limit - 评论条数 | | 获取每首歌的音乐文件地址 | http://neteaseapi.youkeda.com:3000/song/url?id=xxxx,xxxx | id - 歌曲id,查询多个用逗号隔开 |
模型设计和服务设计
模型设计是在通过API获取到JSON格式的数据后,分析确定字段,完成(POJO)模型设计。
服务设计是确定完成某个功能技术所需要的方法,都是接口+实现。在实现类里,往往需要一个初始化实例变量的方法,这样扩展性较好。
maven依赖
项目需要用到的maven依赖有
<dependencies>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>com.kennycason</groupId>
<artifactId>kumo-core</artifactId>
<version>1.17</version>
</dependency>
<!-- 下面tokenizers是为了中文分词引入 -->
<dependency>
<groupId>com.kennycason</groupId>
<artifactId>kumo-tokenizers</artifactId>
<version>1.17</version>
</dependency>
</dependencies>
JSON数据格式的解析
get请求API获取数据(爬取)
反序列化对象
代码重构
- 重构的含义
在不改变代码接口的情况下,对代码作出修改,以改进程序的内部结构。简单说就是在代码写好之后改进其方法体内的实现,对其他调用者是透明的。
- 重构的目的
Map
概念
map接口中常用集合
- HashMap
存储数据采用的哈希表结构,元素的存取顺序不能保证一致,由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 - LinkedHashMap
map接口中的常用方法
| 方法 | 解释 | | —- | —- | | get(Object key) | 返回key映射的value,如果此映射不包含key的映射关系,则返回null | | put( k key,V value) | 将key与value 形成映射关系,添加到集合中 | | remove(Object key) | 如果存在一个键的映射关系,则将其从此映射中移除 |
遍历
public class MapDemo {
public static void main(String[] args) {
//创建Map对象
Map<String, String> map = new HashMap<String,String>();
//给map中添加元素
map.put("邓超", "孙俪");
map.put("李晨", "范冰冰");
map.put("刘德华", "柳岩");
//获取Map中的所有key
Set<String> keySet = map.keySet();
//遍历存放所有key的Set集合
Iterator<String> it =keySet.iterator();
while(it.hasNext()){ //利用了Iterator迭代器
//得到每一个key
String key = it.next();
//通过key获取对应的value
String value = map.get(key);
System.out.println(key+"="+value);
}
}
}
//for each简单写法
for(String item:map.keySet()){
String value = map.get(item);
}
public class MapDemo {
public static void main(String[] args) {
//创建Map对象
Map<String, String> map = new HashMap<String,String>();
//给map中添加元素
map.put("邓超", "孙俪");
map.put("李晨", "范冰冰");
map.put("刘德华", "柳岩");
//获取Map中的所有key与value的对应关系
Set<Map.Entry<String,String>> entrySet = map.entrySet();
//遍历Set集合
Iterator<Map.Entry<String,String>> it =entrySet.iterator();
while(it.hasNext()){
//得到每一对对应关系
Map.Entry<String,String> entry = it.next();
//通过每一对对应关系获取对应的key
String key = entry.getKey();
//通过每一对对应关系获取对应的value
String value = entry.getValue();
System.out.println(key+"="+value);
}
}
}
//同样的for each写法
for (Entry<String, String> entry: map.entrySet()) {
int key = entry.getKey();
String value = entry.getValue();
}
词云库
最常用的词云库为 Kumo ,github地址为https://github.com/kennycason/kumo