一、分析網站結構,尋找音頻實際下載地址
隨便找個免費聽的音頻列表:https://www.ximalaya.com/youshengshu/12576446/
可以看到結構很明顯,a標籤裏的title是章節名,href屬性是章節鏈接
我們點進去一篇看看,選中Media 發現沒有我們需要的音頻文件,那是因爲音頻沒播放
點播放後出現了實際地址, 3個都一樣內容
將該地址放入網址
https://audio.cos.xmcdn.com/group38/M03/33/B0/wKgJo1qCiJfh31OVADfpIBp6vqM985.m4a
成功播放。 先別高興太早~ 這只是一個音頻地址 我想下載列表全部地址咋辦呢??
-----------------------------------------------------------------------------------------------------------------------
此時有2個辦法找下載地址的出處, 它是怎麼來的
1.第一種
找到看起來像是唯一的標識 比如 音頻下載地址中的 wKgJo1qCiJfh31OVADfpIBp6vqM985 去搜索全局
找到一個請求,看它的請求結果Response
請求頭:
請求頭:https://www.ximalaya.com/revision/play/v1/audio?id=67064624&ptype=1
請求結果:{"ret":200,"data":{"trackId":67064624,"canPlay":true,"isPaid":false,"hasBuy":true,"src":"https://audio.cos.xmcdn.com/group38/M03/33/B0/wKgJo1qCiJfh31OVADfpIBp6vqM985.m4a","albumIsSample":false,"sampleDuration":135,"isBaiduMusic":false,"firstPlayStatus":true}}
果然是的 一段json數據裏 有音頻下載地址
2.第二種
不選擇Media 選中All 顯示全部請求,再去播放音頻
你會看到多出這些請求, 一個個點進去看Response ,你會發現
它的請求結果是一段json內容 和方法1一樣
請求結果:{"ret":200,"data":{"trackId":67064624,"canPlay":true,"isPaid":false,"hasBuy":true,"src":"https://audio.cos.xmcdn.com/group38/M03/33/B0/wKgJo1qCiJfh31OVADfpIBp6vqM985.m4a","albumIsSample":false,"sampleDuration":135,"isBaiduMusic":false,"firstPlayStatus":true}}
data下的src就是實際下載地址 。
-----------------------------------------------------------------------------------------------------------------------
OK 前後都串聯起來了
音頻下載地址json數據的請求接口:https://www.ximalaya.com/revision/play/v1/audio?id=67064624&ptype=1
當前章節的鏈接:https://www.ximalaya.com/youshengshu/12576446/67064624
主頁列表下的章節鏈接:/youshengshu/12576446/67064624
其中 12576446 音頻ID 67064624是章節ID
思路有了!!!
1.在主頁循環獲取所有章節ID拼接成音頻下載的請求鏈接
2.請求下載接口獲取json數據
3.提取json數據中的實際下載地址,請求它,轉爲二進制保存到本地 格式mp4
二、確定思路,開始敲代碼
現在代碼敲起來就很明確,直接上源碼,就不一點點說是怎麼敲的啦,有註釋
模塊有點多,用tkinter畫了個界面方便操作。 下面有源碼+成品的下載地址
import requests #數據挖掘
from lxml import etree #數據清洗
import time
import json
import tkinter #TK界面
import sys # 用來控制程序關閉
import os #文件
import threading #線程
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
}
def createUI():
MainInterface = tkinter.Tk() #初始化界面
MainInterface.title("喜馬拉雅音頻下載器 QQ463392823")
MainInterface.geometry('600x200')
label1=tkinter.Label(MainInterface,text='').grid(row=0,column=0) #間隔符
#創建標籤
label1=tkinter.Label(MainInterface,text='音頻列表網址:',bg='pink',font=('Arial',12),width=12,heigh=1)
label1.grid(row=1,column=0) #放置標籤
global mp4url
#單行輸入文本
mp4url=tkinter.Entry(MainInterface,width=50)
mp4url.grid(row=1,column=1)
label1=tkinter.Label(MainInterface,text='').grid(row=2,column=0) #間隔符
#創建按鈕
button1=tkinter.Button(MainInterface,text='開始下載',bg='yellow',font=('Arial',14),command=qd)
button1.grid(row=3,column=1)
button2=tkinter.Button(MainInterface,text='停止下載',bg='yellow',font=('Arial',14),command=enddown)
button2.grid(row=4,column=1)
label1=tkinter.Label(MainInterface,text='保存的路徑=> c:/喜馬拉雅下載').grid(row=5,column=1)
label1=tkinter.Label(MainInterface,text='').grid(row=6,column=0) #間隔符
MainInterface.mainloop() #循環顯示界面
'''
音頻詳情頁地址
https://www.ximalaya.com/youshengshu/12576446/67064624
https://www.ximalaya.com/youshengshu/12576446/67064625
https://www.ximalaya.com/youshengshu/12576446/67064626
音頻地址json信息
https://www.ximalaya.com/revision/play/v1/audio?id=67064624&ptype=1
https://www.ximalaya.com/revision/play/v1/audio?id=67064625&ptype=1
https://www.ximalaya.com/revision/play/v1/audio?id=67064626&ptype=1
實際下載地址
https://audio.cos.xmcdn.com/group44/M0B/9D/3F/wKgKkVsI3Qqx5Y4iAD5LfSCEmC8942.m4a
'''
def enddown():
sys.exit(0)
def qd():
print("開啓線程執行任務")
t1 = threading.Thread(target=stadown)
t1.setDaemon(True)
t1.start()
# 通過音頻列表 獲取所有音頻實際下載鏈接
def stadown():
# 下載一個音頻
res=requests.get(mp4url.get(),headers=headers)
# print(res.text)
html=etree.HTML(res.text)
data = html.xpath('//div[@class="text _Vc"]/a')
for i in data:
# print(i.get('title'))
# print(i.get('href'))
title = i.get('title')
# 通過ID 拼接實際下載地址的json信息
downurl='http://www.ximalaya.com/revision/play/v1/audio?id=' + i.get('href').split('/')[3] + '&ptype=1'
# print(downurl)
res=requests.get(downurl,headers=headers)
# print(res.text)
# 獲取實際下載地址
src = json.loads(res.text)["data"]["src"]
print('正在下載'+title)
mp4code=requests.get(src,headers=headers).content
file=open("C:\\喜馬拉雅下載\\"+title+".mp4","wb")
file.write(mp4code)
file.close()
time.sleep(3)
#檢測目錄
def jcos():
dirs='c:/喜馬拉雅下載'
if not os.path.exists(dirs): #不存在則創建
os.makedirs(dirs)
jcos()
createUI()
源碼+成品鏈接:https://download.csdn.net/download/qq_18816201/12318891