【爬虫入门】爬取音乐排行榜

先看结果

44b5e341785041568812f1cec021fee5.png

导入模块

import requests
from bs4 import BeautifulSoup

其中request模块用来获取网页的html数据,BeautifulSoup用于解析获取到的html数据

获取html数据

我们通常用request.get("网址")的方法来获得一个网站的html数据,但是由于许多网站的反爬机制,我们可以把自己伪装成一个浏览器,具体操作如下:

打开要爬网站的开发者工具

a748c699b952413aa13fbdfe54a35a70.png

以这次的网站音乐排行榜为例,我们在进入该网站之后按键盘上的F12就可以进入开发者工具

a23fd5061f99437782f4c874fbba8120.png

 打开“网络”界面

edge浏览器操作如下

7596ee3bc36f49fe8629790269ff84b6.png

 其余浏览器打开“Network”

6994763d3db346a1a46c470ee3f5ebc4.png

 刷新网站

F5刷新

获取User-Agent

在左栏选中第一个,然后右侧窗口拉到底就复制得到浏览器的User-Agent

a2cbf9d3dd6b4892b5833d30316159d1.png

 传入headers参数

headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183"
    }

新建一个字典headers然后把刚刚复制的内容作为值存放到里面,相应键的名称为“User-Agent”

response = requests.get("https://y.qq.com/n/ryqq/toplist/26",headers = headers)

然后我们在括号内添加上headers=headers

print(response.text)

text的形式把response打印出来,可以判断是否成功获取到

0a9bba2ac7e44c85ac0c2db738531b3b.png

如果打印出了一大串这样的东西说明成功获取到 html数据了!

解析html数据

html = response.text
soup = BeautifulSoup(html,"html.parser")
info = []

首先我们将得到的内容作为字符串存放到html这个变量中

然后把这个内容传入BeautifulSoup的构造函数里,并添加上解析器"html.parser",然后把这个对象赋值为soup

列表info用于存储之后解析出的数据

获取所有歌手名

点击开发者工具页面左上角这个图标可以开启“指哪打哪”e96c00a221b4486190884a5b0f71ce3d.png

 将鼠标放到网页上相应的元素上就能在开发者工具页面显示相应的html代码

我们把鼠标放在任意一个歌手名上会看到窗口展示了这样的代码

43924c76fe9b4c15885517012b589db7.png

在观察每一个含歌手名的代码后,会发现所有的歌手名都包含在了<div>标签内,但是<div>标签有很多,为了不把不相干的信息提取出来,我们可以再去寻找这些代码的共同特点,发现他们都含有class="playlist__author",于是我们可以这样写代码

all_names = soup.findAll("div",attrs={"class":"songlist__artist"})#提取全部含有歌手名的元素

 用findAll函数找到相应的元素,第一个参数传入“div”表示找到所有<div>标签,然后传入可选参数attrs赋值为一个字典,键值对用来存放想找的属性和值。也就是class属性所有含songlist__artist的元素。然后把整个赋值给all_names,他是一个可迭代对象。

for names in all_names:
    print(names)

循环打印即可得到下面内容

1897c9b323de4220a44e5ebe3a88f823.png

 可以看到所有包含歌手名的元素被打印了出来,但是我们只想要歌手名,不要其他字符

for names in all_names:#往info添加歌手名信息
    name_link = names.find("a")
    info.append([name_link.string])

在循环里,通过find()函数我们找到全部的<a>标签,然后赋值给name_link此时的name_link应该是如下内容7cad93af8ea64450b5a0d5eac061e4e4.png

 这时我们用name_link.string就能直接读取到我们想要的内容了,然后存入info

但是!通过观察发现,既然歌手名都包含在了<a>标签内那么为什么不直接查找<a>标签呢?

其实是可行的。

all_names = soup.findAll("a",attrs={"class":"playlist__author"})#提取全部含有歌手名的元素
for names in all_names:#往info添加歌手名信息
    name_link = names.get("title")

修改findAll里的参数,我们直接获取到了全部的a标签,然后再在循环中用get函数即可直接获取到全部的歌手名。

处理多个歌手的情况

从以上的两个获取歌手名的方式我们了解到了findAll函数可以获取到对应的标签,而get函数可以进一步获取到标签内的特定信息。通过我们对html数据的观察可以发现,一首歌如果有多个歌手,那么这几个歌手将会被保存在同一个<div class="songlist__artist">标签内,所以综合上面的两种方法,我们先查找全部的<div>标签,然后再到里面拿到<a>标签下的“title”,最后存入到一个列表中就可以实现把同一首歌的多个歌手放在一起了。代码如下:

all_names = soup.findAll("div",attrs={"class":"songlist__artist"})#提取全部含有歌手名的元素
for names in all_names:#往info添加歌手名信息
    name_link = names.findAll("a")#找到同一首歌里的全部歌手
    info.append([[i.get("title") for i in name_link]])#将同一首歌的歌手放在同一个列表中再将他们放入info中

获取所有歌名和专辑名

方法与上面类似,我们对所有歌名和专辑名进行分析

91c72b357b6345e8b748450b314b806c.png

 发现他们都存在<span>标签内,而且class属性都为songlist__songname__txt

于是我们可以写出下面的代码

all_songs = soup.findAll("span",attrs={"class":"songlist__songname_txt"})

然后把获取的内容存到info里

idx = 0#记录当前遍历到列表的索引号
for songs in all_songs:#往info添加歌名以及专辑名信息
    song_link = songs.findAll("a")
    for t in song_link: 
        info[idx].append(t["title"])
    idx += 1

在这次获取时,我用了一个不一样的办法,因为在拿到<a>标签里的内容后仍然存在很多我们不想要的信息

e0aa17c600b44a8093b8476c78e84c2a.png

 但观察后发现所有歌名和专辑名前面都有"title=",所以我们可以使用列表推导式从每个<a>标签中提取title属性,并将结果存储在列表info中。

到这里为止我们已经解析到了全部的内容

为代码增加实用性

由于提供的榜单有很多,但是这个代码只能获取到其中的一种榜单,实用性不高

我们点开不同的榜单观察他们的url

6c88c128cbb44640a6b59b56df0f656b.png

d31f40d79cf84739a1d7961dbc7264eb.png

c8885a0929e847178dcfa51cb164eb2e.png

 每个榜单的URL有区别的地方只在于最后的数字所以可以对之前获取html数据的代码进行修改

response = requests.get(f"https://y.qq.com/n/ryqq/toplist/{num}",headers = headers)

新创建一个变量num用于存放数字,然后用f字符串把他放在URL的最后代替掉固定的数字

然后我们把允许用户查询的榜单和对应的URL最后的数字存放在字典top中,然后写一些便于用户输入的代码以及最终输出榜单内容的代码,就完成了!

附上源码:

import requests
from bs4 import BeautifulSoup
top = {62:"飙升榜",26:"热歌榜",27:"新歌榜",4:"流行指数榜",5:"内地榜",3:"欧美榜",16:"韩国榜",17:"日本榜",105:"日本公信榜",28:"网络歌曲榜",
     63:"DJ舞曲榜",60:"抖音快手榜",128:"YouTube榜",57:"电音榜",65:"国风榜",58:"说唱榜",72:"动漫音乐榜",73:"游戏音乐榜"}
print(top)
while True:
    num = int(input("请输入你要查看的榜单号码:"))
    if num not in top:
        print("无该榜单,请重新输入!")
    else:
        break
#获取html数据
headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183"
    }
response = requests.get(f"https://y.qq.com/n/ryqq/toplist/{num}",headers = headers)
html = response.text
soup = BeautifulSoup(html,"html.parser")
info = []#存放提取到的信息
all_songs = soup.findAll("span",attrs={"class":"songlist__songname_txt"})#提取全部含有歌名以及专辑名的元素
all_names = soup.findAll("div",attrs={"class":"songlist__artist"})#提取全部含有歌手名的元素
for names in all_names:#往info添加歌手名信息
    name_link = names.findAll("a")
    info.append([[i.get("title") for i in name_link]])
idx = 0#记录当前遍历到列表的索引号
for songs in all_songs:#往info添加歌名以及专辑名信息
    song_link = songs.findAll("a")
    for t in song_link: 
        info[idx].append(t["title"])
    idx += 1
print(top[num])
for i in range(len(info)):#输出info中的信息
    print(f"{i+1} 歌手:{'/'.join(info[i][0])}\n\t歌曲:《{info[i][2]}》\n\t专辑:《{info[1][1]}》")












  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python爬取酷狗音乐的步骤: 1. 分析酷狗音乐的网页结构,找到需要爬取的数据所在的标签和类名。 2. 使用requests库发送HTTP请求,获取酷狗音乐网页的HTML源代码。 3. 使用BeautifulSoup库解析HTML源代码,提取出需要爬取的数据。 4. 将数据保存到本地文件或数据库中。 下面是一个简单的示例代码,演示如何爬取酷狗音乐排行榜: ``` import requests from bs4 import BeautifulSoup # 设置请求头,模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 发送HTTP请求,获取HTML源代码 url = 'http://www.kugou.com/yy/rank/home/1-8888.html?from=rank' response = requests.get(url, headers=headers) html = response.text # 解析HTML源代码,提取数据 soup = BeautifulSoup(html, 'html.parser') songs = soup.select('.pc_temp_songlist > ul > li') # 遍历歌曲列表,输出歌曲信息 for song in songs: rank = song.select('span.pc_temp_num')[0].text.strip() name = song.select('a')[0].text.strip() singer = song.select('a')[1].text.strip() album = song.select('a')[2].text.strip() print(rank, name, singer, album) ``` 上述代码中,我们使用了requests库发送HTTP请求,获取酷狗音乐网页的HTML源代码。然后使用BeautifulSoup库解析HTML源代码,提取出排行榜中每首歌曲的排名、歌曲名、歌手名和专辑名,并输出到控制台。 你可以将这些数据保存到本地文件或数据库中,以便后续分析和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值