马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 学Python不开车 于 2020-3-16 11:27 编辑
爬取音乐 首先要分析网页,看看内容在Elements中,还是再Network中, 打开网页http://www.kuwo.cn/,以薛之谦为例,右上角搜索薛之谦
右键-检查 重新加载,查看Elements 发现里边基本上没有我们需要的内容,或者你可以用 print(requests.get(url,headers=headers).text)来查看网页内容。(headers 我们一会设置。)
然后我们去Network中的XHR寻找发现,共有六个内容(你可以挨个看一下,找找我们需要的歌名),我们需要这两个。
点击中间的红箭头所指的位置,打开后会发现如下图的内容,我们分别查看headers preview 和 response,
你可以打开里边的list 来查看 是否歌名都在里边我打开第一个如下图
我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%A6和http://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 并没有得到歌曲的链接。那我们分析的意义是什么?
请往下看接下来获取歌曲的链接。
这里的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("下载完毕")
还有一些图片,可以帮助大家理解,就不多做解释了,有问题请留言,大家一起进步。
完整代码如下:
|