Python爬取某网站音频数据

1,522 阅读5分钟

前言

最近分享了一部分爬虫知识点。那么我们今天可以通过目前掌握的爬虫技术以及Python技术来爬取一个某平台的音频数据。

我们都知道一般数据都是url地址所对应的网页源码中。如下图

网页源码

但是如果要爬取的数据不在当前url地址所对应的网页源码中那真是比较痛苦了。这种情况下,数据要么是通过后期动态添加到网页中,要么就是通过ajax进行加载的。无论是哪一种对于初学者的同学来说都是异常的头疼。今天我们就以一种通俗简单的方式来分析一下ajax数据的特点(凡事有特殊,所以场景不同还需要特殊对待)

实战

什么是ajax?

先解决一个问题什么是ajax?下面引入百度百科的一段解释

Ajax即"Asynchronous Javascript And XML"(异步 JavaScript和XML),是一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。

在这段话里面有一个关键点就是无需加载整个网页,就可以更新部分网页的技术 例如下面是一个12306的车次列表

在这幅图中,我们可以看到12306的网页是这么一个样式。可是当我们点击一下"查询"按钮之后,我们在来观察这个网页的效果

我们发现这个网页其实是没有进行刷新,但是局部结构就已经发生了变化。那么这个车次列表数据就是通过ajax加载出来的。那我们其实也就不太难理解,刚才这句"无需重新加载整个网页的情况下,能够更新部分网页的技术"话的含义了。

案例演示

下面我们来通过一个案例,来对如何爬取ajax的数据进行进一步的分析和总结

下图是某音频网站,在这个网站当中,数据主要以音频为主。那么我们想要爬取网站上面的音频数据该如何去做呢?

我们把目标进一步的优化,下面有一个<<夜色钢琴曲>>这么一个音频专题,今天我们就来爬取这个专题里面的数据

点击专辑进去之后我们发现有很多的音频数据,根据我们的思路只要找到每个音频的url就很容易来进行爬取了。

但是前提是这些数据是否在当前的这个URL地址之上呢?我们来查看下网页源码,这个也很简单,我们只要在源码中搜索mp3或者是m4a等音频格式就可以了。通过下图我们可以看到在网页中是没有这些音频格式的。那么我们就猜到了这些数据有可能是通过ajax来进行加载的

下面就要通过NetWork来分析下数据接口了。我们点击一首歌曲发现在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)

运行效果

在这里是列举了部分的核心代码。在这个代码的基础之上大家可以在进行升级和扩展。案例不是很难,大家都可以动手去试试。不过我们还是要怀着感恩之心,不要恶意去爬取网站上面的数据。