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>
网友评论