標籤:資料 今天 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爬取喜馬拉雅全網音頻檔案