# -*- coding: utf-8 -*- """ Created on Sun Apr 5 11:58:25 2020 @author: 54861 """ import requests import math import os import re headers = { #'Referer': start_url, # 注意加上referer 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } """ 获取总视频数 参数:albumID 专辑ID """ def get_album_number(albumID): url = "https://www.ximalaya.com/revision/album?albumId="+str(albumID) resp = requests.get(url,headers = headers) result = resp.json() if result['ret'] == 200: cover = result['data']['mainInfo']['cover'] albumTitle = result['data']['mainInfo']['albumTitle'] count = result['data']['tracksInfo']['trackTotalCount'] else: cover='' albumTitle='' count = 0 return cover,albumTitle,count """ 获取一页音频信息 参数:albumID 专辑ID 参数:pageNum !!页码1开始!! """ def get_track_list(albumID, pageNum): trackList = [] url = "https://www.ximalaya.com/revision/album/v1/getTracksList?albumId="+str(albumID)+"&pageNum="+str(pageNum) resp = requests.get(url,headers = headers) result = resp.json() if result['ret'] == 200: tracks = result['data']['tracks'] for track in tracks: trackList.append({'trackId':track['trackId'],'title':track['title']}) return trackList """ 获取音频下载地址 参数:trackID 音频ID """ def get_track_url(trackID): url = "https://www.ximalaya.com/revision/play/v1/audio?id="+str(trackID)+"&ptype=1" resp = requests.get(url,headers = headers) result = resp.json() if result['ret'] == 200: src = result['data']['src'] if len(src) > 0: return src """ 下载音频 参数:url 音频下载地址 参数:file 文件本地路径 """ def download_track(url,file): resp = requests.get(url, headers = headers, stream = True) with open(file, 'wb') as f: for data in resp.iter_content(chunk_size = 1024): if data: f.write(data) """ 从一个字符串得到符合windows要求的文件名 """ def good_win_filename(title): rstr = r"[\/\\\:\*\?\"\<\>\|]" # '/ \ : * ? " < > |' new_title = re.sub(rstr, "_", title) # 替换为下划线 return new_title if __name__ == '__main__': albumId = 35958359 coverUrl,albumTitle,total = get_album_number(albumId) dir = 'ximalaya_m4a/' if not os.path.exists(dir):#创建专辑文件夹 os.makedirs(dir) dir = 'ximalaya_m4a/'+good_win_filename(albumTitle)+'/' if not os.path.exists(dir):#创建专辑文件夹 os.makedirs(dir) download_track("http:"+coverUrl,dir+"cover"+coverUrl[coverUrl.rindex('.'):])#下载封面 pageCount = math.ceil( total/30) i = 1 for pageNum in range(pageCount): trackList = get_track_list(albumId,pageNum+1) for track in trackList: trackUrl = get_track_url(track['trackId']) if trackUrl: ext = trackUrl[trackUrl.rindex('.'):] file_path = dir + good_win_filename(track['title']) + ext print ('downloading file:'+str(i)+"of"+str(total)+', page '+str(pageNum+1)+"of"+str(pageCount)+"\n"+ trackUrl + "\n"+track['title']) download_track(trackUrl, file_path) i = i + 1 print("\n\n"+str(i)+"files downed in:"+dir)