当前位置:   article > 正文

音乐评论分析项目的总结

音乐评论分析项目的总结

首先明确要爬取的项目:网易云音乐及评论
目标:将项目中的热门评论进行分词生成图片
应该具备的功能:1.抓取单曲2.抓取评论3.分词

使用API获取歌手的歌单信息,每个歌手均对应一个id
歌手的信息:API+ID

需要构建歌单和歌曲两个关键模型
由此来设计相关接口和实现类
项目依赖:okhttp3
非常适合移动端的开发,但是对于web端的Java应用开发也是同样的强大。
请求过程:使用GET请求
构造OkHttpClient(可以通过new或者Builder)->构造Request->newCall->Call#execute或者Call#enqueue。最后一步操作就是同步或者异步请求的区别。

设计歌手歌曲两个实例对象及其属性

核心服务:爬取
爬取的整体思路
首先第一步应该构建歌单url,进行组装
由于各个各个歌单的url只有后面歌手的参数不同
因此将前面的api定义为一个final变量,方便调用

private static final String ARTIEST_API_PREFIX
  • 1

一、调用okhttp3来进行爬取:

// 首先创建okHttpClient 实例
  private OkHttpClient okHttpClient;
  //初始化操作
  private void init() {
    //1. 构建 okHttpClient 实例
    okHttpClient = new OkHttpClient();
    artists = new HashMap<>();
  }
  
  public void start(String artistId) {
    // 参数判断,未输入参数则直接返回
    if (artistId == null || artistId.equals("")) {
      return;
    }

    // 执行初始化
    init();

    // 取得整体数据对象。
    Map returnData = getArtistObj(artistId);
  }

private Map getArtistObj(String artistId) {
    // 构建歌单url
    String aUrl = ARTIEST_API_PREFIX + artistId;
    // 调用 okhttp3 获取返回数据
    String content = getPageContentSync(aUrl);
    // 反序列化成 Map 对象
    Map returnData = JSON.parseObject(content, Map.class);

    return returnData;
  }

/**
   * 根据输入的url,读取页面内容并返回
   */
  private String getPageContentSync(String url) {
    //2.定义一个request
    Request request = new Request.Builder().url(url).build();
    //3.使用client去请求
    Call call = okHttpClient.newCall(request);
    String result = null;
    try {
      //4.获得返回结果
      result = call.execute().body().string();
      System.out.println("call " + url + " , content's size=" + result.length());
    } catch (IOException e) {
      System.out.println("request " + url + " error . ");
      e.printStackTrace();
    }

    return result;
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

二、将返回的数据进行处理,获取填充属性的artist实例

private Artist buildArtist(Map returnData) {
    // 从 Map 对象中取得 歌单 数据。歌单也是一个子 Map 对象。
    Map artistData = (Map) returnData.get("artist");
    Artist artist = new Artist();
    artist.setId(artistData.get("id").toString());
    if (artistData.get("picUrl") != null) {
      artist.setPicUrl(artistData.get("picUrl").toString());
    }
    artist.setBriefDesc(artistData.get("briefDesc").toString());
    artist.setImg1v1Url(artistData.get("img1v1Url").toString());
    artist.setName(artistData.get("name").toString());
    artist.setAlias((List) artistData.get("alias"));
    return artist;
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

使用builArtist方法进行填充,具体思路是从完整返回数据中取出artist字段
然后创建artist实例,分别对其id等属性进行填充

三、获取填充了数据的song实例

private List<Song> buildSongs(Map returnData) {
    // 从 Map 对象中取得一组 歌曲 数据
    List songsData = (List) returnData.get("hotSongs");
    List<Song> songs = new ArrayList<>();

    for (int i = 0; i < songsData.size(); i++) {
      Map songData = (Map) songsData.get(i);
      Song songObj = new Song();
      songObj.setId(songData.get("id").toString());
      songObj.setName(songData.get("name").toString());

      songs.add(songObj);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

四、最后将获取的歌曲存入歌单

// 歌曲填入歌单
    artist.setSongList(songs);
    // 存入本地
    artists.put(artist.getId(), artist);
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/861154
推荐阅读
相关标签
  

闽ICP备14008679号