在网页版的虾米音乐播放器,如何下载音乐。
本次爬虫使用的语言是python3,模块是requests。笔者只是简单的示例,程序中还有许多需要改进的地方。
1、虾米音乐的播放器地址:http://www.xiami.com/play?ids=/song/playlist/id/1774747126#loaded
2、浏览器(笔者使用的是360极速浏览器),右键——审查元素,打开开发者工具。进入network中的XHR,网页歌曲信息是动态加载的。记得要重新刷新网页,才会出现左侧的文件。找到如下图的文件。这个不是标准的json文件。把Response中的代码,复制出来,进行观察,会发现把json378()去掉之后,就是一个标准的json文件。笔者没有用代码处理这一步。
3、具体思路是:大家可以用requests访问以下网页:
import urllib
import os
import requests #下载虾米音乐 dream it possible 下载地址在json文件location
split_char=['h','t','t','p','%','3','A','%','2','F','%','2','F','m'] #分割字符标志
#location
raw_url='8h28n2325%%5_Fy955f6df3tF.e%%FE258la%2EEba5%t%xt2521FE8.u34--4c85p2i%FE19143mtD4%4cd5E%Fa268%2796ph1%58f%6%3mmF31517533_55E13575A1i842E2464%k1E-edEeE%2.15%%87_43e1%%96836'
max_num=len(raw_url)//int(raw_url[0])+1 #max_num=22 计算一行可以包含多少个字符
new_url=raw_url[1:] #去掉行数8
name=[] #创建8个list
for k in range(1,int(raw_url[0])+1):
name.append('string_%d' % k)
#分割字符串
j=1
for i in range(int(raw_url[0])):
count=0
name[j-1]=[]
position_1=new_url.find(split_char[i])
position_2=new_url.find(split_char[j])
if position_1==position_2:
position_2=new_url.find(split_char[j],position_1+1,max_num)
if position_2-position_1>=max_num-1:
name[j-1].append(new_url[count:position_2])
new_url=new_url.replace(new_url[count:position_2],'')
else:
position_3=new_url.find(split_char[j],position_2+1,max_num)
if position_3-position_1>=max_num-1:
name[j-1].append(new_url[count:position_3])
new_url=new_url.replace(new_url[count:position_3],'')
else:
position_4=new_url.find(split_char[j],position_3+1,max_num)
if position_4-position_1>=max_num-1:
name[j-1].append(new_url[count:position_4])
new_url=new_url.replace(new_url[count:position_4],'')
j+=1
if j==int(raw_url[0])+1:
name[j-2]=[]
name[j-2].append(new_url)
print(name)
#补齐,保证每一个list长度都一样,方便使用zip函数
for i in range(len(name)):
if len(name[i][0]) < max_num:
name[i][0]=name[i][0]+'*'*(max_num-len(name[i][0]))
mix_url=''
for a,b,c,d,e,f,g,h in zip(name[0][0],name[1][0],name[2][0],name[3][0],name[4][0],name[5][0],name[6][0],name[7][0]):
mix_url+=a+b+c+d+e+f+g+h
mix_url=mix_url.replace('*','') #去掉自己添加的‘*’号
mix_url=urllib.parse.unquote(mix_url).replace('^','0') #把'^','0'变为0字符
file_name=mix_url.split('/')[-1].split('?')[0] #mp3文件名
if not os.path.exists('D:\\xiami_music'): #保存音乐的文件夹
os.makedirs('D:\\xiami_music')
os.chdir('D:\\xiami_music')
req=requests.get(mix_url)
with open('D:\\xiami_music\\'+file_name,'wb') as file: #下载文件
file.write(req.content)
print('download ok')