如何用Python爬取喜馬拉雅全網音頻檔案

來源:互聯網
上載者:User

標籤:資料   今天   color   零基礎   簡單   空白   基礎   form   取出   

 

什麼是喜馬拉雅

喜馬拉雅FM是國內分享平台,3月手機用戶端上線,兩年多時間手機使用者規模已突破2億 [1] ,成為國內發展最快、規模最大的線上移動音頻分享平台。

 

今天小編分享爬取喜馬拉雅的單本全集的音頻檔案和全網站的音頻

環境配置:

Windows + Python 3.6

爬取單本音頻

1 import json2 3 import re4 5 import requests

 

爬取全站模組使用

1 import re2 3 import requests4 5 from lxml import etree6 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_name11         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_id16         # 當前書的每一頁的url17         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_list41 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.content52                 # 擷取到音訊二進位檔案儲存起來才是音頻檔案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_lsit30 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()

 

如何用Python爬取喜馬拉雅全網音頻檔案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.