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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2024/7/23 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 post获取重定向的链接 python_欧美音乐网站Python爬虫项目实战 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

爬蟲(chóng)項(xiàng)目實(shí)戰(zhàn)

0x01 目標(biāo)分析

最近發(fā)現(xiàn)一個(gè)比較好的歐美音樂(lè)下載網(wǎng)站,可以下載大部分高質(zhì)量歐美音樂(lè)。該爬蟲(chóng)項(xiàng)目要實(shí)現(xiàn)自動(dòng)化批量獲取用戶想要下載的音樂(lè)。本文從網(wǎng)站分析、爬蟲(chóng)設(shè)計(jì)、代碼實(shí)現(xiàn)三個(gè)方面出發(fā),系統(tǒng)介紹該爬蟲(chóng)項(xiàng)目。項(xiàng)目完整代碼在Github中可以獲得Github MusicDownload?https://github.com/ctlyz123/MusicDownload

0x1 音樂(lè)搜索界面

在搜索頁(yè)面輸入想要音樂(lè)的名稱,就可以搜索到類似的音樂(lè)。

分析搜索音樂(lè)的發(fā)送流程,在chrome中F12查看數(shù)據(jù)包內(nèi)容

具體數(shù)據(jù)包內(nèi)容如下,q參數(shù)為查詢參數(shù),向mp3quack.com發(fā)送請(qǐng)求

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

與想象中不同的是回應(yīng)包是個(gè)重定向包,重定向網(wǎng)址是音樂(lè)的介紹網(wǎng)址,內(nèi)容如下:

location: https://lover.mp3quack.com/

pragma: no-cache

server: cloudflare

status: 301

taken-time: 2 ms

0x2 音樂(lè)下載界面

1 獲取音樂(lè)編碼

每個(gè)音樂(lè)下載界面都是https://mp3pro.xyz/ 加一串字符該字符的獲取在音樂(lè)介紹網(wǎng)址對(duì)應(yīng)上節(jié)就是 https://lover.mp3quack.com/

2 獲取音樂(lè)token1

在本網(wǎng)站要有音樂(lè)token2和音樂(lè)code編碼兩個(gè)東西才能定位和下載音樂(lè),但是token2的獲取需要token1,所以首先要找到token1,獲取token1的方法還是通過(guò)數(shù)據(jù)包中尋找,發(fā)現(xiàn)下面數(shù)據(jù)包

該數(shù)據(jù)包請(qǐng)求格式為

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 網(wǎng)頁(yè)源碼找到token內(nèi)容

有了token1就可以獲取token2了通過(guò)https://mp3pro.xyz/ajax 處理的響應(yīng)包為

{"status":true,"cache":true,"audio":"cvUAzpn48xA:87bc4a8ef51006bd4d8a953e44c04caf"}

0x3 獲取下載網(wǎng)址

通過(guò)token2 發(fā)送 如下請(qǐng)求即可獲取網(wǎng)址

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

在上面的數(shù)據(jù)請(qǐng)求中需要獲取音樂(lè)編碼和音樂(lè)token2,我們現(xiàn)在都以具備,看一下響應(yīng)包:

{"status":true,"mp3url":"http:\/\/nl04.mp3pro.xyz\/7cb1bf3c5a39d7223b3d0\/Taylor%20Swift%20-%20Lover.mp3"}

響應(yīng)包中的mp3url就是音樂(lè)的下載鏈接

0x02 流程設(shè)計(jì)

有了上述的簡(jiǎn)單分析,我們初步可以實(shí)現(xiàn)單個(gè)音樂(lè)的下載,本節(jié)設(shè)計(jì)代碼結(jié)構(gòu),利用一些設(shè)計(jì)方法和思想,把大概框架梳理一下。

0x1 模塊梳理

按照功能劃分模塊,本文想要實(shí)現(xiàn)的是一個(gè)多線程大批音樂(lè)鏈接獲取和下載功能。

  • 音樂(lè)下載鏈接生成模塊

  • 音樂(lè)下載模塊

  • 多線程模塊

  • 綜合管理控制模塊

為了方便后期擴(kuò)展,在各個(gè)模塊之間采用的依賴關(guān)系,相互關(guān)系如下

在main.py中向controller模塊傳遞一個(gè)模塊類和兩個(gè)模塊對(duì)象,實(shí)現(xiàn)模塊的整合。整合代碼和模塊內(nèi)容在代碼實(shí)現(xiàn)中講解。

0x2 配置文件

為方便配置,將配置以json的格式存儲(chǔ),利用Utils模塊進(jìn)行配置文件加載 配置文件格式如下:

{

"Url": {

"Main_url": "https://mp3quack.com",

"Mid_url": "https://mp3pro.xyz"

},

"Dir": {

"Save_Path": "Music"

},

"File":{

"MusicList": "Config/MusicList"

}

}

相關(guān)加載代碼

def loadconfig(filename):

import json

json_data = {}

with open(filename) as f:

json_data = json.load(f)

return json_data

0x03 代碼實(shí)現(xiàn)

分模塊進(jìn)行介紹,主要包含

鏈接生成模塊

多線程模塊

下載模塊

綜合管理模塊

在這之前先看下主函數(shù)整合邏輯

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()

代碼比較簡(jiǎn)潔,分為三個(gè)步驟 加載配置文件、創(chuàng)建類和對(duì)象、生成鏈接下載器

0x2 鏈接生成模塊

主要分為四個(gè)步驟 獲取音樂(lè)碼、獲取token1、獲取token2、獲取鏈接

1.獲取音樂(lè)碼

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字段,訪問(wèn)查詢頁(yè)面,利用正則匹配找到對(duì)應(yīng)的音樂(lè)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]

訪問(wèn)配置文件中Mid_url鏈接,將獲取的music code加到鏈接里面,通過(guò)正則尋找token位置和內(nèi)容。

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訪問(wèn)ajax接口,利用json格式解析返回的內(nèi)容,取出audio字段。該字段中存儲(chǔ)著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請(qǐng)求,將post數(shù)據(jù)設(shè)置為上述格式就可以獲取到下載鏈接了,效果圖如下

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)//下載音樂(lè)

利用依賴的方式調(diào)用各個(gè)模塊,注釋的一行可以從鏈接中下載音樂(lè)內(nèi)容。

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數(shù)據(jù)流模式,分塊下載數(shù)據(jù),每次下載chunk_size大小

0x5 綜合管理模塊

def AutoDownload(self):

MusicsName = readfile(self.list_filename)

logging.info("[+] Begin Download")

threads = []

threadPool = ThreadPoolExecutor(max_workers=10)//設(shè)置線程數(shù)

for MusicName in MusicsName:

thread = self.treadownload(self.builder,self.downloader,MusicName.strip())

threadPool.submit(thread.run)//注冊(cè)線程函數(shù)

threadPool.shutdown(wait=True)//等待所有線程

logging.info("[+] Download Successful")

第五行利用ThreadPoolExecutor設(shè)置線程池大小為10,也就是最多有10個(gè)線程同時(shí)運(yùn)行。第8行,注冊(cè)線程中的主函數(shù),也就是音樂(lè)鏈接和下載功能。

0x04 總結(jié)

本文通過(guò)分析音樂(lè)網(wǎng)站的下載方式,梳理單個(gè)音樂(lè)下載方法,設(shè)計(jì)代碼結(jié)構(gòu)模塊,采用依賴方法將各個(gè)模塊整合一起,實(shí)現(xiàn)多線程多音樂(lè)鏈接獲取和下載功能。這里的核心在于token1和token2的獲取和利用方面,其次是設(shè)計(jì)代碼模塊和銜接模塊。希望大家能通過(guò)本文學(xué)習(xí)到關(guān)于python和爬蟲(chóng)的相關(guān)知識(shí)。

Usage:將要下載的音樂(lè)寫在Config文件夾中的MusicList里面按照這種格式,執(zhí)行main.py就會(huì)自動(dòng)生成下載鏈接。

Lover
Hello
Venom
Everthing I Need

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。