python爬蟲實戰練習 --- 喜馬拉雅免費音頻 下載到本地

一、分析網站結構,尋找音頻實際下載地址

        隨便找個免費聽的音頻列表: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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章