用Python在喜马拉雅音乐爬虫小试
前一段时间在廖雪峰老师的博客上跟着学了一遍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在喜马拉雅音乐爬虫小试相关推荐
- Python网易云音乐爬虫大数据分析可视化系统——大屏数据可视化开发之路
介绍 现在比较流行的大数据数据可视化都是大屏,有钱的人会使用阿里云全家桶的DataV或者商业化的大屏解决方案,但是在国内还是小公司比较多,本人50年大数据开发经验,精通数据可视化,曾经处理过百万亿级别 ...
- 40行代码用python实现酷我音乐爬虫
不多说直接上代码: import requests, osclass Spider:def __init__(self):self.singer_name = input('请输入要爬取的歌手名:') ...
- python 喜马拉雅_Python爬虫:喜马拉雅FM
Python爬虫:喜马拉雅FM 编程派微信号:codingpy 自己喜欢在上班的途中听点有声书,所以经常在喜马拉雅上找资源,要找到一个好听的节目不容易,虽然在喜马拉雅官网上可以按分类来看,但是却不能按 ...
- 零基础也能看懂python_零基础也能看懂的Python下载网易云音乐爬虫
Python Selenium(配置方法参照:Selenium配置) Chrome浏览器(其它的也可以,需要进行相应的修改) 解析 以前抓取过网易云网页的朋友可能都清楚网易云有反爬虫策略的,post时 ...
- Python3+scrapy 爬取喜马拉雅音乐 音乐和歌名 最简单的爬虫
初学scrapy并爬取 喜马拉雅音乐想和大家分享分享 一 .分析数据 二 .分析完啦 话不多说 给各位看官上代码! 具体代码如下 这就是一个简单的爬虫爬取 喜马拉雅的歌曲 ? 本人仍在继续爬着!!!! ...
- python爬虫实例网易云-Python3爬虫实例之网易云音乐爬虫
本篇文章给大家带来的内容是Python3爬虫实例之网易云音乐爬虫.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 此次的目标是爬取网易云音乐上指定歌曲所有评论并生成词云 具体步骤: ...
- python 喜马拉雅 音乐下载 演示代码
python 喜马拉雅 音乐下载 演示代码 1.主程序文件 import os import jsonimport requests from contextlib import closing fr ...
- python爬取虾米音乐_虾米音乐爬虫
虾米音乐爬虫 这是前后端分析的网站,这种类型的web其实很好的,只要找对了API,成功发生请求,那么想要的数据就直接获取到了 请求分析,主要知道APi的地址,请求的参数,请求的方式,还有就是请求头需要 ...
- pycharm喜马拉雅音乐抓取
喜马拉雅近期做了反爬,用requests请求页面得到的是空白,所以应该是改成动态的了,然后使用selenium+webdriver来获取的,webdriver可以设置成不打开浏览器,一定要想着关闭时用 ...
最新文章
- 好爽!我在上海被机器人“马杀鸡”了
- cv2.calcOpticalFlowFarneback integer argument expected, got float
- 【译】ICO 2.0 — The Advent of What Crypto-Fund Raising Should Really Look Like
- Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别
- 询问HTG:白噪声屏幕保护程序,有效的文件命名以及从密码泄露中恢复
- [Leedcode][JAVA][第837题][新21点][动态规划][数学]
- 在Mybatis中处理sql中的大于号小于号
- Mac OSX Android 开发环境 模拟器报错
- unity3d所要知道的基础知识体系大纲,可以对照着学习
- 计算机二级c语言考试题型及分值,全国计算机二级C语言考试题型及考试重点
- USB 打印机 模拟 LPT 接口
- 利用Eigen求广义逆矩阵
- 分页抓取链家房源信息 xpath selenium
- (专升本)信息安全(应用安全策略、网络安全策略)
- unity从0开始摸鱼日记15,再接再厉
- 【Android】RecycleView简单仿漫画APP图片相关样式
- 【Oracle】ORA-06553: PLS-306: wrong number or types of arguments in call to ‘存储过程‘
- android 字体颜色 渐变色,Android渐变色处理
- mysql 多表 left join_MySql left join 多表连接查询优化语句
- Python自动化办公:pandas入门教程
热门文章
- HG_REPMGR autofailvoer自动故障转移
- 准备启动一个开源项目 - 技术族谱 - 先期利用Goolge云计算平台
- 解决office word 2016升级后工具栏无Mathtype
- 程序员之路:护眼豆沙绿颜色值
- 【新知实验室】TRTC
- 基于R语言的方差分析及多重比较
- Go-Proxy-Checker,一款基于Go编写的高性能代理服务器验证工具
- 夜雨数竞笔记-不定积分(1)-换元法-倒代换
- spi通讯不需要地线吗_SPI通信时是不是主机和从机的MISO、MOSI两根线应该交叉接呀?...
- 单个正态总体均值的置信区间