批量下载音乐

soso,我被你打败了…

一直想弄个eason全集来着的,上次用gmbox在谷歌music下了100多首,一听发现不行啊,有的都是rock版的那种,还有很多现场的,质量太差了,不过mp3里都有音乐元信息,就这点好。后来到soso上查了下居然有1000+首,eason还真是多产啊。再看了一下,多的是重复的,于是还是决定写个脚本,一次先只下一张专辑,然后手动弄一个专辑列表让它慢慢下去。

开始都比较顺利,分析专辑页面的源代码啊,写个正则匹配一下。先找到显示歌曲信息的tr,提取里面的歌曲名等内容,再写个封装一下,post到服务器,这样得到歌曲下载那个页面。本来以为再在里面匹配一下第一个地址就ok了的,结果发现不是这么easy的事情。匹配出来所有的都是链接加载中…,再一看,居然是后来通过ajax load的json信息。其实早该发现了的,在Fiddler里点击一次下载明显有两个200的response,第一个是大体结构,第二个才是链接等数据。我在这里也走了弯路,没有直接去分析第二个request的地址,而是在它页面里茫茫多的js中开始debug。虽然FireBug的确好用,但面对这种情况还是比较乏力,下了断点后刷新页面,断点和没有一样,激活在下一条js语句处中断的话,那就是从第一条一直开始debug,断点也没有用。

到这里又犯晕了,准备直接看代码,每次调用一个函数就复制出来,再恢复格式,话说这里我觉得vim肯定能自动完成的,但我实在不知道怎么替换能够让;后面多一个换行,^M, \r, \n, \r\n全都不行,我真是晕死了,只有手动调,痛苦啊,在复制了n多函数后(这里其实好些都不用看直接跳过的,找到GET 数据的url就好了,但我就 不信邪,巴不得每个函数都弄清楚,= =真是脱线啊),终于找到,ok,马上构造请求,传回来的数据一看,又sb了,怎么就没有第一个url呢!

还好这次处理json的基本只用到了一个js函数,我全都复制到FireBug 的Console里,因为不能加断点,于是就一行一行地alert出来看。终于….被我找出来了,当场我就吐血了。居然就是把stream后的数字加10,再把文件名加18000000,最后换后缀 .mp3!!!唉。早知道这样的话就自己去总结规律了,不过工科男好像都比较喜欢刨根问底,希望全部搞清楚= =。

我想着,这下子总ok了吧,下载文件的话之前准备wget,先找一个test一下,失败,居然是403。shit,估计是cookie的问题,于是去网上google 了一下,一般都是用 –load-cookies,但是我从 ie 导出的 cookies 都不能用,自己写模板往里面填内容也不行,最后还是在 wget manual 里发现有一个 –no-cookies –header “Cookie: ….” ,换了这种方式来,行是行了,不过实在是太不优雅了,但也找不到什么别的方法了。

把这个弄好后又觉得 wget 是单线程下载,一次下一个文件,估计等死了,于是想自己写一个一次下一盘专辑的,应该会快一些。写好后发现下下来的文件全是0,很奇怪,每次 read(1024) 出来的全是0,在网上看看别人的代码也都是这样啊,不知道到底是哪里出了问题,最后暴力了一些,直接 read() 读所有的一次写入,现在又好了= =真是好囧的问题。

update: 最终下载文件这块还是出错了,写的是一盘专辑每首歌开一个线程下,但是,我的多线程果然是超弱啊,直接用 threading.Thread( target = …, args = …),做的,最后再run() 一下,完全没有任何控制,于是,到了下一盘专辑的时候上一盘的还没有下完,又新开线种,最后又是10061 socket错误再加上非常不稳定,还是决定用 wget吧,把所有的地址写入一个文件,再 wget -i file ,最后挂了10H,终于弄完了一大部分,还有三盘专辑出错。还有文件的重命名啊,整理 mp3 里的信息,不过都是小问题了。

发表评论?

4 条评论。

  1. 我有他全集。。APE转的MP3

  2. = =以前的全集现在也不全了吧,并且自己弄的很有成就感,你那多少首,大概加起来是300首左右

  3. 可能20来张专辑吧,忘记了。全还是全的,不过我自己没怎么听过

  4. 学习了,希望继续看到这类的文章!

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>