在第一篇里记录了获取虾米热门歌曲,听了一段时间后,加心了很多歌曲,因此想要批量下载加心过的虾米收藏夹歌曲。
虾米好评歌曲页只保存最近的2000首。。之前star过的3k首歌有1k首都不在了。所以起了备份的念头。
首先获取虾米个人加心歌曲的地址
虾米的个人好评歌曲页在 http://www.xiami.com/space/lib-song/u/241400/page/1 ,把241400换成自己的id就可以。
歌曲所在网页
得到歌曲的MP3地址
假设歌曲所在网页地址为 http://www.xiami.com/song/1768993653,虾米播放器会请求 http://www.xiami.com/widget/xml-single/uid/0/sid/1768993653 页,里面有个Location存放MP3地址。
location用凯撒阵列加密,实际上这串字符加几个回车后变成这样
7表示有7行,从左到右竖着看。连起来是 http%3A%2F%2Ff1.xiami.net%2F33821%2F337%5E31%2F%5E5%252%5E1768993653_6%5E6876.mp3
经过urldecode后变成 http://f1.xiami.net/33821/337^31/^5%2^1768993653_6^6876.mp3
把^变成0,就是 http://f1.xiami.net/33821/337031/05%201768993653_606876.mp3
location转MP3的代码如下
def str2url(s):
import urllib2
#s = '9hFaF2FF%_Et%m4F4%538t2i%795E%3pF.265E85.%fnF9742Em33e162_36pA.t6661983%x%6%%74%2i2%22735'
num_loc = s.find('h')
rows = int(s[0:num_loc])
strlen = len(s) - num_loc
cols = strlen/rows
right_rows = strlen % rows
new_s = s[num_loc:]
output = ''
for i in xrange(len(new_s)):
x = i % rows
y = i / rows
p = 0
if x <= right_rows:
p = x * (cols + 1) + y
else:
p = right_rows * (cols + 1) + (x - right_rows) * cols + y
output += new_s[p]
return urllib2.unquote(output).replace('^', '0')
下载
得到MP3地址后用qq旋风和迅雷好像都没速度
用wget可能会快点,建议设个ua。。
wget -i urls.txt --user-agent="Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1"
就是音质寒碜了点。2k个文件才5G多一点。。
PS.. 用这个和wget写了个一键下虾米加心歌曲,album,artist的东西。。很丑陋,就不放上来了