您的位置 首页 > 数码极客

【mp4怎么下载音乐】Java爬取并下载酷狗TOP500歌曲

点击上面的“程序员小乐”,点击关注、星号、正常一起成长。

第一时间和你约定

每天英语

All problems,and ultimately is a matter of time . all the worry,in fact is a bother。

所有的问题归根结底都是时间问题。

一切烦恼,其实都是自寻烦恼。


每日掏心话

人生一定要冲动一次,要么为了一个人,要么为了爱情,要么为了旅行,或者是为了梦想。


来自:后山悟道人 | 责编:乐乐

链接:my.o

程序员小乐(ID:study_tech)第 724 次推文 图片来自网络


往日回顾:广告太多超烦人?让你和烦人的弹窗广告说拜拜!


正文


下文方法及代码仅供学习使用,不做他用。示例用到了一些库,包括:jsoup、HttpClient、net.大家可以自行去下载jar包。

1.分析是否能获得TOP500歌单

首先,打开酷狗首页查看酷狗TOP500,说好的500首,怎么就只有22首呢?

是真的只让看这些还是能找到其余的呢,于是我就看了下这TOP500的链接

可以看的出home后边有个1,难道这是代表第一页的意思?于是我就把1改成2,进入,果然进入了第二页, 至此可以知道我们可以在网页里获取这500首的歌单。

2.分析找到真正的mp3下载地址(这个有点绕)

点一个歌曲进入播放页面,使用谷歌浏览器的控制台的Elements,搜一下mp3,很轻松就定位到了MP3的位置

但是使用java访问的时候爬取的html里却没有该mp3的文件地址,那么这肯定是在该页面的位置使用了js来加载mp3,那么刷新下网页,看网页加载了哪些东西,加载的东西有点多,着重看一下js、php的请求,主要是看里面有没有mp3的地址,分析细节就不用说了

最终我在列表的

;callback=jQuery191027067069941080546_50&hash=667939C6E784265D541DEEE65AE4F2F8&album_id=0&_=51

这个请求里发现了mp3的完整地址,

"play_url": "http:\/\\/201812311325\/dcf5b6449160903c6ee48035e11434bb\/G128\/M08\/02\/09\;,

那这个js是怎么判断是哪首歌的呢,那么只可能是hash这个参数来决定歌曲的,然后到播放页面里找到这个hash的位置,是在下面的js里

var dataFromSmarty = [{"hash":"667939C6E784265D541DEEE65AE4F2F8","timelength":"237051","audio_name":"\u767d\u5c0f\u767d - \u6700\u7f8e\u5a5a\u793c","author_name":"\u767d\u5c0f\u767d","song_name":"\u6700\u7f8e\u5a5a\u793c","album_id":0}],//当前页面歌曲信息
playType = "search_single";//当前播放
</script>

在去java爬取该网页,查看能否爬到这个hash,果然,爬取的html里有这段js,到现在mp3的地址也找到了,歌单也找到了,那么下一步就用程序实现就可以了。

3.java实现爬取酷狗mp3

先看一下爬取结果

找到了资源,程序实现就好说了,其中使用到了自己写的几个工具类,自己整理点自己的工具类还是有好处的,以后遇到什么问题就没必要重新写了,直接拿来用就可以了。没什么好说的了,下面直接贴出源码

S

package com.bing.spider;

import java.io.IOException;
import java.u;
import java.u;

import org.j;
import org.j;
import org.j;

import com.bing.download.FileDownload;
import com.bing.;
import com.bing.;

import net..JSONObject;

public class SpiderKugou {

public static String filePath = "F:/music/";
public static String mp3 = ";callback=jQuery191027067069941080546_50&"
+ "hash=HASH&album_id=0&_=TIME";

public static String LINK = ";;
//";;


public static void main(String[] args) throws IOException {

for(int i = 1 ; i < 23 ; i++){
String url = LINK.replace("PAGE", i + "");
getTitle(url);
//download(";);
}
}

public static String getTitle(String url) throws IOException{
HttpGetConnect connect = new HttpGetConnect();
String content = connect.connect(url, "utf-8");
HtmlManage html = new HtmlManage();
Document doc = (content);
Element ele = doc.getElementsByClass("pc_temp_songlist").get(0);
Elements eles = ele.getElementsByTag("li");
for(int i = 0 ; i < eles.size() ; i++){
Element item = eles.get(i);
String title = i("title").trim();
String link = i("a").first().attr("href");

download(link,title);
}
return null;
}

public static String download(String url,String name) throws IOException{
String hash = "";
HttpGetConnect connect = new HttpGetConnect();
String content = connect.connect(url, "utf-8");
HtmlManage html = new HtmlManage();

String regEx = "\"hash\":\"[0-9A-Z]+\"";
// 编译正则表达式
Pattern pattern = Pa(regEx);
Matcher matcher = (content);
if ()) {
hash = ma();
hash = ("\"hash\":\"", "");
hash = ("\"", "");
}

String item = m("HASH", hash);
item = i("TIME", Sy() + "");

Sy(item);
String mp = connect.connect(item, "utf-8");

mp = mp.substring("(") + 1, mp.length() - 3);

JSONObject json = JSONObject.fromObject(mp);
String playUrl = j("data").getString("play_url");


Sy(playUrl + " == ");
FileDownload down = new FileDownload();
down.download(playUrl, filePath + name + ".mp3");

Sy(name + "下载完成");
return playUrl;
}

}

H

package com.bing.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.;
import java.;
import java.;

import javax.net.;
import javax.net.;
import javax.net.;

import org.a;
import org.aFactory;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.aRegistry;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;
/**
* @说明:
* @author: gaoll
* @CreateTime:2014-11-13
* @ModifyTime:2014-11-13
*/
public class HttpGetConnect {

/**
* 获取html内容
* @param url
* @param charsetName UTF-8、GB2312
* @return
* @throws IOException
*/
public static String connect(String url,String charsetName) throws IOException{
BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager();

CloseableHttpClient httpclient = H()
.setConnectionManager(connManager)
.build();
String content = "";

try{
HttpGet httpget = new HttpGet(url);

RequestConfig requestConfig = Reque()
.setSocketTimeout(5000)
.setConnectTimeout(50000)
.setConnectionRequestTimeout(50000)
.build();
(requestConfig);
("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
("Accept-Encoding", "gzip,deflate,sdch");
("Accept-Language", "zh-CN,zh;q=0.8");
("Connection", "keep-alive");
("Upgrade-Insecure-Requests", "1");
("User-Agent", "Mozilla (Windows NT 6.1; WOW64) AppleWebKi (KHTML, like Gecko) Chrome Safari;);
//("Hosts", "www.o;);
("cache-control", "max-age=0");

CloseableHttpResponse response = (httpget);

int status = re().getStatusCode();
if (status >= 200 && status < 300) {

HttpEntity entity = re();
InputStream instream = en();
BufferedReader br = new BufferedReader(new InputStreamReader(instream,charsetName));
StringBuffer sbf = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null){
(line + "\n");
}

br.close();
content = ();
} else {
content = "";
}

}catch(Exception e){
e.printStackTrace();
}finally{
();
}
("content is " + content);
return content;
}
private static Log log = LogFac);
}

H

package com.bing.html;

import java.io.IOException;
import java.u;
import java.u;

import org.a;
import org.aFactory;
import org.j;
import org.j;
import org.j;
import org.j;

import com.bing.;

/**
* @说明:
* @author: gaoll
* @CreateTime:2014-11-13
* @ModifyTime:2014-11-13
*/
public class HtmlManage {

public Document manage(String html){
Document doc = J(html);
return doc;
}

public Document manageDirect(String url) throws IOException{
Document doc = J( url ).get();
return doc;
}

public List<String> manageHtmlTag(Document doc,String tag ){
List<String> list = new ArrayList<String>();

Elements elements = doc.getElementsByTag(tag);
for(int i = 0; i < elemen() ; i++){
String str = elemen(i).html();
li(str);
}
return list;
}

public List<String> manageHtmlClass(Document doc,String clas ){
List<String> list = new ArrayList<String>();

Elements elements = doc.getElementsByClass(clas);
for(int i = 0; i < elemen() ; i++){
String str = elemen(i).html();
li(str);
}
return list;
}

public List<String> manageHtmlKey(Document doc,String key,String value ){
List<String> list = new ArrayList<String>();

Elements elements = doc.getElementsByAttributeValue(key, value);
for(int i = 0; i < elemen() ; i++){
String str = elemen(i).html();
li(str);
}
return list;
}

private static Log log = LogFac);
}

FileDownload.java

package com.bing.download;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;

import org.a;
import org.aFactory;
import org.a;
import org.a;
import org.a;
import org.a;
import org.a;

/**
* @说明:
* @author: gaoll
* @CreateTime:2014-11-20
* @ModifyTime:2014-11-20
*/
public class FileDownload {

/**
* 文件下载
* @param url 链接地址
* @param path 要保存的路径及文件名
* @return
*/
public static boolean download(String url,String path){

boolean flag = false;

CloseableHttpClient httpclient = H();
RequestConfig requestConfig = Reque().setSocketTimeout(2000)
.setConnectTimeout(2000).build();

HttpGet get = new HttpGet(url);
get.setConfig(requestConfig);

BufferedInputStream in = null;
BufferedOutputStream out = null;
try{
for(int i=0;i<3;i++){
CloseableHttpResponse result = (get);
Sy());
if().getStatusCode() == 200){
in = new BufferedInputStream().getContent());
File file = new File(path);
out = new BufferedOutputStream(new FileOutputStream(file));
byte[] buffer = new byte[1024];
int len = -1;
while((len = in.read(buffer,0,1024)) > -1){
out.write(buffer,0,len);
}
flag = true;
break;
}else if().getStatusCode() == 500){
continue ;
}
}

}catch(Exception e){
e.printStackTrace();
flag = false;
}finally{
get.releaseConnection();
try{
if(in != null){
in.close();
}
if(out != null){
out.close();
}
}catch(Exception e){
e.printStackTrace();
flag = false;
}
}
return flag;
}

private static Log log = LogFac);
}


到这就结束了,有可能有些代码没贴全,主要代码已经差不多,应该可以跑起来,多多指教。


欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。


猜你还想看


阿里、腾讯、百度、华为、京东最新面试题汇集

百亿数据量下,掌握这些Redis技巧你就能Hold全场

Linux 中的零拷贝技术,看完这篇文章你就明白了!

HTTPS 原理分析:带着疑问层层深入


关注「程序员小乐」,收看更多精彩内容
嘿,你在看吗?


关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐