post获取重定向的链接 python_欧美音乐网站Python爬虫项目实战
爬蟲項目實戰
0x01 目標分析
最近發現一個比較好的歐美音樂下載網站,可以下載大部分高質量歐美音樂。該爬蟲項目要實現自動化批量獲取用戶想要下載的音樂。本文從網站分析、爬蟲設計、代碼實現三個方面出發,系統介紹該爬蟲項目。項目完整代碼在Github中可以獲得Github MusicDownload?https://github.com/ctlyz123/MusicDownload
0x1 音樂搜索界面
在搜索頁面輸入想要音樂的名稱,就可以搜索到類似的音樂。
分析搜索音樂的發送流程,在chrome中F12查看數據包內容
具體數據包內容如下,q參數為查詢參數,向mp3quack.com發送請求
Request URL: https://mp3quack.com/?q=Lover
Request Method: GET
Status Code: 301
Remote Address: 127.0.0.1:1080
Referrer Policy: no-referrer-when-downgrade
與想象中不同的是回應包是個重定向包,重定向網址是音樂的介紹網址,內容如下:
location: https://lover.mp3quack.com/
pragma: no-cache
server: cloudflare
status: 301
taken-time: 2 ms
0x2 音樂下載界面
1 獲取音樂編碼
每個音樂下載界面都是https://mp3pro.xyz/ 加一串字符該字符的獲取在音樂介紹網址對應上節就是 https://lover.mp3quack.com/
2 獲取音樂token1
在本網站要有音樂token2和音樂code編碼兩個東西才能定位和下載音樂,但是token2的獲取需要token1,所以首先要找到token1,獲取token1的方法還是通過數據包中尋找,發現下面數據包
該數據包請求格式為
Request URL: https://mp3pro.xyz/ajax
Request Method: POST
Status Code: 200
Remote Address: 127.0.0.1:1080
Referrer Policy: no-referrer-when-downgrade
purpose: audio
token: cvUAzpn48xA:e70b1595e566ec841c9a11f920ac5b5b
最終在https://mp3pro.xyz/cvUAzpn48xA 網頁源碼找到token內容
有了token1就可以獲取token2了通過https://mp3pro.xyz/ajax 處理的響應包為
{"status":true,"cache":true,"audio":"cvUAzpn48xA:87bc4a8ef51006bd4d8a953e44c04caf"}
0x3 獲取下載網址
通過token2 發送 如下請求即可獲取網址
Request URL: https://mp3pro.xyz/ajax
Request Method: POST
Status Code: 200
Remote Address: 127.0.0.1:1080
Referrer Policy: no-referrer-when-downgrade
purpose: download
token: cvUAzpn48xA:87bc4a8ef51006bd4d8a953e44c04caf
f: 0
d: 0
b: 320
c: 1
r: https://mp3pro.xyz/cvUAzpn48xA
在上面的數據請求中需要獲取音樂編碼和音樂token2,我們現在都以具備,看一下響應包:
{"status":true,"mp3url":"http:\/\/nl04.mp3pro.xyz\/7cb1bf3c5a39d7223b3d0\/Taylor%20Swift%20-%20Lover.mp3"}
響應包中的mp3url就是音樂的下載鏈接
0x02 流程設計
有了上述的簡單分析,我們初步可以實現單個音樂的下載,本節設計代碼結構,利用一些設計方法和思想,把大概框架梳理一下。
0x1 模塊梳理
按照功能劃分模塊,本文想要實現的是一個多線程大批音樂鏈接獲取和下載功能。
音樂下載鏈接生成模塊
音樂下載模塊
多線程模塊
綜合管理控制模塊
為了方便后期擴展,在各個模塊之間采用的依賴關系,相互關系如下
在main.py中向controller模塊傳遞一個模塊類和兩個模塊對象,實現模塊的整合。整合代碼和模塊內容在代碼實現中講解。
0x2 配置文件
為方便配置,將配置以json的格式存儲,利用Utils模塊進行配置文件加載 配置文件格式如下:
{
"Url": {
"Main_url": "https://mp3quack.com",
"Mid_url": "https://mp3pro.xyz"
},
"Dir": {
"Save_Path": "Music"
},
"File":{
"MusicList": "Config/MusicList"
}
}
相關加載代碼
def loadconfig(filename):
import json
json_data = {}
with open(filename) as f:
json_data = json.load(f)
return json_data
0x03 代碼實現
分模塊進行介紹,主要包含
鏈接生成模塊
多線程模塊
下載模塊
綜合管理模塊
在這之前先看下主函數整合邏輯
0x1 main.py
# -----------------load config--------------------
configpath = "Config/config.json"
configs = loadconfig(configpath)//加載配置文件
dir_config = configs["Dir"]
file_config = configs["File"]
# -----------------create classes--------------
builder = Builder(configpath)
downloader = Downloader(dir_config["Save_Path"])
controller = Controller(file_config["MusicList"])
# ----------------auto download----------------
controller = controller.init(downloader,builder,ThreadDownload)
controller.AutoDownload()
代碼比較簡潔,分為三個步驟 加載配置文件、創建類和對象、生成鏈接下載器
0x2 鏈接生成模塊
主要分為四個步驟 獲取音樂碼、獲取token1、獲取token2、獲取鏈接
1.獲取音樂碼
search_url = "%s/?q=%s"%(self.urlconfig["Main_url"],quote(music_name))
content = requests.get(search_url).content
Music_code = re.findall("vi\/(.*)\/maxresdefault\.jpg",str(content))[0]
獲取配置文件中Main_url字段,訪問查詢頁面,利用正則匹配找到對應的音樂code
2.獲取token1
mid_url = "%s/%s"%(self.urlconfig["Mid_url"],Music_code)
content = requests.get(mid_url).content
m_token = re.findall('token":"(.*)","verify"',str(content))[0]
訪問配置文件中Mid_url鏈接,將獲取的music code加到鏈接里面,通過正則尋找token位置和內容。
3.獲取token2
data = {
"purpose": "audio",
"token": m_token,
}
req = requests.post("https://mp3pro.xyz/ajax",data=data)
res_json = json.loads(bytes.decode(req.content))
code_token = res_json["audio"]
帶著token1訪問ajax接口,利用json格式解析返回的內容,取出audio字段。該字段中存儲著token2的值。
4.獲取鏈接
data = {
"purpose":"download",
"token":code_token,
"f":0,
"d":0,
"b":320,
"c":1,
"r":"https://mp3pro.xyz/{}".format(code_token.split(":")[0])
}
req = requests.post("https://mp3pro.xyz/ajax", data=data)
res_json = json.loads(bytes.decode(req.content))//json解析response
再次利用ajax請求,將post數據設置為上述格式就可以獲取到下載鏈接了,效果圖如下
0x3 多線程模塊
def __init__(self,builder,downloader,MusicName):
self.builder = builder
self.downloader = downloader
self.MusicName = MusicName
def run(self):
Musicurl = self.builder.create(self.MusicName)
print(self.MusicName.strip(),":",Musicurl)
# self.downloader.download(Musicurl,self.MusicName)//下載音樂
利用依賴的方式調用各個模塊,注釋的一行可以從鏈接中下載音樂內容。
0x4 下載模塊
req = requests.get(url,stream=True)//采用流模式
with open(os.path.join("Music",MusicName+".mp3"), "wb") as f:
for chunk in req.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
采用requests數據流模式,分塊下載數據,每次下載chunk_size大小
0x5 綜合管理模塊
def AutoDownload(self):
MusicsName = readfile(self.list_filename)
logging.info("[+] Begin Download")
threads = []
threadPool = ThreadPoolExecutor(max_workers=10)//設置線程數
for MusicName in MusicsName:
thread = self.treadownload(self.builder,self.downloader,MusicName.strip())
threadPool.submit(thread.run)//注冊線程函數
threadPool.shutdown(wait=True)//等待所有線程
logging.info("[+] Download Successful")
第五行利用ThreadPoolExecutor設置線程池大小為10,也就是最多有10個線程同時運行。第8行,注冊線程中的主函數,也就是音樂鏈接和下載功能。
0x04 總結
本文通過分析音樂網站的下載方式,梳理單個音樂下載方法,設計代碼結構模塊,采用依賴方法將各個模塊整合一起,實現多線程多音樂鏈接獲取和下載功能。這里的核心在于token1和token2的獲取和利用方面,其次是設計代碼模塊和銜接模塊。希望大家能通過本文學習到關于python和爬蟲的相關知識。
Usage:將要下載的音樂寫在Config文件夾中的MusicList里面按照這種格式,執行main.py就會自動生成下載鏈接。
LoverHello
Venom
Everthing I Need
總結
以上是生活随笔為你收集整理的post获取重定向的链接 python_欧美音乐网站Python爬虫项目实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的迭代器类中有哪些类_java中
- 下一篇: python分词_Python 结巴分词