当前位置:   article > 正文

Python爬虫——使用三种方法来爬取酷狗音乐的TOP榜_酷狗音乐爬虫

酷狗音乐爬虫
一、爬取的页面思路分析
1.首先我们在浏览器中打开的链接
https://www.kugou.com/yy/rank/home/1-8888.html?from=rank
  • 1
2.点击F12键或者鼠标右键检查键,我们会看到如下的界面:

在这里插入图片描述

3.点击圆圈里面的键,放到歌曲的名称上面,直接定位到歌曲名称所在的源代码中

在这里插入图片描述

4.我们对于源代码进行分析,可以看到歌曲的名称存放在a标签下,它的父标签是ul标签,之后再往上分析,可以看到ul的父标签为div标签,属性为class,值为pc_temp_songlist

在这里插入图片描述

5.不同方法的不同选择方法

5.1 lxml(xpath) :小编的观点为选择获取信息的路径

/       :如果在最前面代表从给根节点开始选取,否则为某个节点的子节点
//      :从全局节点随机选择节点
@       :选取某个节点的属性
[]      :标签里面的信息
text() :标签下的文本信息
  • 1
  • 2
  • 3
  • 4
  • 5
#歌曲信息获取
//div/ul/li/a[@class="pc_temp_songname"]/text()
  • 1
  • 2

5.2 BeautifulSoup(findall):小编的观点为在获取到的源代码中查找关键信息

.findall('获取的标签名称',‘属性(属性加属性值)’)
歌曲信息获取如下:
.find_all('a', class_="pc_temp_songname")
  • 1
  • 2
  • 3

5.3 re:定义为文本的高级匹配模式,提供搜索,替换等功能。其本质是由一系列字符和特殊符号构成的字串,这个字串即正则表达式

#re库涉及到许多的知识点,在这里小编仅仅分析下面的正则表达式
r'<li class=" " title=.*?>.*?<a.*?>(.*?)</a>'
  • 1
  • 2
'
运行
r'' 表示原生字符串
.   匹配除换行外的任意一个字符
*   匹配前面的字符出现0次或多次
?  为了让匹配重复的元字符尽可能少的向后匹配内容,在匹配重复元字符后加 ‘?’ 号即可
  • 1
  • 2
  • 3
  • 4
二、代码
lxml库和xpath
import requests
from lxml import etree  
from fake_useragent import UserAgent

#引入酷狗音乐的排行榜的url
url = "https://www.kugou.com/yy/rank/home/1-8888.html?from=rank"
#构造伪装的头部而不必使用自己电脑的User-Agent
headers = {
    "User-Agent":UserAgent().random
}

#使用requsets库发送请求并返回response对象
response = requests.get(url,headers=headers)
#指定编码为‘utf-8’
response.encoding='utf-8'

#调用HTML类对HTML文本进行初始化,构造XPath解析对象trees
trees = etree.HTML(response.text)
#使用xpath方法获取里面的排名,歌曲信息和时长
ranks = trees.xpath("//div/ul/li/@data-index")
songnames = trees.xpath('//div/ul/li/a[@class="pc_temp_songname"]/text()')
songtimes = trees.xpath('//div/ul/li/span/span[@class="pc_temp_time"]/text()')

#定义一个列表
list = []
#zip函数以可迭代对象为输入参数,将可迭代对象里元素分别取出再组合成一个个元组,返回一个列表
for i in zip(ranks,songnames,songtimes):
    rank,songname,songtime = i
    data = {
            "排行":int(rank)+1,#源代码中因为排名前三被加粗,直接调用了一个属性值但是它是从零开始
            "歌曲": songname,
            "播放时长": songtime.replace("\t","").replace("\n","")
    }
    list.append(data)
print(list)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

#####bs4库和BeautifulSoup

import requests
from fake_useragent import UserAgent
from bs4 import BeautifulSoup

url = "https://www.kugou.com/yy/rank/home/1-8888.html?from=rank"
headers = {
    "User-Agent":UserAgent().random
}

response = requests.get(url, headers=headers)
#获取到的响应解码为“utf-8”
text = response.content.decode('utf-8')

#创建一个soup对象(使用的解析器为lxml)
soup = BeautifulSoup(text, 'lxml')
#使用find_all方法来查询节点
songnames = soup.find_all('a', class_="pc_temp_songname")
songtimes = soup.find_all('span',class_='pc_temp_time')

#定义一个列表
list = []
#排名
count = 0
for i in zip(songnames,songtimes):
    songname,songtime = i
    count +=1
    data = {
             "排行":count,
             "歌曲": songname.string,
             "播放时长": songtime.string.replace("\t","").replace("\n","")
        }
    list.append(data)
print(list)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

#####re库

import requests
from fake_useragent import UserAgent
import re

url = "https://www.kugou.com/yy/rank/home/1-8888.html?from=rank"
headers = {
    "User-Agent": UserAgent().random
}

response = requests.get(url, headers=headers)
response.content.decode("utf-8")
text = response.text

#使用re.findall匹配字符串
songnames = re.findall(r'<li class=" " title=.*?>.*?<a.*?>(.*?)</a>', text, re.S)
songtimes = re.findall(r'<span class="pc_temp_time">(.*?)</span>', text, re.S)

#定义一个列表
list = []
#排名
count = 0
for i in zip(songnames,songtimes):
    songname,songtime = i
    count +=1
    data = {
             "排行":count,
             "歌曲": songname,
             "播放时长": songtime.replace("\t","").replace("\n","")
        }
    list.append(data)
print(list)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
三、运行结果

在这里插入图片描述
使用上面的三种方法,我们都可以看到结果是列表格式,里面存放的是多个字典

以上就是全部的内容,感谢你读到这里,如果在实验中出现问题,记得给我留言哟,如有错误的地方也希望你们提出来,我们一起解决!!!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/862540
推荐阅读
相关标签
  

闽ICP备14008679号