几行代码教你轻松爬取网易云热歌榜

tech2025-08-27  11

前言:想听音乐又不想去搜索歌曲,面对那么多音乐却不知道听哪个,今天本博主教你用python爬虫,轻松爬取网易云热歌榜,一起来深究深究:

文章目录:

一.导包:二.获取网络状态:1.网络状态码:2.目标网址获取:3.获取头信息:4.进行代码访问: 三.解析网页:四.分析格式:五.获取ID:六.获取歌曲名字:七.下载并存储:1.外链:2.拼接链接:3.进行存储: 八.完整代码:

一.导包:

在进行数据爬取时,我们需要对网页进行分析,对网页内容需要进行解析,这时候我们需要几个必备的包:

requests:请求网页,接受网页数据etree:解析网页

导入格式如下:

import requests from lxml import etree

如果包没有下载,可以使用如下命令分别去下载这两个库(可以在DOS命令窗口输入以下命令来下载):

pip install requests pip install lxml

二.获取网络状态:

1.网络状态码:

一般网络状态有以下几种:

类型解释200(成功)服务器成功处理了请求。一般来说,这意味着服务器提供所请求的页面,如果您看到此状态,您的robots.txt文件,这意味着Googlebot的检索成功。301(永久移动)请求的网页已永久移动到新的位置,当服务器返回此响应(作为一个GET或HEAD请求的响应),它会自动转发请求到新的位置。你应该使用这个代码让Googlebot的知道一个网页或网站已永久移动到新位置。302(临时移动)服务器正在响应请求,从不同位置的网页,但请求者应继续使用原来的位置,为将来的请求。此代码是在这一个GET或HEAD请求的301相似,它会自动转发到不同的位置请求,但你不应该用它来告诉Googlebot的一个网页或网站已移动,因为Googlebot会继续抓取和索引原来的位置。400(错误请求)服务器不理解请求的语法。403(禁止)服务器拒绝请求。如果你看到在Googlebot尝试抓取您的网站的有效网页(你可以看到在网络上抓取页面在谷歌webmasters诊断下)收到此状态码时,它有可能是您的服务器或主机阻止Googlebot存取。404(未找到)服务器找不到请求的页面。例如,服务器返回此代码,如果请求是在服务器上的页面不存在。如果没有您网站上的robots.txt文件,并在webmasters“诊断”标签的robots.txt页上看到此状态,这是正确的状态。然而,如果你有一个robots.txt文件,你会看到这种状态,那么您的robots.txt文件可能被命名为不正确或在错误的位置。它应该是在顶级域,名为robots.txt的。如果你看到的网址,Googlebot尝试抓取(诊断“标签的HTTP错误”页上)此状态, 则表示Googlebot可能从另一页(可能是旧链接或输入有误)的无效链接。500(内部服务器错误)服务器遇到了一个错误,并不能满足要求。503(服务不可用)服务器目前无法使用(因为它是重载维修或向下),一般来说,这是一个临时的状态。

2.目标网址获取:

首先我们要获取的是热歌榜的歌曲,那么我们首先得知道这个网址: 那么网址为:https://music.163.com/#/discover/toplist?id=3778678,接下来我们来对这个网址进行尝试访问:

3.获取头信息:

一般在进行爬虫时,为了防止反爬机制,我们需要将我们伪装成浏览器身份去进行访问网页,那么怎么进行伪装呢?就是修改我们的访问身份:

进入网页后按F12;然后选择NetWork;按F5进行页面刷新;点击music.163.com;选择最底下的进行复制;

4.进行代码访问:

import requests from lxml import etree import os url='https://music.163.com/discover/toplist?id=3778678' head={ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36' } down_url='https://music.163.com/song/media/outer/url?id=' respone=requests.get(url,headers=head) print(respone)

下图所示结果就是访问正常了,下面我们来解析网页…

三.解析网页:

解析网页一般用到的是:

html=etree.HTML(respone.text)

四.分析格式:

在我们进行检查时,发现歌曲的主要信息在这里,那么格式我们可以这样写:

id_list=html.xpath('//a[contains(@href,"song?")]')

a标签中包含href中song?及以后的数据 获取到的信息如下: 是不是感觉很奇怪和想象的不太一样,那是我们获取到的地址,那么接下来我们进行进一步的提取:

五.获取ID:

for id in id_list: href=id.xpath('./@href')[0] print(href)

对获取到的地址进行遍历,取到其href中的值: 我们主要的是id后面的那串数字,那么这时候我们对其进行分割,取到我们想要的数据:

music_id=href.split('=')[1] print(music_id)

六.获取歌曲名字:

if "$" not in music_id: music_name=id.xpath('./text()')[0] print(music_name)

也许会有小伙伴比较疑问为什么要用if这个判断条件,原因如下: 这是因为在进行id获取时,有的id是没有的,字符串里包含$,如果我们不进行处理,那么就会如下错误:

索引错误,因为里面没有这些包含$的id,所以就会报错,名字获取到了那么我们来对歌曲进行下载并存储.

七.下载并存储:

1.外链:

每个歌曲都有自己的下载链接,那么我们采用这个链接并且配合我们获取到的id就可以进行下载啦:

down_url='https://music.163.com/song/media/outer/url?id='

2.拼接链接:

music_url=down_url + music_id music=requests.get(url=music_url,headers=head) print(music_url)

这样获取到的就是我们可以下载的链接了,运行结果:

3.进行存储:

if not os.path.exists(r'C:\Users\jcgg-99977\Desktop\music'): os.mkdir(r'C:\Users\jcgg-99977\Desktop\music') else: with open(r'C:\Users\jcgg-99977\Desktop\music/%s.mp3' % music_name, "wb") as f: print("正在下载歌曲 《%s》 ..." % music_name) f.write(music.content)

解释代码:

先查找文件夹,如果不存在则进行创建;创建之后打开文件夹,将获取到的文件以刚才获取到的名字进行命名,然后后缀名改为.mp3格式;以二进制形式进行写入数据文件;

八.完整代码:

import requests from lxml import etree import os #创建文件夹 url='https://music.163.com/discover/toplist?id=3778678' head={ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36' } down_url='https://music.163.com/song/media/outer/url?id=' respone=requests.get(url,headers=head) # print(respone) html=etree.HTML(respone.text) id_list=html.xpath('//a[contains(@href,"song?")]') # print(id_list) for id in id_list: href=id.xpath('./@href')[0] # print(href) music_id=href.split('=')[1] # print(music_id) if "$" not in music_id: music_name=id.xpath('./text()')[0] # print(music_name) music_url=down_url + music_id music=requests.get(url=music_url,headers=head) # print(music_url) if not os.path.exists(r'C:\Users\jcgg-99977\Desktop\music'): os.mkdir(r'C:\Users\jcgg-99977\Desktop\music') else: with open(r'C:\Users\jcgg-99977\Desktop\music/%s.mp3' % music_name, "wb") as f: print("正在下载歌曲 《%s》 ..." % music_name) f.write(music.content)

注解:由于本博主网速原因就不进行演示了,但是得注意一点:

r'C:\Users\jcgg-99977\Desktop\music/%s.mp3' r:防止位置中的有些字符被转义;这是我的桌面地址,如果复制粘贴肯定不行,得改成自己的用户名哦!

运行结果应该是这样的:



若有不足,请多多提出意见,虚心学习ing😃😃

最新回复(0)