如何用Python爬取喜马拉雅全网音频文件
Posted python6359
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Python爬取喜马拉雅全网音频文件相关的知识,希望对你有一定的参考价值。
什么是喜马拉雅
喜马拉雅FM是国内分享平台,3月手机客户端上线,两年多时间手机用户规模已突破2亿 [1] ,成为国内发展最快、规模最大的在线移动音频分享平台。
今天小编分享爬取喜马拉雅的单本全集的音频文件和全网站的音频
环境配置:
Windows + Python 3.6
爬取单本音频
1 import json 2 3 import re 4 5 import requests
爬取全站模块使用
1 import re 2 3 import requests 4 5 from lxml import etree 6 7 from onexima import Xima
其实你点开网站里面的任意一个音频都会发现他们都有一个ID
我们需要做的就是把每一个音频的ID和整个音频的ID获取、每本书籍的名称,然后保存下载
其实思路还是很简单的。
下面是爬取一本书籍的Python音频代码
1 import json 2 import re 3 4 import requests 5 #Python学习交流群:125240963,群内每天分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎各位小伙伴入群学习交流 6 7 class Xima(object): 8 def __init__(self, book_id, book_name): 9 # 保存文字用的 10 self.book_name = book_name 11 self.headers = { 12 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" 13 } 14 # 当前书的第一页的url, 把书的id留着就是为了咱们能够更方便的获取别的书的音频信息 15 self.start_url = "https://www.ximalaya.com/revision/play/album?albumId=%s&pageNum={}&sort=-1&pageSize=30" % book_id 16 # 当前书的每一页的url 17 self.book_url = [] 18 for i in range(8): # 如果想获得准备的多少页, 可以从第一页里面把多少页的信息找到, 然后放到range()里面 19 url = self.start_url.format(i + 1) 20 self.book_url.append(url) 21 # print(self.book_url) 22 23 24 def get_book_msg(self): 25 """获取到所有书的音频信息和书名""" 26 all_list = [] # 存储当前书的所有音频和书名信息 27 for url in self.book_url: 28 # 遍历每一页的url, 从中提取每一页的音频数据 29 r = requests.get(url, headers=self.headers) 30 python_dict = json.loads(r.content.decode()) # 得到第一页的所有书的字典数据 31 book_list = python_dict[‘data‘][‘tracksAudioPlay‘] # 第一页的所有书信息, 所有音频对应到的当前层次字典 32 for book in book_list: 33 # 遍历取出每一个音频的播放地址信息和名字放进字典 34 list = {} 35 list[‘src‘] = book[‘src‘] 36 list[‘name‘] = book[‘trackName‘] 37 # 所有单个音频都放进列表当中 38 all_list.append(list) 39 print(all_list) 40 return all_list 41 42 def save(self, all_list): 43 """保存每一本书到本地""" 44 # 遍历每一个音频, 然后保存 45 for i in all_list: 46 print(i) 47 # {‘src‘: ‘http://audio.xmcdn.com/group44/M01/67/B4/wKgKkVss32fCcK5xAIMTfNZL0Fo411.m4a‘, ‘name‘: ‘到日本投资民宿还能挣钱吗?‘} 48 i[‘name‘] = re.sub(‘"‘, ‘‘, i[‘name‘]) # 有些名字里面会带有", 这个时候, 因为转义的问题, 程序会报错, 所有我们得把"替换成空白, 49 with open(r‘xima/{}.m4a‘.format(self.book_name + i[‘name‘]), ‘ab‘) as f: 50 r = requests.get(i[‘src‘], headers=self.headers) 51 ret = r.content 52 # 获取到音频的二进制文件保存起来才是音频文件 53 f.write(ret) 54 55 def run(self): 56 """运行方法""" 57 all_list = self.get_book_msg() 58 self.save(all_list) 59 60 61 if __name__ == ‘__main__‘: 62 # 传进去当前书的json id, 才能得到正确的json数据 63 xima = Xima(‘3385980‘, ‘静说日本‘) 64 xima.run()
爬取全站音频代码
1 import re 2 import requests 3 from lxml import etree 4 from onexima import Xima 5 6 #Python学习交流群:125240963,群内每天分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎各位小伙伴入群学习交流 7 def get_id(): 8 """获取排行榜每一本书的信息""" 9 main_url = "https://www.ximalaya.com/shangye/top/" 10 headers = { 11 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" 12 } 13 r = requests.get(main_url, headers=headers) 14 # 获取到当前页面的xml数据 15 html = etree.HTML(r.content.decode()) 16 # 得到每一本书的位置的信息 17 div_list = html.xpath("//div[contains(@class,‘e-2997888007 rrc-album-item‘)]") 18 all_lsit = [] # 待会把每一本书的音频以字典形式放进列表当中 19 for div in div_list: 20 author = {} # 创建一个列表, 我们要获取书的id和书的名字, 并且一一对应 21 r = div.xpath("./a/@href")[0] # 获取到当前书的id所在信息, 数据为: /renwen/4859823/ 22 print(r) 23 # 所以得通过正则把正确的id取出来, id是为了传入正确的id, 得到正确的json数据 24 author[‘id‘] = re.search(r‘/.*?/(.*)/‘, r).group(1) 25 author[‘book_name‘] = div.xpath("./a/div[3]/div[1]/span/text()")[0] 26 # 向列表中传入每一个音频的信息 27 all_lsit.append(author) 28 print(all_lsit) 29 return all_lsit 30 31 32 # 调用函数得到所有每一本书的信息, 是一个列表类型 33 all_lsit = get_id() 34 for i in all_lsit: 35 # 遍历列表, 把每本书对应的id和对应的书名传到类里面去 36 x = Xima(i[‘id‘], i[‘book_name‘]) 37 x.run()