鱼C论坛

 找回密码
 立即注册
查看: 36221|回复: 147

[技术交流] 爬取酷我音乐(含vip)

  [复制链接]
发表于 2020-3-11 14:14:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 学Python不开车 于 2020-3-16 11:27 编辑

爬取音乐 首先要分析网页,看看内容在Elements中,还是再Network中, 打开网页http://www.kuwo.cn/,以薛之谦为例,右上角搜索薛之谦
右键-检查 重新加载,查看Elements 发现里边基本上没有我们需要的内容,或者你可以用 print(requests.get(url,headers=headers).text)来查看网页内容。(headers 我们一会设置。)
然后我们去Network中的XHR寻找发现,共有六个内容(你可以挨个看一下,找找我们需要的歌名),我们需要这两个。 2.png
点击中间的红箭头所指的位置,打开后会发现如下图的内容,我们分别查看headers preview 和 response, 3.png
你可以打开里边的list 来查看 是否歌名都在里边我打开第一个如下图 8.png 我name是 演员,rid 是6468891 这个rid我们一会再说。
然后可以查看headers 里边有我们需要的 url  有我们需要的headers 这里就不上图了,大家自己去看下。
url=“Request URL: http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key=%E8%96%9B%E4%B9%8B%E8%B0%A6&pn=1&rn=30&reqId=0b4c2111-6355-11ea-9c16-ebf48b8aa196”
注意观察 key 后边有一串字符串,这个就是薛之谦的编码 你可以尝试下 http://www.kuwo.cn/search/list?key=%E8%96%9B%E4%B9%8B%E8%B0%A6http://www.kuwo.cn/search/list?key=薛之谦
打开的网址是否一样。也就是说 "薛之谦"=="%E8%96%9B%E4%B9%8B%E8%B0%A6".
pn 后边跟的是页数,如果你想切换到第二页下载 只需要把后面的数字改成2 就行。
为了方便我们输入,我们可以将url设置一下。
url ='http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={}&pn={}&rn=30&reqId=501ac930-62ca-11ea-9b0b-f3f6d4bed533'.format(singer,number)
那么singer和number也要设置一下singer = input('输入你需要的歌手:'),number = input("页数:")
如果页数大于一的话,就需要遍历 for i in range(1,int(number)+1)
然后得到response对象,由于是json类型所以 response = request.get(url,headers = headers ).json()
得到歌曲列表 找我们需要的 rid 和name , json类似一个字典 我们可以用字典的方法取出rid 和name  
我们先写一下这一部分的代码,
import requests
import json

# 该网站有反爬机制,要模拟浏览器来进行伪装。
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
    'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
    'csrf': 'RUJ53PGJ4ZD',
    'Cookie': 'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1577029678,1577034191,1577034210,1577076651; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1577080777; kw_token=RUJ53PGJ4ZD'
}
# 该函数来存放该执行的代码块
def main():
    # 歌手的名字
    singer = str(input('请输入要下载歌手:'))
    # 歌曲的页数
    number = int(input('请输入要下载的页数:'))
    for i in range(1, number + 1):
        url = "http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={}&pn={}&rn=30&reqId=615ae920-2d21-11ea-b560-73e04c9f8018".format(singer, i)
        response = requests.get(url, headers=headers)
        html = response.text
        result = json.loads(html)
        data = result['data']['list']
        for i in data:
            rid = i['rid']
            name = i['name']
            print(rid)
            print(name)
            #get_music(rid,name)  #下一个函数要调用
main()
这个只是分析了薛之谦的歌曲的页面,得到歌曲name 和 rid 并没有得到歌曲的链接。那我们分析的意义是什么?
请往下看接下来获取歌曲的链接。
4.png 这里的requests url 就是我们需要的url.歌曲的下载地址就藏在里面。
首先看headers,Request URL: http://www.kuwo.cn/url?format=mp3&rid=6468891&response=url&type=convert_url3&br=128kmp3&from=web&t=1583902750128&reqId=0b4e9211-6355-11ea-9c16-ebf48b8aa196 可以发现rid后边跟的一串数字 刚好是 我们刚刚分析出来的rid的内容,也就是说 不同的rid 对应的就是不同的歌曲。我们只要将rid写进去就可以找到不同歌曲的网址了。
但是这个不是我们最终的歌曲网址,我们一样要解析他,找到歌曲的网址。我们接下来看 preview或response,里边有一个url,
{"code": 200, "msg": "success", "url": "https://win-web-rf01-sycdn.kuwo.cn/bd2fd290177547bca080688447675c16/5e68701d/resource/n3/55/26/3051054552.mp3"}
将这个url复制粘贴到浏览器地址栏是不是发现就可以下载了。   接下来就和第一步一样了  
url =“http://www.kuwo.cn/url?format=mp3&rid=6468891&response=url&type=convert_url3&br=128kmp3&from=web&t=1583902750128&reqId=0b4e9211-6355-11ea-9c16-ebf48b8aa196”
result = request.get(url,headers = headers).json()
从json中提取url music_url = result["url"] 下载
with open()as f:
由于图片是二进制形式 所以要.content 代码如下
def get_music(rid,name):
    url = "http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3&br=128kmp3&from=web&t=1583852657788&reqId=69f212d1-62e0-11ea-ad5e-575e6d12088e".format(rid)
    relut = requests.get(url,headers = headers).json()
    music_url = relut["url"]
    print(music_url)
    #这里的"D:/妹子图/{}.mp3".format(name),是文件夹的名字,和MP3的名字, 意思是将下载的MP3文件放入
    #D:/妹子图中间 ,如果你的电脑没有这个目录的话 可以自己创建一个目录,注意一定要先创建一个目录,名字自定义就行。
    with open ("D:/妹子图/{}.mp3".format(name),"wb")as f:
        music = requests.get(music_url).content
        f.write(music)
        print("下载完毕")
还有一些图片,可以帮助大家理解,就不多做解释了,有问题请留言,大家一起进步。
5.png 6.png 7.png
完整代码如下:
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 7荣誉 +11 鱼币 +10 贡献 +5 收起 理由
青松100 + 1 + 1 鱼C有你更精彩^_^
snowfox + 1 + 1 鱼C有你更精彩^_^
青出于蓝 + 1 这个必须赞一个
小宝不哭不哭 + 5
wuqramy + 1 + 1 学到了不少东西,希望能多些作品!赞一个!.
白昼 + 1 + 3 + 2 感谢楼主无私奉献!
不二如是 + 2 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-11 14:31:41 | 显示全部楼层
不明觉厉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-11 23:35:36 | 显示全部楼层
66
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-12 01:35:05 | 显示全部楼层
嗯 技术流的东西 就是不一样啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 07:10:07 | 显示全部楼层
使用cookie是为了实现登陆酷我吗?cookie的内容又是在哪儿获取到的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 08:11:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-12 11:04:04 | 显示全部楼层
老忘 发表于 2020-3-12 07:10
使用cookie是为了实现登陆酷我吗?cookie的内容又是在哪儿获取到的呢?


如果不用cookie的话会报错Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\酷我音乐.py", line 47, in <module>
    main()
  File "C:\Users\Administrator\Desktop\酷我音乐.py", line 41, in main
    data = result['data']['list']
KeyError: 'data'
找不到我要找的数据,我觉得原因是服务器是无状态的,我不是在一个页面直接下载歌曲,所以,如果不将cookie存起来,他会认为我两次的请求不相关,导致我请求失败。 只是个人认为,可能不太合适,你可以自己再搜搜。
Cookie在 文中第二张图 Headers-Request Headers -Cookie里边
或者最后一张图 里边也标记的有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-15 21:12:14 | 显示全部楼层
6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 08:33:13 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 10:57:52 | 显示全部楼层
学习学习,,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 14:58:19 | 显示全部楼层
支持一波
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 15:46:36 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 16:15:21 | 显示全部楼层
虽然我还不太懂 但我得留住
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 16:25:15 | 显示全部楼层
lyh616561063 发表于 2020-3-17 16:15
虽然我还不太懂 但我得留住

如果有哪一步遇到问题可以问我,共同学习 我也可以巩固知识
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 17:13:59 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 18:36:27 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 07:45:01 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 08:52:26 | 显示全部楼层
没提VIP部分啊……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 13:13:11 From FishC Mobile | 显示全部楼层
看了很多爬取歌曲的,但是没见过讲的这么详细的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-18 16:39:23 | 显示全部楼层
TCY 发表于 2020-3-18 08:52
没提VIP部分啊……

周杰伦是不是只有vip才能下载? 你可以搜个周杰伦,这个是网页的整体规则,即使vip也用的是这个规则,只是你在vip页面没法分析,所以我们以非vip页面来分析,然后直接获取vip的歌曲,是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 10:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表