获取歌单文件:
经过检查我们发现歌曲并不在网页源码中,既然不是媒体文件,自然只会是在XHR中,我们去找找看,首先F12(开发者工具)-点击Network(网络)-XHR
步骤:Network-XHR
可以看到一共有17个XHR(Fetch)文件,我们需在这些文件中找到藏有歌曲的文件
笨方法当然是一个一个试,我们还是用聪明的方法,阅读它们的名字,比如你一眼就看到了client_search(客户端搜索),再点一下size(文件大小),发现client_search最大如上图。
获取client_search文件请求:
步骤: 依次点击client_search— Preview
点击上图的client_search文件,可以看到4个预览窗口,我们只需要Preview(预览)中的信息,歌曲就在这里面隐藏,不过这需要跟(洋葱)一样一层层剥开!
步骤:依次点击data-song-list-0
依次点击data-song-list-0最后展开的信息就是我们需要的。
想找到此内容的链接,请直接双击client_search。
借用我老师(吴风)的一句话:歌曲名就在这里,它的键是name。理解这句话:这个XHR是一个字典,键data对应的值也是一个字典;在该字典里,键song对应的值也是一个字典;在该字典里,键list对应的值是一个列表;在该列表里,一共有20个元素;每一个元素都是一个字典;在每个字典里,键name的值,对应的是歌曲名。
可以撸代码了,注意:如何获取数据请看上图的嵌套(都是一层一层的很直观),不看将面对(下图)绝望
绝望
导入库:
import requests
#引用requests库
#安装命令
打开cmd复制上去
pip install requests #requests库安装命令
找到隐藏的歌曲:
import requests
#引用requests库
for x in range(20):#此循环数值请不要改太大,会对服务器造成压力
params = {
'ct': '24',
'qqmusic_ver': '1298',
'new_json': '1',
'remoteplace': 'sizer.yqq.song_next',
'searchid': '64405487069162918',
't': '0',
'aggr': '1',
'cr': '1',
'catZhida': '1',
'lossless': '0',
'flag_qc': '0',
'p': str(x+1),#修改参数p的内容,使其每次运行加1
'n': '20',
'w': '周杰伦',
'g_tk': '5381',
'loginUin': '0',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'utf-8',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0'
}
#这些都是下面url?号后面的参数,通过params传递过去
r_music=requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?',params=params)
#调用get获取音乐字典
因为qq音乐只显示10首歌曲,但是这对我们来说不是难事
因为想找到下一页的内容,修改参数【p】的内容就行了,请看上方代码
具体可以看Headers—Query String Parameters(字符串参数)—P(查看p参数的值)
import requests
#引用requests库
for x in range(20):#此循环数值请不要改太大,会对服务器造成压力
params = {
'ct': '24',
'qqmusic_ver': '1298',
'new_json': '1',
'remoteplace': 'sizer.yqq.song_next',
'searchid': '64405487069162918',
't': '0',
'aggr': '1',
'cr': '1',
'catZhida': '1',
'lossless': '0',
'flag_qc': '0',
'p': str(x+1),
'n': '20',
'w': '周杰伦',
'g_tk': '5381',
'loginUin': '0',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'utf-8',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0'
}
#这些都是下面url?号后面的参数,通过params传递过去
r_music=requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?',params=params)
#调用get获取音乐字典
j_music=r_music.json()
获取列表字典:
import requests
#引用requests库
for x in range(20):#此循环数值请不要改太大,会对服务器造成压力
params = {
'ct': '24',
'qqmusic_ver': '1298',
'new_json': '1',
'remoteplace': 'sizer.yqq.song_next',
'searchid': '64405487069162918',
't': '0',
'aggr': '1',
'cr': '1',
'catZhida': '1',
'lossless': '0',
'flag_qc': '0',
'p': str(x+1),
'n': '20',
'w': '周杰伦',
'g_tk': '5381',
'loginUin': '0',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'utf-8',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0'
}
#这些都是下面url?号后面的参数,通过params传递过去
r_music=requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?',params=params)
#调用get获取音乐字典
j_music=r_music.json()
#用json方法将response对象转换为列表/字典
o_music=j_music['data']['song']['list']
#跟剥洋葱似的,一层一层获取列表/字典
写一个循环获取-歌曲名:
import requests
#引用requests库
for x in range(20):#此循环数值请不要改太大,会对服务器造成压力
params = {
'ct': '24',
'qqmusic_ver': '1298',
'new_json': '1',
'remoteplace': 'sizer.yqq.song_next',
'searchid': '64405487069162918',
't': '0',
'aggr': '1',
'cr': '1',
'catZhida': '1',
'lossless': '0',
'flag_qc': '0',
'p': str(x+1),
'n': '20',
'w': '周杰伦',
'g_tk': '5381',
'loginUin': '0',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'utf-8',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0'
}
#这些都是下面url?号后面的参数,通过params传递过去
r_music=requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?',params=params)
#调用get获取音乐字典
j_music=r_music.json()
#用json方法将response对象转换为列表/字典
o_music=j_music['data']['song']['list']
#跟剥洋葱似的,一层一层获取列表/字典
for i in o_music:
#把o_music放进i遍历循环,o_music有多少数据i就循环多少次
print(i['name'])
#打印i包含的name,为歌曲名
既然已经会获取歌曲名,相信别的数据对你来说也不是难事,(当成洋葱)一层层剥开就行!
完整代码-注意注释:
import requests
# 引用requests库
for x in range(20): # 此循环数值请不要改太大,会对服务器造成压力
params = {
'ct': '24',
'qqmusic_ver': '1298',
'new_json': '1',
'remoteplace': 'sizer.yqq.song_next',
'searchid': '64405487069162918',
't': '0',
'aggro': '1',
'cr': '1',
'catZhida': '1',
'lossless': '0',
'flag_qc': '0',
'p': str(x + 1),
'n': '20',
'w': '周杰伦',
'g_tk': '5381',
'loginUin': '0',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'utf-8',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0'
}
# 这些都是下面url?号后面的参数,通过params传递过去
r_music = requests.get(
'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?', params=params)
# 调用get获取音乐字典
j_music = r_music.json()
# 用json方法将response对象转换为列表/字典
o_music = j_music['data']['song']['list']
# 跟剥洋葱似的,一层一层获取列表/字典
for i in o_music:
# 把o_music放进i遍历循环,o_music有多少数据i就循环多少次
print(i['name'])
# 打印i包含的name,为歌曲名
print('专辑:' + i['album']['name'])
# 打印i包含的album,album包含的name
print('歌曲链接:' + 'https://y.qq.com/n/yqq/song/' + i['mid'] + '.html')
# 打印https://y.qq.com/n/yqq/song/+mid+.html,就是歌曲的链接
print('歌曲时长:' + str(i['interval']) + 's' + '\n')
# 打印i包含的interval就是歌曲时长,单位s
循环数值range(20)请不要改太大,会对服务器造成压力
啥你问我如何使用:我根本不会告诉你,复制完整代码到IDM运行(需本地有python环境)!