(详解)Java爬取付费歌曲

mac2024-02-21  49

Java爬取付费歌曲

这几天听了课,做个小小的总结,写篇博客,和大家分享,欢迎相互交流学习 话不多说,上手!

大致思路

手动获取接口(请求链接)->获取实际下载地址->获取歌曲名->下载歌曲到本地

手动获取请求链接,可以参考另一篇博客,这里就不赘述了

一、获取实际下载地址

(一)、手动获取请求链接 http://www.kuwo.cn/url?format=mp3&rid=6148599&response=url&type=convert_url3&br=128kmp3&from=web&t=1572009269212&reqId=604168d0-f729-11e9-88bb-9d8b93c81642

更改rid即可得到对应得付费歌曲,rid就是网页歌曲链接的后缀,打开任意歌曲都可看到

(二)、打开链接获取输入流(上图内容)

//请求链接 String request_url = "http://www.kuwo.cn/url?format=mp3&rid=6148599&response=url&type=convert_url3&br=128kmp3&from=web&t=1572009269212&reqId=604168d0-f729-11e9-88bb-9d8b93c81642"; URL url = new URL(request_url); //将字符串链接转化为一个URL对象 URLConnection urlConnection = url.openConnection();//打开链接 InputStream is = urlConnection.getInputStream();//获取输入流

此时我们得到的是这一串JSON格式的字符串 Tips: 这里简单介绍一下流:流简单来说就是一个通道,在本机电脑上就是内存与硬盘(磁盘)传输数据的通道 输入流:把硬盘上数据读取到内存(Java程序运行在内存上) 输出流:把内存上数据写入到硬盘

而我们打开网页得到的输入流是内存到服务器的一个输入流通道

(三)、获取下载地址 我们上一步得到的是InputStream字节输入流 (此时只是建立了与服务器的通道,并没有读取数据)

1、读取数据 读取数据之前我们要先了解一些流 **InputStream 字节输入流:按字节读取,读到的为ASCII值 ----如 a -> 97 **FileReader 字符输入流:按字符读取,读到的为字符-----------如 a -> ‘a’,中 -> ‘中’ (Tips: 读写纯文本文件时常用字符流,不能用于视频、音频等文件) **BufferedReader 字符缓冲流(输入):缓冲流能够读取整行,得到字符串 **InputStreamReader 转化流,将字节流转换为字符流

我们需要读取整行数据,需要把字节流转为字符流

InputStreamReader isr = new InputStreamReader(is);//字节流 - > 转换流 BufferedReader br = new BufferedReader(isr);//转换流 - >字符流

2、将读到的JSON格式的字符串转化为JSON,提取“url”值

JSON jar包下载及导入 下载地址:https://sourceforge.net/projects/json-lib/postdownload

导入:在工程下建立一个文件夹libs->把下载好的jar包复制粘贴到libs下->右键点击jar包->Build Path->Add to Build Path

\

String str = br.readLine()//读取输入流内容(这里由于只有一行,所以省去了结束的判断) JSONObject fromObject = JSONObject.fromObject(str);//将字符串转化为JSON对象 mp3_url = fromObject.getString("url");//根据"url"键获取实际播放下载地址

由于只展示核心代码,异常处理及关流就省去了

二、获取歌曲名

//先手动获取歌曲信息请求链接,此处mid与之前的rid需相同 String songInfo_url = "http://www.kuwo.cn/api/www/music/musicInfo?mid=6148599&reqId=371957e0-f721-11e9-85bc-e53f2adcca64"; URL url = new URL(songInfo_url); URLConnection urlConnection = url.openConnection();//解释同上 InputStream is = urlConnection.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); JSONObject data = JSONObject.fromObject(br.readLine()).getJSONObject("data"); String songName = data.getString("name");

三、下载歌曲保存到本地

1、创建本地文件

//创建文件夹 File file = new File("D:\\我的歌曲\\下载"); if (!file.exists()) { file.mkdirs(); } //创建本地.mp3文件 File file_mp3 = new File(file + "\\"+songName+".mp3"); if (!file_mp3.exists()) { file_mp3.createNewFile(); }

2、下载文件

URL mp3URL = new URL(mp3_url); URLConnection connection = mp3URL.openConnection(); InputStream is = connection.getInputStream(); byte[] buf = new byte[1024];//一次读1024个字节 fos = new FileOutputStream(file_mp3 );//建立字节输出流通道,关联到本地磁盘文件 int ch = 0;//用于判断文件末尾, while ((ch = is.read(buf)) != -1) {//把读到的内容长度给ch,ch!=-1就没有结束 fos.write(buf, 0, ch); //用输出流写入到文件中,buf是读到的内容 //0表示接着上一次写,不偏移 //ch表示写入的长度(因为buf数组内容有可能不到1024个字节,如果不加长度会把多余的空格也写到文件中) }

Tips 粘贴出来的为核心代码,便于理解 一、二、三点可以各自成一个方法,最终在main函数中调用即可

到这里已经完成了一首歌的爬取,只需要更换歌曲rid即可获取任意歌曲

总结

所有用到的类 URL、URLConnection、InputSream、InputStreamReader、FileReader、BufferedReader、File、FileOutputStream、JSONObject(外部包)

收获 1、Json简单解析 2、网页的打开 3、IO流的复习

有任何问题或需要源代码,欢迎联系QQ:1906721262 相互探讨学习

工具介绍

API(Application Programming Interface )开发帮助文档下载:点击下载https://www.jb51.net/books/575478.html 这里可以搜索到所有类,(API就等价于语言学习的字典)包括类的构建、方法的使用、以及简单的示例程序

最新回复(0)