PYTHON示例

本文介绍了一个使用Python3.9和PyCharm2017爬取并下载网易云音乐的实践过程。首先,通过requests库获取网页源代码,然后利用正则表达式解析HTML,提取歌曲ID和名称。将数据存储为字典,接着下载音乐文件,保存到本地music文件夹。整个代码约30行,适合初学者练习。
摘要由CSDN通过智能技术生成

学习目标:

闲来无事,想着用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('--------------总的下载完成---------------------------------')


学习产出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值