抓取网页音频(爬取网站上面的音频数据该如何去做呢?(一))
优采云 发布时间: 2021-11-25 20:18抓取网页音频(爬取网站上面的音频数据该如何去做呢?(一))
前言
最近分享了一些爬虫知识点。所以今天我们可以通过我们目前掌握的爬虫技术和Python技术来爬取某个平台的音频数据。
我们都知道,一般的数据都在url地址对应的网页源码中。如下所示
网页源代码
但是如果要抓取的数据不在当前URL地址对应的网页源代码中,那就真的比较痛苦了。在这种情况下,数据要么在后期动态添加到网页中,要么通过 ajax 加载。不管是哪一种,对于初学者来说都是异常的头痛。今天我们就用通俗易懂的方式来分析ajax数据的特点(一切都是特殊的,所以不同的场景需要特殊处理)
实践中的 ajax 是什么?
先解决一个问题。什么是阿贾克斯?来介绍一下百度百科的解释
Ajax 代表“Asynchronous Javascript And XML”(异步 JavaScript 和 XML)。它是一种 Web 开发技术,可创建交互式、快速和动态的 Web 应用程序。它可以在不重新加载整个网页的情况下更新某些网页。
这段话的一个关键点是,您可以在不加载整个网页的情况下更新某些网页。例如,以下是 12306 列火车的列表。
在这张图中,我们可以看到12306的网页就是这样的风格。但是当我们点击“查询”按钮时,我们要观察这个网页的效果
我们发现这个网页没有刷新,但是本地结构发生了变化。然后通过ajax加载车次列表数据。其实,刚刚我们理解“无需重新加载整个网页就可以更新部分网页的技术”这句话的含义并不难。
案例展示
下面通过一个案例来进一步分析总结如何抓取ajax数据
下图是一段音频网站。在这个网站中,数据主要是音频。那么我们要如何抓取网站上面的音频数据呢?
我们进一步优化了目标。下面有这样一个音频主题。今天我们就爬取这个话题的数据。
点击专辑后,我们发现里面有很多音频数据。按照我们的思路,只要找到每个音频的url就可以轻松爬取。
但前提是数据是否在当前URL地址之上?让我们检查一下网页的源代码。这也很简单。我们只需要在源代码中搜索mp3或m4a等音频格式即可。从下图我们可以看到这些音频格式在网页上是不可用的。然后我们猜测这些数据可能是通过ajax加载的
接下来,我们将通过NetWork 来分析数据接口。我们点击了一首歌曲,发现在网络中刷新了一些数据。先看第一条数据
数据确实在这个界面
我们点击进一步观察,看看有没有类似mp3或m4a的音频格式。然而,令我们失望的是,它没有。那我该怎么办?
在这个数据接口下还有一条数据。我们来看看里面有什么?
点击这个数据,我们发现它是一个音频数据
为了验证这个数据是否是我们要爬取的,我们可以检查一下。OK,没问题就是我们要爬取的数据
但这只是一个音频,如果我们想爬取其他音频怎么办?我们发现不同音频的id是不同的。然后就很容易了。我们先访问第一个数据接口中的内容,获取音频的id和name。
然后我们将转到第二个数据接口,到其 url 以动态获取替换音频的 id。
代码演示
import requests
import json
url = 'https://www.ximalaya.com/revision/play/v1/show?id=231012348&sort=1&size=30&ptype=1'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
r = requests.get(url,headers=headers)
ret = r.text
result = json.loads(ret)
content_list = result['data']['tracksAudioPlay']
for content in content_list:
t_id = content['trackId'] # 音频的id
name = content['trackName'] # 音频的name
# print(t_id,type(t_id))
url = 'https://www.ximalaya.com/revision/play/v1/audio?id=%d&ptype=1'%t_id
mus_response = requests.get(url,headers=headers)
mus_html = mus_response.text
mus_result = json.loads(mus_html)
# print(mus_html,type(mus_result))
mus_src = mus_result['data']['src']
# print(mus_src)
with open('mp3/%s.m4a'% name,'wb') as f:
mus = requests.get(mus_src)
f.write(mus.content)
复制代码
运行结果
这是部分核心代码的列表。大家可以在这个代码的基础上进行升级和扩展。案子不难,大家可以试试。不过我们还是要心存感激,不要恶意爬取网站上面的数据。