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

2020-01-06  本文已影响0人  lcjyzm

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>
上一篇下一篇

猜你喜欢

热点阅读