Python3爬虫实战之网易云音乐

Xpath最初被设计用来搜寻XML文档,但它同样适用于HTML文档的搜索。通过简洁明了的路径选择表达式,它提供了强大的选择功能;同时得益于其内置的丰富的函数,它可以匹配和处理字符串、数值、时间等数据格式,几乎所有节点我们都可以通过Xpath来定位。

在Python中,lxml库为我们提供了完整的Xpath选择器,今天我们就用它来学习Xpath的使用,我们的目标是用最少的时间来掌握使用频率最高的核心技能,而这些核心技能基本上可以满足我们网页抓取的需求。

毕竟我们不是单独在使用Xpath,在Python中,很多数据处理和匹配的工作我们可以用更加“Python”、更加通用的方法来解决,没必要为了5%的使用而花费数倍的时间。

我们都知道,在很多领域里,从0到80分只需要花费很少的时间,从80分到95分则可能会花费上一阶段的数倍时间,至于从95分往上,每一分的提高都可能需要巨大的时间成本。我们需要权衡最初的学习诉求、收获和时间成本的匹配度等,以判断我们要到达哪一个水平,并规划出对应的学习方案。

我学习爬虫的目的并不是成为一个精通网络爬虫的大师,而是将它作为一个工具,用来帮助我更好地进行数据挖掘分析的工作。因此,在学习过程中会尽可能地功力,力求以最少的时间掌握最核心的技能。Xpath简直是针对这种学习思路设计的,因为它太容易上手了,核心功能只需要十分钟就可以熟练掌握,而那多达上百的函数对我们来说可能一辈子都用不到几回。


欢迎大家关注我的个人博客【数洞】 【备用站】

Python3爬虫实战之网易云音乐_第1张图片
image

一、Xpath常用规则

下表是最常用的Xpath规则,绝大多数的Xpath表达式都由它们构成。

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点直接选取子节点
// 从当前节点选取所有子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

二、抓取赵雷热门作品页面

单纯的罗列简直是耍流氓,实战才是硬道理。正如标题所言,今天我们就使用Xpath来解析网易云音乐的歌手页面。我个人很喜欢赵雷,那我们就先尝试解析一下赵雷的热门作品。

网易云音乐抓取难度较低,没有乱七八糟的验证,抓取的时候我们只需要带上header就可以成功获取我们需要的内容了。

首先,我们打开网易云音乐的首页,搜索并进入赵雷的页面。右键检查并切换到Network选项卡,刷新一下,就看到了一大串网络请求,我们要做的就是从中定位到歌曲列表所在的请求。

我们优先看document类的文件,第一个打开后通过preview可以看到这里是通用内容,包含了一些网易云音乐的信息,那么接下来我们看下边这个红框里的请求,首先请求名称里包含了artist以及一个对应的id,看起来有点像。

Python3爬虫实战之网易云音乐_第2张图片
image

接下来我们单击进去看看:

Python3爬虫实战之网易云音乐_第3张图片
image

我们成功看到了赵雷的热门作品列表,说明我们找对了位置。我们同样可以通过在response里搜索来确定这一请求是否是我们寻找的那一个。比如我们搜索“成都”、“南方姑娘”等,来看下我们的歌曲列表是不是在这个response中。

确定了请求之后,我们就需要抓取并解析了。首先我们切换到Headers选项,在General下找到Request URL作为请求连接;然后在Request Headers下找到‘User-Agent’,并将其复制下来用作模拟浏览器发起请求。

Python3爬虫实战之网易云音乐_第4张图片
image
Python3爬虫实战之网易云音乐_第5张图片
image
image

接下来我们尝试抓取页面:

import requests

url = 'https://music.163.com/artist?id=6731'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
html = requests.get(url, headers=headers)
print(html.status_code)

结果如下:

200

这说明我们的请求成功了,接下来我们看下html的内容是否符合要求:

print(html.text)

这里打印的结果太长就不贴出来了,我们可以把打印的内容和刚才那个请求返回的结果做一个比对,看是不是一样的内容。通过观察,我们发现这就是我们需要的内容。

三、解析热门作品列表

1. 构建对象

那么接下来就要解析了,解析之前,我们需要先使用lxml构建我们需要的对象:

from lxml import etree

result = etree.HTML(html.text)
print(type(result))
print(result)

输出为:

2. 子节点、子孙节点、属性过滤、文本选取

然后我们观察网页,定位到歌单位置:

Python3爬虫实战之网易云音乐_第6张图片
image

我们发现歌曲列表藏在一个

你可能感兴趣的:(Python3爬虫实战之网易云音乐)