下载豆瓣电台所有的加心歌曲 - Shall

时间:2024-03-17 13:57:51

下载豆瓣电台所有的加心歌曲

喜欢音乐的朋友应该都知道douban.fm,比如我,加心的歌曲已经有多达600首,所以特别想把加心的歌曲全部下载下来放在本地,随机播放便可以随机的都听自己都喜欢的音乐。这个想法促使我写了这样一个小程序:)

实现这一功能首先要得到自己的加心列表,然后找网站下载歌曲。

1.得到加心列表。

 这个过程可以看成一个小小的爬虫。由于豆瓣只能登录用户才能看见自己的所有加心的歌曲,因此需要得到cookies。使用firebug得到cookies,如图:

得到cookies以后,可以根据以下方式下载网页:

 1 url = new URL(urlStr);

2             httpConn = (HttpURLConnection) url.openConnection();
3             httpConn.setRequestProperty("User-Agent",
4                     "Mozilla/5.0 (compatible; MSIE 6.0; Windows NT)");
5             httpConn.setRequestProperty("Content-Type",
6                     "application/x-www-form-urlencoded");
7             httpConn.setRequestProperty("Cookie", cookies);
8             httpConn.setDoInput(true);
9             InputStream in = httpConn.getInputStream();

首先分析一下网页:http://douban.fm/mine?start=0&type=liked,这个便列出了自己所有喜欢的网页,其中start=*是参数(每页的歌曲数为9首),代表起始的歌曲是第几首。然后分析网页的代码,可以发现“<span>*首喜欢的</span>”,根据正则表达式匹配可以得到喜欢歌曲的总数。同理也可以根据正则表达式匹配到喜欢的歌曲名。so,我们可以很容易得到喜欢的歌曲列表。

2.下载歌曲 

得到加心列表了以后,便需要找地方下载咱们喜欢的歌曲了。我选择的是baidu zhangmenren,分析下这个链接http://box.zhangmen.baidu.com/x?op=12&count=1&title=hello%20world$$,表示搜索的歌曲是hello world。:)

仔细观察此页面的源代码, 对于url有加密的,不过解密太简单了:

<encode>http://listen.idj.126.net/uf/920/Y2Zla26Za2plZGpsaZtvm2ljlWaab2hul2dkaJhubm8x.mp3</encode><decode>24279c4242784e8c81b2e916f514c877.mp3</decode>  

 把上面的encode中的url最后一个/的部分替换成decode中的数据便ok,上面的解密后的url是:

http://listen.idj.126.net/uf/920/24279c4242784e8c81b2e916f514c877.mp3

  接下来该怎么做大家应该都知道了吧,大概的代码就是:

        httpConn = url.openConnection();
        httpConn.connect();
        in 
= httpConn.getInputStream();
        File musicFile 
= new File(musicName);
        
if (musicFile.exists()) {
            System.out.println(musicName 
+ " already exists");
            
return;
        }
        System.out.println(
"downloading music ***" + musicName + "*** in url:"
                
+ urlStr);
        out 
= new FileOutputStream(musicFile, false);
        
        
while (true) {
            
byte[] reads = new byte[100000];//100k
            int readSum = in.read(reads);
            
if(readSum == -1)
                
break;
            out.write(reads,
0,readSum);
            Date date2 
= new Date();
            if(date2.getTime()-date1.getTime()>300000){//300s
                System.out.println("over time:"+(date2.getTime()-date1.getTime()));
                
break;
            }
        }
        out.flush();
        in.close();

out.close(); 

ok,搞定,大家尽情享受加心音乐吧。

原创文章,转载请注明: 转载自shallshell的博客