目的?

这是一个python练习,通过这个练习,我们可以了解:

  • 使用python发起http请求
  • python的文件操作
  • python的数据库操作

一、分析列表页面

  • 首先分析一下某网站的专辑页面要素,想办法获取页面红色列表信息数据。理论上,每个音频大致包括:id、标题、音频地址、更新时间等等

  • 在浏览器调试工具中,查看一下http请求。大致找一下,看看能不能找到相应的数据。看看是直接页面生成的,还是有额外的api获取数据

在network分析中,快速浏览一下所有的http请求,查看响应的结果,很快就能找到

在请求中,我们发现了一个请求/revision/album/v1/getTracksList?albumId=18521227&pageNum=1,对就它了

结合页面的情况,还有响应的结果,我们应该能猜到:albumId应该就是专辑ID,而pageNum应该就是页面了,我们验证一下

没有错,这个就是列表信息的请求url了。json响应结果中,我们找比较重要的信息:trackId-音频ID,title-音频标题,url-音频播放地址

列表信息来源应该搞清楚了,我们接着看音频播放的时候是否能找到音频来源?

二、分析音频播放页面

  • 打开单个音频播放地址后,跟列表页面一样,我们找单个音频信息来源。
  • 应该能找到/revision/play/v1/audio?id=247457234&ptype=1

这个请求响应结果里面的src就是音频地址了

三、编码实现

获取专辑列表方法

  • 1、使用requests发起http请求
  • 2、获取列表信息api返回的json结果,根据自己需要, 把列表信息保持到 list 中
  • 3、方法返回track信息的list
# 获取专辑列表
# album_id 专辑ID
# page_num 页码
def get_track_list(album_id, page_num):url = "https://www.ximalaya.com/revision/album/v1/getTracksList?albumId=" + str(album_id) + "&pageNum=" + str(page_num)track_list = []resp = requests.get(url, headers=header)result = resp.json()if result['ret'] == 200:tracks = result['data']['tracks']for tack in tracks:track_list.append({'index': tack['index'], 'play_count': tack['playCount'], 'duration': tack['duration'], 'trackId': tack['trackId'], 'title': tack['title'],'url': tack['url']})# 加入字典(暂时没有使用)track_map[tack['trackId']] = tack['title']return track_list

获取单个音频信息方法

  • 1、传入音频的id
  • 2、使用requests发起http请求,获取单个音频的json信息
  • 3、方法返回音频实际的http源文件地址
# 获取音频地址
def get_track_url(track_id):url = "https://www.ximalaya.com/revision/play/v1/audio?id=" + str(track_id) + "&ptype=1"resp = requests.get(url, headers=header)result = resp.json()if result['ret'] == 200:track_audio_play = result['data']['src']if len(track_audio_play) > 0:return track_audio_play

保存http音频文件信息到本地

  • 1、使用requests发起http请求,获取单个音频的流
  • 2、保存到响应的本地路径
#下载音频文件
def download_track_audio(url, file):resp = requests.get(url, headers=header, stream=True)with open(file, "wb") as f:for data in resp.iter_content(chunk_size=1024):if data:f.write(data)

例子运行&保存信息到数据库

try:dir = "H:/Temp"# 连接 mysql 的方法:connect('ip','user','password','dbname')con = mdb.connect(host='127.0.0.1', user='root', passwd='123456', db='py_demo', use_unicode=True, charset="utf8")# 所有的查询,都在连接 con 的一个模块 cursor 上面运行的cur = con.cursor()# 执行一个查询# cur.execute("SELECT VERSION()")# 取得上个查询的结果,是单个结果# data = cur.fetchone()track_list = get_track_list(18521227, 1)sql = """insert into track_info_demo(id,trackId,title,play_count,duration,url,file_path) values(%s,%s,%s,%s,%s,%s,%s)"""for track_info in track_list:# 下载track_url = get_track_url(track_info.get('trackId'))file_path = ""if track_url:# 扩展名file_name = track_url[track_url.rindex('/'):]# 文件名路径file_path = dir + file_name# 下载download_track_audio(track_url, file_path)# values.append(track_info.get('index'))# values.append(track_info.get('trackId'))values = [track_info.get('index'), track_info.get('trackId'), track_info.get('title'), track_info.get('playCount'), track_info.get('duration'),track_info.get('url'), file_path]cur.execute(sql, values)con.commit()
finally:if con:# 无论如何,连接记得关闭con.close()

结果

数据库保存信息

文件信息

附件:

源码附件

一键获取喜马拉雅音频文件(Python3爬虫)相关推荐

  1. 张赐荣 | PHP 获取喜马拉雅音频直链地址

    [作者:张赐荣] 获取喜马拉雅音频直链的方法 对以下地址发起Request Get请求,返回Json格式结果,其中的data.src就是音频的真实路径. "https://www.ximal ...

  2. 用Python的mutagen模块获取MP3音频文件的时长

    工作中碰到的需求,今天下午虽然解决了,但是不太简洁(本质上还是用的mutagen...),回家查了查试了试,用mutagen可以很容易获取MP3音频文件的长度, 一共三行代码 from mutagen ...

  3. Android获取mp3音频文件播放总时长

    Android获取mp3音频文件播放总时长 一般是需要文件的绝对路径,需要读取文件,转成媒体类解析,最好获取播放时长,然后关闭资源. /** * 获取音频文件的总时长大小 * * @param fil ...

  4. 解决ffmpeg获取AAC音频文件duration不准

    最近测试提出了一个bug,ijk获取到的aac文件的duration不准,发来一看,确实不准,在AE或者系统mediaplayer中得到的都是3m48s(准确时间是MMParserExtractor: ...

  5. Python 爬虫下载喜马拉雅音频文件

    阅读文本大概需要 5 分钟 学习,是一个长期的过程.学习的方式也是有很多种的,在家里时间有空闲时间的话可以选择读书,如今在手机上看电子书也方便.pk哥最近看电子书比较多,感觉自己的视力明显下降了.停下 ...

  6. Python实例---爬取下载喜马拉雅音频文件

    PyCharm下python爬虫准备 打开pycharm 点击设置 点击项目解释器,再点击右边+号 搜索相关库并添加,例如:requests 喜马拉雅全网递归下载 打开谷歌/火狐浏览器,按F12打开开 ...

  7. ffmpeg系列-解决ffmpeg获取aac音频文件duration不准

    这个问题是这样产生的,一同事反应会随机出现ijk获取到的aac文件的duration不准,发来一看,确实不准,在AE或者系统mediaplayer中得到的都是8.4秒(准确时间是MtkAACExtra ...

  8. Java 获取opus 音频文件时长

    当时为了获取时长花费好长时间,所以现在写出这文章以免后面有遇到该问题不止如何解决花费太长时间.话不多说,上代码 需要的依赖包有 <!-- https://mvnrepository.com/ar ...

  9. FFMPEG操作流数据-获取aac音频文件

    多媒体文件是一个容器,在容器里有很多的流(Stream/Track[翻译:轨]),如视频流.音频流.字幕流等. 常见操作 解复用 获取流(AVStream) 读数据包(AVPacket) 解码/编码( ...

  10. Python获取mp3音频文件时长方法汇总

    '''pymediainfo: pip3 install pymediainfo 版本:5.1.0不支持网络音频 ''' class pymediainfoTest():@classmethoddef ...

最新文章

  1. Python之父退休,C语言之父与世长辞,各大编程语言创始人现状盘点
  2. java使用sigar监控服务器
  3. [雪峰磁针石博客]2018最佳人工智能数据采集(爬虫)工具书下载
  4. 广州计算机应用能力考试,2017年广州职称计算机考试报名时间和科目
  5. 从C# 3.0说以人为本(二)—— LINQ语法结构
  6. 编程基本功:典型的柳氏风格命名一例
  7. ffmpeg API变更 2009-03-01—— 2017-05-09变更
  8. cnpack代码输入助手失效的解决办法
  9. 三线一控电动球阀、三线两控电动球阀、两线制断电开阀、两线制断电关阀四类电动球阀的区别
  10. [FFMPEG播放器]结合FFMPEG使用SDL2渲染ASS字幕
  11. 缓存着色技术(Cache Coloring)
  12. 【MTK Sensor2.0】SCP与AP数据流分析
  13. Dapper基础入门
  14. MATLAB算法实战应用案例精讲-【数据分析】时序异常检测(补充篇)(附Java、R语言和python代码实现)
  15. 微信小程序背景图真机显示不了
  16. jwt鉴权(react express jsonwebtoken)
  17. Uos统信系统 CA根证书搭建
  18. C#使用正则表达式验证电话号码、手机号、身份证号代码
  19. 神舟电脑装linux双系统,神舟战神笔记本:win10 安装 ubuntu 双系统
  20. 货币兑换(判断正环)

热门文章

  1. 计算机访问共享打印机无权限访问,Windows10电脑系统共享打印机无访问权限?详细解决步骤...
  2. 图像处理农业应用sci_新增3本SCI期刊,JCR二区、SCI, EI双收 录,影响因子多年增长...
  3. 第七周 项目4 - 队列数组
  4. 《时代》评出50个最酷网站
  5. 《世界历史》—史前时期的分期
  6. df.to_csv输出结果隔行多一个空行的解决办法
  7. Linux Stress测压工具安装与使用详解
  8. 9个优秀的标签云免费生成工具
  9. 【Android】通过芝麻认证进行实名认证
  10. SageMath域上多项式操作