一般项目流程
项目需求
功能描述
- 自动查询某个歌手的所有热门歌曲
- 自动获取每一首歌的基础信息,专辑信息
- 自动获取每一首歌的热门评论,最新评论
- 对所有的热门评论进行统计形成词云
用到的技术点和知识点
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
HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。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中的所有keySet<String> keySet = map.keySet();//遍历存放所有key的Set集合Iterator<String> it =keySet.iterator();while(it.hasNext()){ //利用了Iterator迭代器//得到每一个keyString key = it.next();//通过key获取对应的valueString 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();//通过每一对对应关系获取对应的keyString key = entry.getKey();//通过每一对对应关系获取对应的valueString 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
