美文网首页
Java批量下载九酷(9ku)某个分类下的所有音乐

Java批量下载九酷(9ku)某个分类下的所有音乐

作者: lcjyzm | 来源:发表于2020-01-06 16:27 被阅读0次

    1,参考源码

    package com.lcj.selenium.instance;
    
    import cn.hutool.core.collection.CollUtil;
    import cn.hutool.core.io.FileUtil;
    import cn.hutool.core.io.StreamProgress;
    import cn.hutool.core.lang.Console;
    import cn.hutool.core.map.MapUtil;
    import cn.hutool.core.util.StrUtil;
    import cn.hutool.http.HttpRequest;
    import cn.hutool.http.HttpResponse;
    import cn.hutool.json.JSONObject;
    import cn.hutool.json.JSONUtil;
    import com.lcj.selenium.utils.SeleniumUtil;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.Map;
    import java.util.Set;
    
    public class JiuKuMusicDownloadCrawler {
        // 保存所有的歌曲编码
        private static Set<String> songsCodeList = CollUtil.newHashSet();
        // 公共请求头
        private static Map<String, String> headers;
    
        // 音乐保存根目录
        private static final String MUSIC_ROOT = "d:/9ku";
    
        static {
            headers = CollUtil.newHashMap();
            headers.put("accept-encoding", "gzip, deflate");
            headers.put("accept-language", "zh-CN,zh;q=0.9");
            headers.put("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400");
        }
    
        public static void main(String[] args) {
            for (int i = 1; i <= 5; i++) {
                // 1. 获取要下载的歌曲列表
                songsList(String.format("http://www.9ku.com/x1/music/by_new.php?act=t_new&page=%d", i));
            }
    
    
            songsCodeList.forEach(code -> {
                // 2. 获取歌曲信息
                JSONObject jsonObject = songInfo(code);
    
                // 3. 下载mp3
                downloadMp3(jsonObject);
    
                SeleniumUtil.wait(10000);
            });
        }
    
        // 1. 获取要下载的歌曲列表
        private static void songsList(String new500SongsUrl) {
            // songList clearfix
            HttpRequest request = new HttpRequest(new500SongsUrl);
    
            headers.put("accept", "*/*");
            headers.put("Host", "www.9ku.com");
            request.addHeaders(headers);
    
            HttpResponse response = request.execute();
            response.close();
            if (response.isOk()) {
                String body = response.body();
                // 解析HTML字符串
                Document document = Jsoup.parse(body);
                Elements elements = document.getElementsByClass("songList");
                elements.forEach(element -> {
                    Elements lis = element.getElementsByTag("li");
                    lis.forEach(e -> {
                        Element input = e.getElementsByTag("input").first();
                        String songCode = input.attr("value").replace("@", "");
                        Element a = e.getElementsByClass("songName").first();
                        String songName = a.text();
                        Console.log("song info: [{} : {}]", songCode, songName);
                        songsCodeList.add(songCode);
                    });
                });
            } else {
                Console.log("获取新歌曲列表失败,原因: {}", response.getStatus());
            }
        }
    
        // 2. 获取歌曲信息
        private static JSONObject songInfo(String songCode) {
            HttpRequest request = new HttpRequest(String.format("http://www.9ku.com/html/playjs/998/%s.js", songCode));
    
            headers.put("accept", "*/*");
            headers.put("Host", "www.9ku.com");
            headers.put("X-Requested-With", "XMLHttpRequest");
            request.addHeaders(headers);
    
            HttpResponse response = request.execute();
            response.close();
            if (response.isOk()) {
                String body = response.body();
                body = body.substring(1, body.length() - 1);
                Console.log("歌曲信息: {}", body);
                return JSONUtil.parseObj(body);
            } else {
                Console.log("获取新歌信息失败,原因: {}", response.getStatus());
                return null;
            }
    
        }
    
        private static void downloadMp3(JSONObject jsonObject) {
            String id = jsonObject.getStr("id");
            String songName = jsonObject.getStrEscaped("mname");
            String singer = jsonObject.getStrEscaped("singer");
            String downloadUrl = jsonObject.getStr("wma");
            Console.log("id:{},songName:{},singer:{},downloadUrl:{}", id, songName, singer, downloadUrl);
    
            if (StrUtil.isNotBlank(songName) && StrUtil.isNotBlank(singer) && StrUtil.isNotBlank(downloadUrl)) {
                HttpRequest request = new HttpRequest(downloadUrl);
    
                Map<String, String> headers = MapUtil.newHashMap();
                headers.put("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
                headers.put("Host", "mp32.9ku.com");
                request.addHeaders(headers);
    
                HttpResponse response = request.execute();
                if (response.isOk()) {
                    try {
                        if (!FileUtil.exist(MUSIC_ROOT)) {
                            FileUtil.mkdir(MUSIC_ROOT);
                        }
                        String musicPath = String.format("%s/%s_%s.mp3", MUSIC_ROOT, songName, singer);
                        if(FileUtil.exist(musicPath)){
                            return;
                        }
                        OutputStream outputStream = new FileOutputStream(musicPath, true);
                        response.writeBody(outputStream, true, new StreamProgress() {
                            long start, end;
    
                            @Override
                            public void start() {
                                Console.log("开始下载。。。。");
                                start = System.currentTimeMillis();
                            }
    
                            @Override
                            public void progress(long progressSize) {
                                Console.log("已下载:{}", FileUtil.readableFileSize(progressSize));
                            }
    
                            @Override
                            public void finish() {
                                end = System.currentTimeMillis();
                                Console.log("下载完成!耗时: {} 毫秒", end - start);
                            }
                        });
                    } catch (Exception e) {
                        Console.error("创建文件失败,原因: {}", e.toString());
                    }
                } else {
                    Console.error("下载MP3: {}失败,原因: {}", songName, response.getStatus());
                }
            }
    
        }
    
    }
    
    

    2,需要引入的maven依赖或jar

    <dependency>
         <groupId>cn.hutool</groupId>
         <artifactId>hutool-all</artifactId>
         <version>5.0.0</version>
    </dependency>
    <dependency>
           <groupId>org.jsoup</groupId>
           <artifactId>jsoup</artifactId>
           <version>1.12.1</version>
      </dependency>
    

    相关文章

      网友评论

          本文标题:Java批量下载九酷(9ku)某个分类下的所有音乐

          本文链接:https://www.haomeiwen.com/subject/loukactx.html