前一段时间在廖雪峰老师的博客上跟着学了一遍python3,决定试着写一个简单的爬虫程序。工作中有同事问我喜马拉雅上的音频怎么下载,我都是让他们去到浏览区缓存文件夹里去找,改下后缀为mp3就可以播放了,这次写这个爬虫程序其实是为了解决上面的问题,给一个喜马拉雅上的专辑链接,可以把专辑里的音频全部下载到本地。
以前做过音箱的嵌入式网络开发,当时用的豆瓣电台,直接请求某个歌曲,返回的html页面中直接有音频源的地址,再去下载就ok了,但是喜马拉雅的专辑页面的html中除了歌曲id,看不到下载链接,为了找下载链接花了些功夫,下面讲下如何搞到下载链接。
例如我们要下载薛之谦的一个专辑:http://www.ximalaya.com/15794559/album/289316
在浏览器中查看该页面源码,并没有歌曲的下载链接,只有专辑中歌曲的sound id:

<li sound_id="25890774" class=""><div class="miniPlayer3"><a class="playBtn"></a><a class="title" href="/15794559/sound/25890774" hashlink title="黄色枫叶">黄色枫叶</a>

在专辑页面打开浏览器的开发者模式,点击除了第一首之外的另一首歌,再点击播放按钮,发现有个json访问:

我们手动打开这个json访问地址,bingo,找到下载地址了!
大家可以试试:
http://www.ximalaya.com/tracks/25890774.json

"id":25890774,"play_path_64":"http://audio.xmcdn.com/group21/M03/6D/D0/wKgJLVg6oPuweFTLAB9ztmnU5ro958.m4a","play_path_32":"http://audio.xmcdn.com/group21/M03/6D/AC/wKgJKFg6oPeS2COzAAwI3QOZNsY252.m4a","play_path":"http://audio.xmcdn.com/group21/M03/6D/D0/wKgJLVg6oPuweFTLAB9ztmnU5ro958.m4a",

概括下上面的过程:
1. 获得专辑的html页面,从页面中提取每个歌曲的sound id
2. 分别取出sound id,拼接处json访问的地址,访问json链接
3. 从返回的json字符串中获取音频地址,下载到本地

直接上代码:

from html.parser import HTMLParser
from urllib import request
import json
import os
import sys
import re
#提取sound id,提取专辑名称用于创建该专辑文件夹
class AlbumEventHtmlParser(HTMLParser):sound_ids = []album_title = "";title_flag = Falsedef __init__(self):  HTMLParser.__init__(self)self.sound_ids = []self.album_title = ""def handle_starttag(self, tag, attrs):if tag == 'li': for name, value in attrs: if name == 'sound_id': self.sound_ids.append(value)if tag == 'title':self.title_flag = Truedef handle_data(self, data):if self.title_flag:rstr_list = re.findall(r"【(.*)】", data)self.album_title = rstr_list[0]print(self.album_title)self.title_flag = Falsedef parse_python_events():album_addrs = []album_folder = ""#本地文件存储专辑链接地址,可以一次下载多个专辑with open('albumaddr.txt','r') as addr_file:album_addrs = addr_file.readlines()for addr in album_addrs:sound_ids = []parser = AlbumEventHtmlParser()with request.urlopen(addr) as album_file:html = album_file.read().decode('utf-8')parser.feed(html)sound_ids = parser.sound_ids;if len(sound_ids)>0:album_folder = parser.album_title;if not os.path.exists(os.curdir + '/' + album_folder):os.mkdir(os.curdir + '/' + album_folder)else:print("You have already downloaded the album: %s" % album_folder)continueelse:print("There is no sound: %s" % addr)continuefor sound_id in sound_ids:       with request.urlopen(('http://www.ximalaya.com/tracks/' + sound_id + '.json')) as music_f:music_json = json.loads(music_f.read().decode('utf-8'))print(music_json['title']+'downloding...')request.urlretrieve(music_json['play_path'], './' + album_folder + '/' + music_json['title'] + '.mp3')print(music_json['title']+'downloaded')    parse_python_events()

用Python在喜马拉雅音乐爬虫小试相关推荐

  1. Python网易云音乐爬虫大数据分析可视化系统——大屏数据可视化开发之路

    介绍 现在比较流行的大数据数据可视化都是大屏,有钱的人会使用阿里云全家桶的DataV或者商业化的大屏解决方案,但是在国内还是小公司比较多,本人50年大数据开发经验,精通数据可视化,曾经处理过百万亿级别 ...

  2. 40行代码用python实现酷我音乐爬虫

    不多说直接上代码: import requests, osclass Spider:def __init__(self):self.singer_name = input('请输入要爬取的歌手名:') ...

  3. python 喜马拉雅_Python爬虫:喜马拉雅FM

    Python爬虫:喜马拉雅FM 编程派微信号:codingpy 自己喜欢在上班的途中听点有声书,所以经常在喜马拉雅上找资源,要找到一个好听的节目不容易,虽然在喜马拉雅官网上可以按分类来看,但是却不能按 ...

  4. 零基础也能看懂python_零基础也能看懂的Python下载网易云音乐爬虫

    Python Selenium(配置方法参照:Selenium配置) Chrome浏览器(其它的也可以,需要进行相应的修改) 解析 以前抓取过网易云网页的朋友可能都清楚网易云有反爬虫策略的,post时 ...

  5. Python3+scrapy 爬取喜马拉雅音乐 音乐和歌名 最简单的爬虫

    初学scrapy并爬取 喜马拉雅音乐想和大家分享分享 一 .分析数据 二 .分析完啦 话不多说 给各位看官上代码! 具体代码如下 这就是一个简单的爬虫爬取 喜马拉雅的歌曲 ? 本人仍在继续爬着!!!! ...

  6. python爬虫实例网易云-Python3爬虫实例之网易云音乐爬虫

    本篇文章给大家带来的内容是Python3爬虫实例之网易云音乐爬虫.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 此次的目标是爬取网易云音乐上指定歌曲所有评论并生成词云 具体步骤: ...

  7. python 喜马拉雅 音乐下载 演示代码

    python 喜马拉雅 音乐下载 演示代码 1.主程序文件 import os import jsonimport requests from contextlib import closing fr ...

  8. python爬取虾米音乐_虾米音乐爬虫

    虾米音乐爬虫 这是前后端分析的网站,这种类型的web其实很好的,只要找对了API,成功发生请求,那么想要的数据就直接获取到了 请求分析,主要知道APi的地址,请求的参数,请求的方式,还有就是请求头需要 ...

  9. pycharm喜马拉雅音乐抓取

    喜马拉雅近期做了反爬,用requests请求页面得到的是空白,所以应该是改成动态的了,然后使用selenium+webdriver来获取的,webdriver可以设置成不打开浏览器,一定要想着关闭时用 ...

最新文章

  1. 好爽!我在上海被机器人“马杀鸡”了
  2. cv2.calcOpticalFlowFarneback integer argument expected, got float
  3. 【译】ICO 2.0 — The Advent of What Crypto-Fund Raising Should Really Look Like
  4. Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别
  5. 询问HTG:白噪声屏幕保护程序,有效的文件命名以及从密码泄露中恢复
  6. [Leedcode][JAVA][第837题][新21点][动态规划][数学]
  7. 在Mybatis中处理sql中的大于号小于号
  8. Mac OSX Android 开发环境 模拟器报错
  9. unity3d所要知道的基础知识体系大纲,可以对照着学习
  10. 计算机二级c语言考试题型及分值,全国计算机二级C语言考试题型及考试重点
  11. USB 打印机 模拟 LPT 接口
  12. 利用Eigen求广义逆矩阵
  13. 分页抓取链家房源信息 xpath selenium
  14. (专升本)信息安全(应用安全策略、网络安全策略)
  15. unity从0开始摸鱼日记15,再接再厉
  16. 【Android】RecycleView简单仿漫画APP图片相关样式
  17. 【Oracle】ORA-06553: PLS-306: wrong number or types of arguments in call to ‘存储过程‘
  18. android 字体颜色 渐变色,Android渐变色处理
  19. mysql 多表 left join_MySql left join 多表连接查询优化语句
  20. Python自动化办公:pandas入门教程

热门文章

  1. HG_REPMGR autofailvoer自动故障转移
  2. 准备启动一个开源项目 - 技术族谱 - 先期利用Goolge云计算平台
  3. 解决office word 2016升级后工具栏无Mathtype
  4. 程序员之路:护眼豆沙绿颜色值
  5. 【新知实验室】TRTC
  6. 基于R语言的方差分析及多重比较
  7. Go-Proxy-Checker,一款基于Go编写的高性能代理服务器验证工具
  8. 夜雨数竞笔记-不定积分(1)-换元法-倒代换
  9. spi通讯不需要地线吗_SPI通信时是不是主机和从机的MISO、MOSI两根线应该交叉接呀?...
  10. 单个正态总体均值的置信区间