一个利用python从中科大音乐网站下载mp3的程序

来源:互联网 发布:美国劳工统计局数据 编辑:程序博客网 时间:2024/05/21 07:49

    (说明: 这是我2007年写在cublog(China Unix)上的博客,现在把它转到这里来.)

    一直很喜欢到中科大音乐网站听音乐,在教育网进入中科大的音乐网站速度超级快,另外这上面的音乐很全,质量特别好,所以推荐教育网内用户到music.ustc.edu.cn上面听音乐哦。
    好是好,有时候很想把这些mp3下载下来,又一次看到一位仁兄写了一个用shell脚本下载的程序,我就仿照它用python写了一个。
    首先,用firefox一类浏览器登陆music.ustc.edu.cn,找到你想要的专辑,点击[播放]。此时1个*.m3
u的文件.比如我下载了周华健的"让我喜欢让我忧"专辑的M3U文件,就保存为 "周华健-让我欢喜让我忧.m3u"
    这个文件的格式为:

    

#EXTM3U 你现在还好吗http://music2.ustc.edu.cn:8088/fe3e11885f53947efb6418fcc0540c5c%2F80%2Fde447c53c5adedbf28542f42cc8a8687.mp3#EXTM3U 让我欢喜让我忧http://music2.ustc.edu.cn:8088/27c85fd4fcd4cae342a9c1df6dc95793%2F81%2F8d8eeef5821e50b7e6696555cf789663.mp3

    其实,我们要做的工作很简单,就是下载http后面那个mp3文件,然后命名为#EXTM3U 后面的那个文件名就可以了.
    由于python的强大文件处理,我决定让他下载当前目录下的全部m3u文件.也就是说,你可以下载多个类似于"周华健-让我欢喜让我忧.m3u"的文件放在当前目录下,这个程序将会一个一个地,给每一张专辑建一个以专辑名为名的文件夹,然后把专辑里面的歌曲下载到对应的文件夹里面.
    好了,开始吧.关键的一点,一定要对下载下来的文件进行解码处理,由于不知道它的文字编码方式,我使用了一个chardet库,专门用于检测字符的编码.由于整个程序很简单,我就直接贴在下面了:

    

#!c:\python25\python.exe# coding utf-8 #import os,sysimport urllib,re,httplibimport globimport chardet,string,redecode = ''logo = """*****************************************************************************                           Mp3 Downloader v1.0                            *    *                       download music form music.ustc.edu.cn              *    *   用法: 登陆http://music.ustc.edu.cn,找到想听的歌[专辑],点击“播放”,下载名**为'music@ustc.m3u'的文件,建议使用firefox *浏览网页,否则IE会自动调用媒体播**放器播放,无法下载m3u文件。把下载的m3u文件命名为"专辑名.m3u"的形式[专辑名 **不要有空格!]. 本程序会自动把这些歌曲下载到当前目录下的以专辑名的文件夹名 **字的文件夹下。可以有多个m3u共存,本程序会逐个下载,直到全部完成           **   Thank You for using! and Enjoy!                                        **                     By Yuanshl [yuanshl02_@_gmail.com]                     **                       Form CSLab of Lanzhou University  2007/10/26       *"""print logodef tripstring(s):    x = string.split(s)    out = ''    first = 1    for i in x:        out += i    #out = re.sub("'",'',out)    return outfor filex in glob.glob("*.m3u"):    dirName = filex[:-4]    f = open(filex,"r")      lines = f.readlines()     lineCount = len(lines)    os.system("mkdir %s"%dirName)    print "Downloading %s,Total %d songs"%(dirName,lineCount/2)    for line in range(lineCount/2):        decode = chardet.detect(lines[line*2])["encoding"]        if decode != None:            muName =lines[line*2][8:].decode(decode)        else:            muName =lines[line*2][8:].decode("gb2312")        #muName=tripstring(muName)        print muName        muUrl = lines[line*2 + 1]        muUrl = re.sub("\n",'',muUrl)        muPath = re.sub(r"http://music2.ustc.edu.cn:8088/",'',muUrl)[:-5]        print "Downloading Name = %s.mp3....." % muName[:-1]        urlopen = urllib.URLopener()        musicfile=urlopen.open("http://music2.ustc.edu.cn:8088" + "/" + muUrl)        data = musicfile.read()        musicfile.close()        filename=muName[:-1]        #decode = chardet.detect(filename)["encoding"]        #print decode        try:            #filename = unicode(filename, 'cp936')            musicfile=open("./%s/%s.mp3"%(dirName,filename.encode("gb2312")),'wb+')        except:            musicfile=open("./%s/%s.mp3"%(dirName,filename.encode("utf-8")),'wb+')         musicfile.write(data)        musicfile.close()        print "Downloaded Ok!"        musicfile.close()    f.close()    print "%d songs from %s downloaded Ok!"%(lineCount/2,dirName) print "All done! Enjoy!"
    程序的运行结果如下:
    1,登陆中科大网站

    2,运行程序:

    前面说到字符的编码,这是最重要的,因为我这个程序在80%的情况下工作没有问题,但是也有少数情况下导致解码失败的情况.一直搞不懂什么原因.
    最后不管你是否是一个程序员,如果你热爱音乐,喜欢到中科大听音乐又想下载的话,请给我邮件,我会在第一时间内把编译成exe的程序发给你,谢谢你的支持!

原创粉丝点击