文件目录

  • 写在前面
  • 一、需求分析
  • 二、编程思路
  • 三、完整代码
  • 引用源自


写在前面

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

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

利用python喜马拉雅付费音频 爬取喜马拉雅音频_json

一、需求分析

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

效果图如下:

利用python喜马拉雅付费音频 爬取喜马拉雅音频_爬取音频_02

二、编程思路

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

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

利用python喜马拉雅付费音频 爬取喜马拉雅音频_爬取音频_03

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

利用python喜马拉雅付费音频 爬取喜马拉雅音频_爬虫_04


打开之后他的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。

利用python喜马拉雅付费音频 爬取喜马拉雅音频_利用python喜马拉雅付费音频_05


最后总结一下思路首先在页面中找到音频对应的id值,然后根据id值的替换,去请求每一个音频数据所对应的json字符串,最后从json数据中解析音频对应的url地址下载即可,后面附上完整代码,小伙们可以试试哦。关于翻页和文件存储有疑问的小伙伴可以参考我的这两篇文章。

翻页:
保存图片到指定文件:

三、完整代码

'''
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 = "郭德纲相声"
            if not os.path.exists(dir_name):
                os.mkdir(dir_name)
        except:
        # 定义音频的名字
        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("爬取完毕")

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