日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

post获取重定向的链接 python_欧美音乐网站Python爬虫项目实战

發布時間:2024/7/23 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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就會自動生成下載鏈接。

Lover
Hello
Venom
Everthing I Need

總結

以上是生活随笔為你收集整理的post获取重定向的链接 python_欧美音乐网站Python爬虫项目实战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。