python爬取周杰伦200首隐藏歌曲

python爬取周杰伦200首隐藏歌曲

获取歌单文件:

经过检查我们发现歌曲并不在网页源码中,既然不是媒体文件,自然只会是在XHR中,我们去找找看,首先F12(开发者工具)-点击Network(网络)-XHR

可以看到一共有17个XHR(Fetch)文件,我们需在这些文件中找到藏有歌曲的文件

笨方法当然是一个一个试,我们还是用聪明的方法,阅读它们的名字,比如你一眼就看到了client_search(客户端搜索),再点一下size(文件大小),发现client_search最大如上图。

获取client_search文件请求:

点击上图的client_search文件,可以看到4个预览窗口,我们只需要Preview(预览)中的信息,歌曲就在这里面隐藏,不过这需要跟(洋葱)一样一层层剥开!

依次点击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',
        '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,为歌曲名
        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环境)!

分享到 :
相关推荐

Python把网页信息写入Excel

说明:把文件写入Excel是非常有用的,高效的处理数据!若你还不知道如何爬取网页信息...

随手存盒RN下载V1.0.3-接受存储QQ、微信文件

相信很多小伙伴都遇到过接收的文件,转头就不知道存在哪个文件夹下的尴尬。尤其是手机QQ...

python微信随机发送表情包-催债利器

这一版我升级了随机表情包,不那么单调,升级了随机秒数防止微信屏蔽图片原版:女朋友生气...

python最全教程-价值千元

学习Python有什么好的呐?好处简直太多了!它上手简单,回报巨大。它具有丰富的we...

网易云课堂-零基础:21天搞定Python分布式爬虫

课程介绍:本课程完全从零基础出发,只要你有一点Python基础就可以听懂本课程!课程...

零基础Python开发教程

这是一套为零基编程学习者撰写的Python入门教程。从初学者的角度出发,通过能和小白...