post获取重定向的链接 python_欧美音乐网站Python爬虫项目实战
爬蟲(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)生成下載鏈接。
LoverHello
Venom
Everthing I Need
總結(jié)
以上是生活随笔為你收集整理的post获取重定向的链接 python_欧美音乐网站Python爬虫项目实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java的迭代器类中有哪些类_java中
- 下一篇: python分词_Python 结巴分词