一、分析网站结构,寻找音频实际下载地址

随便找个免费听的音频列表:https://www.ximalaya.com/youshengshu/12576446/

可以看到结构很明显,a标签里的title是章节名,href属性是章节链接

我们点进去一篇看看,选中Media   发现没有我们需要的音频文件,那是因为音频没播放

点播放后出现了实际地址, 3个都一样内容

将该地址放入网址

https://audio.cos.xmcdn.com/group38/M03/33/B0/wKgJo1qCiJfh31OVADfpIBp6vqM985.m4a

成功播放。  先别高兴太早~   这只是一个音频地址  我想下载列表全部地址咋办呢??

-----------------------------------------------------------------------------------------------------------------------

此时有2个办法找下载地址的出处, 它是怎么来的

1.第一种

找到看起来像是唯一的标识 比如 音频下载地址中的 wKgJo1qCiJfh31OVADfpIBp6vqM985 去搜索全局

找到一个请求,看它的请求结果Response

请求头:

请求头:https://www.ximalaya.com/revision/play/v1/audio?id=67064624&ptype=1

请求结果:{"ret":200,"data":{"trackId":67064624,"canPlay":true,"isPaid":false,"hasBuy":true,"src":"https://audio.cos.xmcdn.com/group38/M03/33/B0/wKgJo1qCiJfh31OVADfpIBp6vqM985.m4a","albumIsSample":false,"sampleDuration":135,"isBaiduMusic":false,"firstPlayStatus":true}}

果然是的 一段json数据里  有音频下载地址

2.第二种

不选择Media    选中All 显示全部请求,再去播放音频

你会看到多出这些请求, 一个个点进去看Response ,你会发现

它的请求结果是一段json内容   和方法1一样

请求结果:{"ret":200,"data":{"trackId":67064624,"canPlay":true,"isPaid":false,"hasBuy":true,"src":"https://audio.cos.xmcdn.com/group38/M03/33/B0/wKgJo1qCiJfh31OVADfpIBp6vqM985.m4a","albumIsSample":false,"sampleDuration":135,"isBaiduMusic":false,"firstPlayStatus":true}}

data下的src就是实际下载地址 。

-----------------------------------------------------------------------------------------------------------------------

OK 前后都串联起来了

音频下载地址json数据的请求接口:https://www.ximalaya.com/revision/play/v1/audio?id=67064624&ptype=1

当前章节的链接:https://www.ximalaya.com/youshengshu/12576446/67064624

主页列表下的章节链接:/youshengshu/12576446/67064624

其中 12576446 音频ID      67064624是章节ID

思路有了!!!

1.在主页循环获取所有章节ID拼接成音频下载的请求链接

2.请求下载接口获取json数据

3.提取json数据中的实际下载地址,请求它,转为二进制保存到本地  格式mp4

二、确定思路,开始敲代码

现在代码敲起来就很明确,直接上源码,就不一点点说是怎么敲的啦,有注释

模块有点多,用tkinter画了个界面方便操作。 下面有源码+成品的下载地址

import requests  #数据挖掘
from lxml import etree #数据清洗
import time
import json
import tkinter #TK界面
import sys # 用来控制程序关闭
import os  #文件
import threading #线程headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
}def createUI():MainInterface = tkinter.Tk() #初始化界面MainInterface.title("喜马拉雅音频下载器 QQ463392823")MainInterface.geometry('600x200')label1=tkinter.Label(MainInterface,text='').grid(row=0,column=0) #间隔符#创建标签label1=tkinter.Label(MainInterface,text='音频列表网址:',bg='pink',font=('Arial',12),width=12,heigh=1) label1.grid(row=1,column=0) #放置标签global mp4url#单行输入文本mp4url=tkinter.Entry(MainInterface,width=50)mp4url.grid(row=1,column=1)label1=tkinter.Label(MainInterface,text='').grid(row=2,column=0) #间隔符#创建按钮button1=tkinter.Button(MainInterface,text='开始下载',bg='yellow',font=('Arial',14),command=qd)button1.grid(row=3,column=1)button2=tkinter.Button(MainInterface,text='停止下载',bg='yellow',font=('Arial',14),command=enddown)button2.grid(row=4,column=1)label1=tkinter.Label(MainInterface,text='保存的路径=> c:/喜马拉雅下载').grid(row=5,column=1) label1=tkinter.Label(MainInterface,text='').grid(row=6,column=0) #间隔符MainInterface.mainloop() #循环显示界面'''
音频详情页地址
https://www.ximalaya.com/youshengshu/12576446/67064624
https://www.ximalaya.com/youshengshu/12576446/67064625
https://www.ximalaya.com/youshengshu/12576446/67064626
音频地址json信息
https://www.ximalaya.com/revision/play/v1/audio?id=67064624&ptype=1
https://www.ximalaya.com/revision/play/v1/audio?id=67064625&ptype=1
https://www.ximalaya.com/revision/play/v1/audio?id=67064626&ptype=1
实际下载地址
https://audio.cos.xmcdn.com/group44/M0B/9D/3F/wKgKkVsI3Qqx5Y4iAD5LfSCEmC8942.m4a
'''
def enddown():sys.exit(0)def qd():print("开启线程执行任务")t1 = threading.Thread(target=stadown) t1.setDaemon(True) t1.start()
# 通过音频列表 获取所有音频实际下载链接
def stadown():# 下载一个音频res=requests.get(mp4url.get(),headers=headers)# print(res.text)html=etree.HTML(res.text)data = html.xpath('//div[@class="text _Vc"]/a')for i in data:# print(i.get('title'))# print(i.get('href'))title = i.get('title')# 通过ID 拼接实际下载地址的json信息downurl='http://www.ximalaya.com/revision/play/v1/audio?id=' + i.get('href').split('/')[3] + '&ptype=1'# print(downurl)res=requests.get(downurl,headers=headers)# print(res.text)# 获取实际下载地址src = json.loads(res.text)["data"]["src"]print('正在下载'+title)mp4code=requests.get(src,headers=headers).contentfile=open("C:\\喜马拉雅下载\\"+title+".mp4","wb")file.write(mp4code)file.close()time.sleep(3)
#检测目录
def jcos():dirs='c:/喜马拉雅下载'if not os.path.exists(dirs): #不存在则创建os.makedirs(dirs)jcos()
createUI()

源码+成品链接:https://download.csdn.net/download/qq_18816201/12318891

python爬虫实战练习 --- 喜马拉雅免费音频 下载到本地相关推荐

  1. python爬虫实战-爬取视频网站下载视频至本地(selenium)

    #python爬虫实战-爬取视频网站下载视频至本地(selenium) import requests from lxml import etree import json from selenium ...

  2. python爬虫实战之b站视频下载-中

    前面已经分析了b站得视频下载所用到得数据 这篇主要是说下载相关得操作. 这里是用得是开源下载工具aria2 之所以用这个下载工具来下载之因为 这个工具可以跟任何语言进行交互实现下载 一.下载aria2 ...

  3. 【python爬虫】对喜马拉雅上一个专辑的音频进行爬取并保存到本地

    >>>内容基本框架: 1.爬虫目的 2.爬取过程 3.代码实现 4.爬取结果  >>>实验环境: python3.6版本,pycharm,电脑可上网. [一 爬虫目 ...

  4. python爬虫图片实例-【图文详解】python爬虫实战——5分钟做个图片自动下载器...

    我想要(下)的,我现在就要 python爬虫实战--图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识(没看的赶紧去看)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk ...

  5. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  6. Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3)

    Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3) 1. 异步加载爬虫 对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问 ...

  7. Python爬虫实战——下载小说

    Python爬虫实战--下载小说 前言 第三方库的安装 示例代码 效果演示 结尾 前言 使用requests库下载开源网站的小说 注意:本文仅用于学习交流,禁止用于盈利或侵权行为. 操作系统:wind ...

  8. 【图文详解】python爬虫实战——5分钟做个图片自动下载器

    python爬虫实战--图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识,大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk is cheap show me the c ...

  9. Python爬虫实战 — — Wallhaven壁纸高清原图下载

    Python爬虫实战 - - Wallhaven壁纸高清原图下载 一.网站分析 二.可行性分析 三.代码分析 1.所需第三方库与请求头 2.获取当前页的所有壁纸图像链接 3.根据图像链接存储本地 4. ...

最新文章

  1. 关于zbar的libzbar.a不支持ipnone5的64bit问题
  2. 6410 gpio控制及接口
  3. CodeForces - 1422F Boring Queries(主席树+线段树/RMQ)
  4. 使用 yield 减少内存消耗
  5. 前端学习(2671): 逻辑实现
  6. 条令考试小程序辅助器_可以自己编题的答题软件,自定义题库考试出题工具,微信答题小程序...
  7. SpringCloud创建Gateway模块
  8. Python+matplotlib响应鼠标滚轮事件调整图形大小
  9. php操作剪贴板内容代码,JavaScript操作剪贴板的实现方法介绍
  10. excel筛选排序从小到大_excel筛选怎么用教程 重复数据多个条件筛选功能教学
  11. 360驱动大师 2.0.0.1750 去广告去多余图标优化版(安装版 + 单文件版 + 网卡版)
  12. Github 常见缩写含义 WIP/LGTM/AFAIK
  13. c语言将大小写字母互换,C语言编程:大小写互换
  14. 【智能优化算法-白鲸算法】基于白鲸优化算法求解多目标优化问题附matlab代码
  15. 【Linux】目录权限和默认权限
  16. linux编辑pdf文件内容,PDF修改文字的步骤
  17. python代码实现, SIR 模型进行信息传播模拟
  18. 一款vista边栏Gadgets汉英翻译(翻译14种语言的边栏工具下载)
  19. SVM——传说中的核技巧
  20. 计算机多媒体课程教师教学心得,多媒体教学的心得体会_多媒体教学教师心得...

热门文章

  1. Word 自带公式转为mathtype格式
  2. 危骆邦油邦快讯|山东地炼报价行情早知道
  3. 【阿克曼小车导出URDF模型教程】
  4. Linux下视频转换工具:转换,切割,连接,
  5. java开发hadoop报错误 java.net.UnknownHostException
  6. Elasticsearch基于地理位置查询 geo_point
  7. 关于产品的一些思考——腾讯之微信
  8. android蘑菇街架构,蘑菇街Android单元测试框架 – natasha
  9. Transformer的PyTorch实现(超详细)
  10. 文末有惊喜 | 开通微信公众号留言功能,只需3步!