如何用Python爬取喜马拉雅全网音频文件

2018-07-06 01:19:31来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

如何用Python爬取喜马拉雅全网音频文件

 

什么是喜马拉雅

喜马拉雅FM是国内分享平台,3月手机客户端上线,两年多时间手机用户规模已突破2亿 [1] ,成为国内发展最快、规模最大的在线移动音频分享平台。

如何用Python爬取喜马拉雅全网音频文件

 

今天小编分享爬取喜马拉雅的单本全集的音频文件和全网站的音频

环境配置:

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

如何用Python爬取喜马拉雅全网音频文件

 

我们需要做的就是把每一个音频的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()

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:养成这8个编程习惯,你的Python性能将蹭蹭蹭地往上涨

下一篇:《11招玩转网络安全》之第二招:漏洞扫描