JAVA爬酷狗音乐

3 篇文章 0 订阅
1 篇文章 0 订阅

先说一下爬取的思路
1,随便打开一首能波的歌播放,找到它的播放地址:
https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=42447823290E80FD5318E8A195A169DD&album_id=28687022
多播放几首发现只要hash和album_id不同就能播放不同的歌
所以只要找到所有歌的hash和album_id就行了,OK打开开发者模式点这个文件在这里插入图片描述
找到它的头文件点开哈哈哈就包含了hash和album_id
后来发现拿到也没用不是歌曲播放的真实地址,继续找它的歌曲文件的地址终于发现藏在了这个文件下
在这里插入图片描述
把它头文件打开就是歌曲的文件的播放地址且发现在最后面有歌曲的真实播放地址play_backup_url,所以只要改变hash和album_id不就所有歌曲的文件都有了吗

所以总结下来就是
1,打开播放一首歌的开发者模式找到所有歌曲的album_id和hash
2,同样在此开发者模式中找到歌曲的真实播放地址
3,改变不同的hash和album_id就能得到所有歌曲的真实播放地址

思路缕清开始撸代码
1,先模拟浏览器环境,使得能够打开网页得到数据(hash和album_id)

public static String httpGetCallbackData(String url, List<NameValuePair> params) {
		//1.获取连接客户端工具
		BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager();
		CloseableHttpClient httpclient = HttpClients.custom()
				.setConnectionManager(connManager)
				.build();
		//网址返回的json数据。创建一个空的引用。
		String entityStr = null;
		//请求  response:响应
	    CloseableHttpResponse response = null;
		try {
	        URIBuilder uriBuilder = new URIBuilder(url);
			uriBuilder.setParameters(params);
	        
			//创建GET请求对象
			HttpGet httpGet = new HttpGet(uriBuilder.build());
			RequestConfig requestConfig = RequestConfig.custom()
					.setSocketTimeout(5000)
					.setConnectTimeout(50000)
					.setConnectionRequestTimeout(50000)
					.build();
			httpGet.setConfig(requestConfig);
			
			//添加请求头信息
			httpGet.setHeader("content-type", "application/x-www-form-urlencoded; charset=UTF-8");
			httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36");
			
			//执行请求
			response = httpclient.execute(httpGet);
			HttpEntity entity = response.getEntity();
	        //.使用Apache提供的工具类进行转换成字符串
			entityStr = EntityUtils.toString(entity, "UTF-8");
		} catch (ClientProtocolException e) {
	        System.err.println("Http协议出现问题");
	        e.printStackTrace();
	    } catch (ParseException e) {
	        System.err.println("解析错误");
	        e.printStackTrace();
	    } catch (URISyntaxException e) {
	        System.err.println("URI解析异常");
	        e.printStackTrace();
	    } catch (IOException e) {
	        System.err.println("IO异常");
	        e.printStackTrace();
	    } finally {
	    	// 释放连接
	        if (null != response) {
	            try {
	                response.close();
	                httpclient.close();
	            } catch (IOException e) {
	                System.err.println("释放连接出错:"+e.getMessage());
	            }
	        }
	    }
		return entityStr;
	}

这里返回的是字符串,要把它转化为json数据得到album_id和hash
2,通过album_id和hash打开index中头文件的地址得到歌曲真实播放地址play_backup_url

//打开存放歌曲播放地址的页面
		List<NameValuePair> params2 = new ArrayList<NameValuePair>();
		params2.add(new BasicNameValuePair("r", "play/getdata"));
		params2.add(new BasicNameValuePair("hash", filehash));
		params2.add(new BasicNameValuePair("album_id", String.valueOf(albumid)));
		String result2= Downmusic.httpGetCallbackData("https://wwwapi.kugou.com/yy/index.php", params2);
		JSONObject jsonObjectmusci=JSONObject.parseObject(result2);
		JSONObject jsonObjectmuscidata=jsonObjectmusci.getJSONObject("data");
		String musicUrl=jsonObjectmuscidata.getString("play_backup_url");

3,得到歌曲的真实播放地址后就可以用流把它下载到磁盘中了

try {
			URL url = new URL(musicUrl);
			URLConnection urlconn = url.openConnection();
			InputStream inputStream = urlconn.getInputStream();
			int len = 0;
			byte[] b = new byte[1024*4];
			OutputStream out = new FileOutputStream("G:\\xxx\\"+songname+".mp3");
			while ((len = inputStream.read(b)) != -1) {
				out.write(b, 0, len);
			}
			out.close();
			inputStream.close();
			System.out.println("下载完成........下载路径是====>"+"G:\\xxx\\"+songname+".mp3");
		} catch (IOException e) {
			e.printStackTrace();
		}

以上就是爬一音乐的所有代码,要爬所有的歌写个循环就轻松搞定

注意:
1.打开图片中的头文件看它的参数有page和pagesize这是页数和该页数中有几首歌,默认是1,30,刚开始得先从爬一首开始所以要把pagesize改为1.
2,再爬的过程中入的大坑,在获取play_backup_url时程序能正常运行,但是返回的结果却是错误的,苦恼我好久终于在网上找到解决方法,就是在模拟浏览器环境时请求头信息是带上Cookie参数且它的参数不为空就行,我也不知道为啥要这样。
3,一段完整的网址放在URL是打不开的需要把后面的人工拼接

效果图:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值