学习目标:
闲来无事,想着用python获取音乐并下载,代码一共30几行吧。python3.9,pycharm2017
学习内容:
首先导入所需要的包:
import requests
import re
url就是某云的url。直接百度即可,很容易得到。然后爬取源代码。但是有个页面源代码和框架源代码(鼠标右击即可看见),我们所要的数据全都在框架源代码里面,所以别弄错了。
url:
注意页面源代码和框架源代码的url的区别!!!我们要的是框架源代码。
获取目标url:
url=xxx
然后发起请求,获得响应
resp=requests.get(url)
print(resp.text)#可以将其输出,然后在控制台里面可以ctrl+f,然后输入歌曲名,确认所需要的 信息是否在resp.text里面
然后利用正则表达式来提取信息,这里本来是想用xpath的,但我试了很久,用xpath一直提取不出来,所以只能用re了,虽然麻烦了点,但还是获取到了数据。
obj0=re.compile(r'歌曲列表</span>.*?<ul class="f-hide">(?P<li>.*?)</ul>',re.S) obj1=re.compile(r'<li><a href="(?P<id>.*?)">(?P<name>.*?)</a></li>',re.S) result=obj0.finditer(resp.text)
这里obj0起到了一个缩小范围的作用,将我所需要的信息从大的resp.text里面分离出来,然后在用obj1从result里面提取到我所需要的具体的信息,如下:
dict_song={} for i in result: li=i.group('li') res=obj1.finditer(li) print('---------------------------') for m in res: dict_song[m.group('id')]=m.group('name')
这里我将歌曲id和歌曲名做成了一个字典,方便后续使用,下面就开始下载,这里需要用到外部链接获取音乐资源,常用的链接在网上可以找到,找不到的可以联系我。
下载代码:
for a in dict_song.keys(): mu_url='https://link.hhtjim.com/163/'+a.replace('/song?id=','')+'.mp3' #print(mu_url) music=requests.get(mu_url).content print('正在下载:{}'.format(dict_song[a])) with open('./music/'+dict_song[a]+'.mp3','wb') as f: f.write(music) print('-----------------------{}下载完成-----------------------'.format(dict_song[a])) print('--------------总的下载完成---------------------------------')
这里要提前在当前目录下创建一个music的文件夹,不然会报错,当然也可以使用os命令来判断并且自动生成文件夹,这里为了避免麻烦就自己创建了。然后就可以运行了:
现在将完整代码放在这里,纯属无聊练手,后面还可以写成面向对象,增加拓展性,欢迎探讨交流!
import requests
import re
url="https://music.163.com/discover/toplist?id=3778678"
resp=requests.get(url)
obj0=re.compile(r'歌曲列表</span>.*?<ul class="f-hide">(?P<li>.*?)</ul>',re.S)
obj1=re.compile(r'<li><a href="(?P<id>.*?)">(?P<name>.*?)</a></li>',re.S)
result=obj0.finditer(resp.text)
li_list=[]
dict_song={}
for i in result:
li=i.group('li')
res=obj1.finditer(li)
print('---------------------------')
for m in res:
dict_song[m.group('id')]=m.group('name')
for a in dict_song.keys():
mu_url='https://link.hhtjim.com/163/'+a.replace('/song?id=','')+'.mp3'
#print(mu_url)
music=requests.get(mu_url).content
print('正在下载:{}'.format(dict_song[a]))
with open('./music/'+dict_song[a]+'.mp3','wb') as f:
f.write(music)
print('-----------------------{}下载完成-----------------------'.format(dict_song[a]))
print('--------------总的下载完成---------------------------------')
学习产出:
无