一文带你批量爬取某马拉雅音频数据并保存到本地~

写在前面

  今天带给大家一个爬取因音频数据的小案例,我将案列重新复现了功能并做了些小优化,今天分享给大家。还是老规矩在文末会附上完整代码,需要的小伙伴自取就好了,能帮助到你的话别忘了点赞关注喔~

  郑重声明:本人目前仅在CSDN这一个平台发布文章,其他小伙伴如果想转载 或者引用请注明引用来源,未经许可不得直接搬运,请尊重创作人的劳动成果,谢谢!

在这里插入图片描述

一、需求分析

  爬取网站的音频数据,并保存在指定目录,因为我比较喜欢听郭德纲相声,所以就用这个来做示例啦~

  网站链接: https://www.ximalaya.com/xiangsheng/9742789/

效果图如下:
在这里插入图片描述

二、编程思路

  在爬取网页时首先要的就是对网页进行分析,这里我主要需要的是两个部分,一个是这组图的名称,用来做文件名;另一个是图片链接,用来下载图片。

  1.首先在进入网站之后,我随便点击一个音频播放在network工具中找到Media,可以看到有一个数据包,点开数据包, 他的url是:https://aod.cos.tx.xmcdn.com/group30/M09/8D/6F/wKgJXlmEMtGilK_6AL83b0oTzEg375.m4a,这个链接点进去之后就是我要的音频数据。到底为止我们如果想要获取这个音频只要请求该链接下载就好了,但我要做的是批量是爬取音频,所以还要往下找规律,也就是所谓的逆向解析。
在这里插入图片描述

  2.我们将刚刚的url链接复制到开发者工具的搜索框中去搜索,发现有两个数据包是包含链接的,细心的小伙伴能够看到,第二个数据包就是我们在第一步中打开的数据包,所以我们应该打开第一个audio数据包。

在这里插入图片描述
打开之后他的url是https://www.ximalaya.com/revision/play/v1/audio?id=46219999&ptype=1,并且在response中的json数据格式中存有第一步的url,光看这一个url还发现不了规律,我再给大家找到第二个音频的audio数据包中的url链接是https://www.ximalaya.com/revision/play/v1/audio?id=46430560&ptype=1,细心的小伙伴应该能发现,是的包含音频地址的json文件的url只有id是不同的,下一步我们要去找id的规律。

  3.我们回过头来看一下源码,会发现id就在href链接的最后面,所以我们用split()方法分割就能获得最后的id。
在这里插入图片描述
  最后总结一下思路首先在页面中找到音频对应的id值,然后根据id值的替换,去请求每一个音频数据所对应的json字符串,最后从json数据中解析音频对应的url地址下载即可,后面附上完整代码,小伙们可以试试哦。关于翻页和文件存储有疑问的小伙伴可以参考我的这两篇文章。

翻页: https://blog.csdn.net/weixin_44578172/article/details/109356900
保存图片到指定文件: https://blog.csdn.net/weixin_44578172/article/details/110359635

三、完整代码

'''
爬取思路
1.在页面中找到音频对应的id值
2.根据id值的替换请求每一个音频数据所对应的json字符串
3.从json数据中解析音频对应的url地址
'''
import requests
import parsel
import time
import os

#1.获取数据链接

for page in range(1,6):
    print("==================正在爬取第{}页音频==================".format(page))
    url = "https://www.ximalaya.com/xiangsheng/9742789/p{}/".format(page)
    headers = {'user-agent':'Mozilla/5.0'}

    #2.发送网络请求
    response = requests.get(url = url , headers = headers)
    html_data = response.text
    #print(html_data)

    #3.解析数据
    select = parsel.Selector(html_data) #将字符串格式转换为对象
    lis = select.xpath('//div[@class="sound-list _is"]/ul/li')#获取多个标签结点
    for li in lis:
        title = li.xpath('.//a/@title').get()
        href = li.xpath('.//a/@href').get()
        #print(title,href)

        #获取音频id
        m4a_id = href.split('/')[-1]
        #构建请求的链接地址
        m4a_url_json = "https://www.ximalaya.com/revision/play/v1/audio?id={}&ptype=1".format(m4a_id)
        json_data = requests.get(url = m4a_url_json , headers = headers).json()
        #print(json_data)
        m4a_url = json_data['data']['src']
        #print(m4a_url)
        #m4a_data = requests.get(url = m4a_url , headers = headers).content

        #4.数据的保存
        time.sleep(1)  # 设置爬取时间间隔为1s
        #定义保存文件夹的名字
        dir_name = "郭德纲相声"
        try:
            if not os.path.exists(dir_name):
                os.mkdir(dir_name)
        except:
            pass
        # 定义音频的名字
        file_name = title + '.m4a'
        path = dir_name + '/' + file_name
        if not os.path.exists(path):
            m4a_data = requests.get(m4a_url, headers=headers)  # 获取音频链接
            with open(dir_name + '/' + file_name, 'wb') as f:
                f.write(m4a_data.content)  # 因为音频是二进制所以用content写入
            print('保存完成:',title)
        else:
            print("文件已经存在")
print("爬取完毕")


  然后就可以看到一个个音频被下载到本地啦,还在等什么,赶紧试试吧~

引用源自

B站Python学习者 链接:https://www.bilibili.com/video/BV1YK411N7H3

  本篇完,如有错误欢迎指出~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我敲的贼快

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值