赞
踩
https://www.kugou.com/yy/rank/home/1-8888.html?from=rank
5.1 lxml(xpath) :小编的观点为选择获取信息的路径
/ :如果在最前面代表从给根节点开始选取,否则为某个节点的子节点
// :从全局节点随机选择节点
@ :选取某个节点的属性
[] :标签里面的信息
text() :标签下的文本信息
#歌曲信息获取
//div/ul/li/a[@class="pc_temp_songname"]/text()
5.2 BeautifulSoup(findall):小编的观点为在获取到的源代码中查找关键信息
.findall('获取的标签名称',‘属性(属性加属性值)’)
歌曲信息获取如下:
.find_all('a', class_="pc_temp_songname")
5.3 re:定义为文本的高级匹配模式,提供搜索,替换等功能。其本质是由一系列字符和特殊符号构成的字串,这个字串即正则表达式
#re库涉及到许多的知识点,在这里小编仅仅分析下面的正则表达式
r'<li class=" " title=.*?>.*?<a.*?>(.*?)</a>'
r'' 表示原生字符串
. 匹配除换行外的任意一个字符
* 匹配前面的字符出现0次或多次
? 为了让匹配重复的元字符尽可能少的向后匹配内容,在匹配重复元字符后加 ‘?’ 号即可
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)
#####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)
#####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)
使用上面的三种方法,我们都可以看到结果是列表格式,里面存放的是多个字典
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。