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

爬虫项目实战

0x01 目标分析

最近发现一个比较好的欧美音乐下载网站,可以下载大部分高质量欧美音乐。该爬虫项目要实现自动化批量获取用户想要下载的音乐。本文从网站分析、爬虫设计、代码实现三个方面出发,系统介绍该爬虫项目。项目完整代码在Github中可以获得Github MusicDownload https://github.com/ctlyz123/MusicDownload

0x1 音乐搜索界面

在搜索页面输入想要音乐的名称,就可以搜索到类似的音乐。

47a624d69f8d732f8a2f962b5c3e5a73.png

分析搜索音乐的发送流程,在chrome中F12查看数据包内容

c6607bbdf04b7e8b986c6acce4ad04c8.png

具体数据包内容如下,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/

fa85d0ceaaa6aacf9cafcf9381ff8271.png

2 获取音乐token1

在本网站要有音乐token2和音乐code编码两个东西才能定位和下载音乐,但是token2的获取需要token1,所以首先要找到token1,获取token1的方法还是通过数据包中寻找,发现下面数据包

00c4c2bb43b5e8af96d6c897310273ac.png

该数据包请求格式为

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内容

2a141ea26a8354359666835c2b1760dc.png

有了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 模块梳理

按照功能划分模块,本文想要实现的是一个多线程大批音乐链接获取和下载功能。

  • 音乐下载链接生成模块

  • 音乐下载模块

  • 多线程模块

  • 综合管理控制模块

为了方便后期扩展,在各个模块之间采用的依赖关系,相互关系如下

d56f00e2c2d2e7d469f4e82747012b7f.png

在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数据设置为上述格式就可以获取到下载链接了,效果图如下

063dce2d23ebc0f5b8d36fac01100c4c.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国志愿者服务器注册,如何注册成为志愿者?中国志愿服务网注册流程

西宁市团员、团干、青年志愿者个人和组织网上注册方式为“志愿汇”和“全国志愿服务信息系统(www.chinavolunteer.cn)”两个网站平台双线注册。志愿者注册流程基本操作指引一、PC电脑端操作注:本篇内容较多,建议先“收藏”文章或点击底部“在看”。1、PC…

iview 级联选择组件_iviewui级联选择 如何自定义?

export default {data () {return {value2: [jiangsu, suzhou, zhuozhengyuan],data: [{value: beijing,label: 北京,children: [{value: gugong,label: 故宫},{value: tiantan,label: 天坛},{value: wangfujing,label: 王府井}]}, {value: jiangsu,label: 江苏,children: [{va…

python s d是什意思_python里d是什么意思

python中的fd()是turtle模块中的一个方法。fd 方法的实参是像素距离。turtle模块:它可以让你使用海龟图形(turtle graphics)绘制图像 turtle模块其中的函数: 1)turtle.pensize():设置线条的粗细&#xff1b…

计算机二级如何接受审阅者修订,操作方法 合并修订文档 步骤1 要求审阅者

工作中,经常需要将文档交予多人同时审阅,那么如何实现让多人同时修改一个文档呢?解决方案审阅者在修订模式下修改文档,再将所有的修订文档合并。操作方法合并修订文档步骤1 要求审阅者,在修订模式下,修改文档&#xf…

vue中的uri_浅谈vue-resource和vue-axios的区别

可能有的人对vue-resource 和vue-axios比较陌生,也可能用到了都不知道。他其实就是我们vue请求里面的 this.$http.*** 和 this.axios.***vue-resourcevue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应。也就是说&…

open表和closed表_011 Ruby 多Word表写入Excel

Hey,最近有很多粉丝私信询问,2020年已过半,又该统计半年报表信息了。你关心的是,Ruby能否像VBA、Python一样,实现多表格快速汇总?答案是肯定的。这期,为你讲解如何将多个Word表格汇总到Excel里。…

服务器响应options,HTTP发送对OPTIONS请求的响应[C]

在接收HTTP响应时出现Response is null错误。我正在开发一个使用行套接字的示例小型HTTP服务器C。HTTP发送对OPTIONS请求的响应[C]我的应用程序中实际上有2个服务器,一个是我用于提供HTML页面的标准Apache服务器,而我的小型服务器将只响应HTML页面中的Ja…

python数组排序sort_详解python中sort排序使用

1.前言 昨天一学妹问我一个关于python的问题,当时在外忙碌,没时间细看。今天看一下,咋一看我还真的不知道这个问题,bookinfo.sort(reverseTrue ,keylambda x:(x[1],x[1]/x[2]))是如何排序的。但是我猜测应该是按照第二个元素排序&…

审计工作存在的难点和问题_电力工程造价审计的难点与对策有哪些?学习安装电力造价广联达计价看这里!!...

目前电力工程审计的难度较大,对于审计人员的专业素质要求很高,尤其是在电力工程施工发生变动时,需要考虑工程的实际情况,及时对其进行工程造价审计。文章对电力工程造价审计中的难点进行了分析,并提出了相应的解决措施…

ajax实现一个前台的进度条,前台ajax实现上传文件并且有进度条

// ajax jQuery上传function UploadFile() {var xhrOnProgress function(fun) {xhrOnProgress.onprogress fun; //绑定监听//使用闭包实现监听绑return function() {//通过$.ajaxSettings.xhr();获得XMLHttpRequest对象var xhr $.ajaxSettings.xhr();//判断监听函数是否为函…

蒙特卡洛分析_随机模拟:马尔科夫链蒙特卡洛采样MCMC与EM算法「2.3」

最近学习了机器学习中的马尔科夫链蒙特卡洛(Markov Chain Monte Carlo, 简称MCMC) 相关的知识。主要内容包括:【1】蒙特卡洛原则,及其应用于采样的必要性(已经发布在头条)【2】用于求解最大似然、近似推断、期望问题的经典采样算法:Metropoli…

三维错切变换矩阵_图像的仿射变换

目录:概述图像基本变换仿射变换原理python实现一、概述图像的几何变换主要包括:平移、缩放、旋转、仿射、透视等等。图像变换是建立在矩阵运算基础上的,通过矩阵运算可以很快的找到不同图像的对应关系。理解变换的原理需要理解变换的构造方法…

app系统服务器出错怎么回事,app连接服务器出错

app连接服务器出错 内容精选换一换接口调用出错将无法获取建立相应隧道连接的必要信息,将无法正常建连云手机设备实例,具体报错示例如下:首先,尝试使用adb connect重新建立连接,依旧报错可通过查看安装目录下的日志adb…

js foreach 跳出循环_VUE.js

Vue.js模板语法vue.js使用了基于HTML的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据,其核心就是一个允许开发者采用简洁的模板语法来将数据渲染进DOM系统。使用各种组件来做成一个项目的话,需要结合单页应用。插值数据绑定最…

2异常处理_异常是什么?什么是常用类?

第一节 异常1. 异常的概念​ 异常(Exception) 即例外,程序没有按自己预想的结果运行出来,出现了非正常情况,即“程序得病了”。怎么让我们写的程序做出合理的处理,不至于崩溃是我们关注的核心。 异常机制就是当程序出现错误&#…

origin三元相图_扩增子图表解读7三元图:三组差异数量和关系

点击上方蓝色「宏基因组」关注我们!专业干货每日推送!背景介绍(Introduction)宏基因组学宏基因组学目前的主要研究方法包括:16S/ITS/18S扩增子、宏基因组、宏转录组和代谢组,其中以扩增子研究最为广泛。目的意义本系列文章将带领大…

写出python字符串三种常用的函数或方法_python中几种常用字符串函数

1、lower()把所有字符换成小写 2、upper()把所有字符换成大写 3、swapcase()大小写互换 4、title()把每个单词首字母大写,他是以所有英文字母的字符来区别是否为一个单词的,eg:s "a是傻b" s2 s.title() 结果为"A傻B",a和b都变成了大写,因为他是根据英文字…

python app开发模块_Python pytkapp包_程序模块 - PyPI - Python中文网

用于开发应用程序的python包 多文档/单文档界面 利用tkinter库和附加tkinter集 小部件。 查看可用演示: pytkapp/demo/run_ptapoptionsdemo.py-为选项的容器运行gui demo(可用的小部件、规则) pytkapp/demo/run_ptamdidemo.py-运行MDI应用程序…

搭建python_Crawlab准备之python+scrapy环境搭建

阅读文本大概需要3分钟。上篇《分布式爬虫管理平台Crawlab开发搭建》把爬虫的管理后台搭建起来了;捣鼓一番发现要真正爬取数据还有下不少的功夫。这篇看看怎么搭建pythonscrapy环境。0x01:安装Python3下载python安装包,具体版本根据自己的系统…

64测试cpu稳定性_SuperPI-圆周率计算与CPU性能与稳定性测试

Super PI是由东京大学Kanada lab出品的一款专用于检测CPU稳定性的软件,目前最新版本是1.9版,更新于2013年了。Super PI软件通过计算预定的圆周率让CPU高负荷运作,从而达到考验CPU计算的能力与稳定的作用。同时也能计算出圆周率来保存到文本文…