写在前面
今天带给大家一个爬取因音频数据的小案例,我将案列重新复现了功能并做了些小优化,今天分享给大家。还是老规矩在文末会附上完整代码,需要的小伙伴自取就好了,能帮助到你的话别忘了点赞关注喔~
郑重声明:本人目前仅在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
本篇完,如有错误欢迎指出~