养成习惯,先赞后看!!!!

目录

  • 1.起因
  • 2.分析网页结构
  • 3.代码实现
    • 3.1请求网页
    • 3.2筛选数据
    • 3.3下载资源
    • 3.4编写简单页面
    • 3.5数据绑定
  • 4.源代码
  • 5.效果演示

1.起因

自己一直都想听胖伦的歌,但是网易云有下架了,其他音乐平台又需要会员
于是自己就尝试着看看能不能尝试通过爬虫把胖伦的歌下载下来。但是奈何博主自身的水平有限。如果直接通过QQ音乐等音乐网站爬的话,难度极大,毕竟腾讯他们也不是傻子,肯定是做好了一系列的反扒机制的。既然这样,那我们就要选择放弃了吗?经过百度,博主终于搜到了一个网站。
网站链接:http://music.onlychen.cn/

这个网站已经帮我们做好了解密的工作,我们只需要分析该网站的网页结构就行了。
虽然我们不能直接刚QQ音乐,但是我们刚这种网站还是没什么问题的

2.分析网页结构

首先按照惯例先分析网页结构
其实这里我们的工作就已经完成了,如果只想下载这一首七里香的话。但是博主我会是那样的人吗???肯定不是,博主的原则就是我全都要。

所以我们就要重新理清思路。我们整个的流程是啥???
之前我们爬虫的思路就是

现在我们的思路其实还是这个,但是大家发现了没有这次有我们能够直接请求的url地址吗?或者说这次我们直接请求这个url地址我们能够直接得到我们想要的信息吗?显然是不行的,我们必须进行form表单的提交就是下面这个操作:

这样提交完这些参数后,我们才真正能够获取到我们想要的网页。不清楚的话,我们 可以看下面这张图,大家就懂了。

请求到网页之后我们看我们获得信息到底是什么样的

3.代码实现

3.1请求网页

既然这样大致的过程我们已经懂了,接下来我们就来实现。
首先我们先将整个网页的请求信息拿下来。

headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',}url='http://music.onlychen.cn/'response=requests.get(url,headers=headers)print(response.content.decode('utf-8'))

但是我们发现这样请求之后却返回了这样的一个信息;

现在我们来思考,之前是要传入表单的数据的,既然需要传入数据那么一般就是用post请求,之前我们一直都是通过get请求来请求网页的。于是我们简单修改一下代码:

params={'input':'七里香','filter':'name','type':'qq','page':1,}headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',}url='http://music.onlychen.cn/'response=requests.post(url,headers=headers,data=params)print(response.content.decode('utf-8'))

但是我们这样改完之后仍然不能访问,之后我们重新去看一下网页的请求头,这时候我们发现一个东西:

这表示我们的请求是 异步的,所以我们必须把他也放到请求头之中,这样我们再来尝试一下,虽然信息我们是请求下来了,但是显然我们可以发现 中文根本无法显示,但是的确是我们之前看到的网页信息。

这时我们想想之前我们看到的网页信息,可以清楚的看到就是一个json数组,并不是HTML语言的格式,所以我们不能再用这种方式来解读网页信息,用下面这个:

print(response.json())

这样我们便能看到我们想要的数据了;

3.2筛选数据

既然数据我们已经请求到了,那么我们现在就应该做筛选我们需要的数据,因为这里的数据都是json格式的,所以不能通过之前我们使用的xpath来进行筛选了,但是json同样提供了相应的模块来帮助我们筛选数据那就是jsonpath,具体用法其实都一样,这里我就只写这两个范例了,剩下的大家可以自行百度:

    data=response.json()url=jsonpath.jsonpath(data,'$..url')[0]title=jsonpath.jsonpath(data,'$..title')[0]

3.3下载资源

这样我们就已经获得了我们所需要的资源的链接了,这样我们就能将它下载下来了
这里还是直接使用我们之前用的urllib.request.urlretrieve(url,path) 就可以实现了

def download(url,title):dir_name=r'D:\software\python\python爬虫\vip音乐'os.makedirs(dir_name,exist_ok=True)path=dir_name+'/{}.mp3'.format(title)print("正在下载:{}".format(title))urllib.request.urlretrieve(url,path)print("{},已经下载完毕".format(title))

3.4编写简单页面

到这里我们的爬虫就已经编写好了。但是博主我自己想了想能不能通过制作成一个应用,这样,那我就可以想下啥就下啥了,来说干就干。那么既然这样我们就需要首先需要一个页面,这里我选择的python中最简单的模块进行编写了,大家可以去选择更好的工具进行编写。

# 界面制作
from tkinter import *
# 创建一个窗口
root=Tk()
#初始化单选框的值就是将这些单选框组合起来
v = IntVar()
v.set(1)
# 添加标题
root.title('全网音乐下载器')
# 修改窗口大小
root.geometry('560x430+400+200')# 标签组件
label=Label(root,text='输入下载的歌曲名:',font=('黑体常规',20))
#标签的布局
label.grid(row=0,columns=2)# 输入框组件
entry=Entry(root,font=('黑体常规',20),width=15)
#标签的布局
entry.grid(row=0,column=2,columns=2)#单选框组件
Radiobutton(root, text="网易云",variable=v,value=1,width=10).grid(row=1, column=0)
Radiobutton(root, text="qq音乐",variable=v,value=2,width=10).grid(row=1, column=1)
Radiobutton(root, text="酷我",variable=v,value=3,width=10).grid(row=1, column=2)
Radiobutton(root, text="酷狗",variable=v,value=4,width=10).grid(row=1, column=3)#文本框组件
text=Listbox(root,font=('黑体常规',16),width=50,heigh=15)
text.grid(row=2,columns=4)#按钮组件
button1=Button(root,text='开始下载',font=('黑体常规',15),command=get_music_name)#并且定义按钮的点击事件
button1.grid(row=3,column=0)#按钮组件
button2=Button(root,text='退出程序',font=('黑体常规',15),command=root.quit)#并且定义按钮的点击事件
button2.grid(row=3,column=3)root.mainloop()

这样我们的页面就编写好了。如下:

虽然很丑,但起码还是画出来了的

3.5数据绑定

页面编写了,我们就需要将数据绑定到一起,否则也是没什么用的:

def get_music_name():#获取输入框的值name=entry.get()#获取单选框的值,因为单选框的值只能是int类型,所以这里我们不能直接获得,只能通过条件判断语句进行type的赋值if v.get()==1:type='netease'elif v.get()==2:type='qq'elif v.get() == 3:type = 'kuwo'elif v.get() == 4:type = 'kugou'params={'input':name,'filter':'name','type':type,'page':1,}headers={'X-Requested-With': 'XMLHttpRequest','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',}url='http://music.onlychen.cn/'response=requests.post(url,data=params,headers=headers)data=response.json()url=jsonpath.jsonpath(data,'$..url')[0]title=jsonpath.jsonpath(data,'$..title')[0]download(url,title)# 下载歌曲
def download(url,title):dir_name=r'D:\software\python\python爬虫\vip音乐'os.makedirs(dir_name,exist_ok=True)path=dir_name+'/{}.mp3'.format(title)#在文本框中提示下载信息text.insert(END,'{}正在下载'.format(title))text.see(END)text.update()urllib.request.urlretrieve(url,path)text.insert(END, '{}已经下载完毕'.format(title))text.see(END)text.update()

到这里我们所有的程序就已经全部编写完毕了。

4.源代码

这是完整的源代码

import requests
import jsonpath
import urllib.request
import os
# 获取歌曲的详细信息包括链接以及标题
def get_music_name():name=entry.get()if v.get()==1:type='netease'elif v.get()==2:type='qq'elif v.get() == 3:type = 'kuwo'elif v.get() == 4:type = 'kugou'params={'input':name,'filter':'name','type':type,'page':1,}headers={'X-Requested-With': 'XMLHttpRequest','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',}url='http://music.onlychen.cn/'response=requests.post(url,data=params,headers=headers)data=response.json()url=jsonpath.jsonpath(data,'$..url')[0]title=jsonpath.jsonpath(data,'$..title')[0]download(url,title)# 下载歌曲
def download(url,title):dir_name=r'D:\software\python\python爬虫\vip音乐'os.makedirs(dir_name,exist_ok=True)path=dir_name+'/{}.mp3'.format(title)text.insert(END,'{}正在下载'.format(title))text.see(END)text.update()urllib.request.urlretrieve(url,path)text.insert(END, '{}已经下载完毕'.format(title))text.see(END)text.update()# 界面制作
from tkinter import *
# 创建一个窗口
root=Tk()
v = IntVar()
v.set(1)
# 添加标题
root.title('全网音乐下载器')
# 修改窗口大小
root.geometry('560x430+400+200')
# 标签组件
label=Label(root,text='输入下载的歌曲名:',font=('黑体常规',20))
label.grid(row=0,columns=2)entry=Entry(root,font=('黑体常规',20),width=15)
entry.grid(row=0,column=2,columns=2)Radiobutton(root, text="网易云",variable=v,value=1,width=10).grid(row=1, column=0)
Radiobutton(root, text="qq音乐",variable=v,value=2,width=10).grid(row=1, column=1)
Radiobutton(root, text="酷我",variable=v,value=3,width=10).grid(row=1, column=2)
Radiobutton(root, text="酷狗",variable=v,value=4,width=10).grid(row=1, column=3)text=Listbox(root,font=('黑体常规',16),width=50,heigh=15)
text.grid(row=2,columns=4)button1=Button(root,text='开始下载',font=('黑体常规',15),command=get_music_name)
button1.grid(row=3,column=0)button2=Button(root,text='退出程序',font=('黑体常规',15),command=root.quit)
button2.grid(row=3,column=3)root.mainloop()

5.效果演示


都看到这里了,如果觉得对你有帮助的话,可以关注博主的公众号,新人up需要你的支持。
如果有什么疑问或者想要源码的话,可以私聊博主哦。

python爬虫--不限平台歌曲下载(收费也可)相关推荐

  1. python爬虫之网易云歌曲下载(需要js分析) -- 2020.06.20更新

    背景 目的 >>> 通过python + kivy打包一个简易的网易云会员歌曲下载软件; 初试 >>> 用you-get库里面的网易云接口来实现下载; 失败 > ...

  2. Python实现各大音乐网站/FM平台歌曲下载

    Python实现各大音乐网站/FM平台歌曲下载 项目Github地址: https://github.com/Henryhaohao/API_Music_Download Author ?Henryh ...

  3. Python爬虫:多平台短视频去水印下载器

    Python爬虫:多平台短视频去水印下载器 功能介绍 各平台分解 抖音 快手 微视 皮皮搞笑 总结 源码仓库 本教程描述的爬取方案定档与2020年10月26日 郑重申明:该文章介绍的技术仅供用于学习, ...

  4. Python爬虫之网易云音乐下载

    Python爬虫之网易云音乐下载 目标 用Python根据网易云音乐的ID,下载音乐,保存到本地MP3格式 可以下载歌曲的范围:所有能够听的歌曲 配置基础 Python 3.5 模块 pycrypto ...

  5. Python爬虫之Scrapy库的下载和安装

    Python爬虫之Scrapy库的下载和安装 下载scrapy库 1.点击https://www.lfd.uci.edu/~gohlke/pythonlibs,进入该网页后Ctrl+F输入scrapy ...

  6. Python爬虫:AGE动漫下载之 requests 版

    日常跳转: 导入: 分析与代码解释: 打印搜索到的信息 BeautifelSoup4 库使用提醒 小优化 链接解析: 获取视频链接 小优化: 提示: 视频下载: 求大佬赐教 实例源码及结果 结果及下载 ...

  7. 爬虫python下载-如何用Python爬虫实现百度图片自动下载?

    制作爬虫的步骤 制作一个爬虫一般分以下几个步骤: 分析需求 分析网页源代码,配合开发者工具 编写正则表达式或者XPath表达式 正式编写 python 爬虫代码 效果预览 运行效果如下: 存放图片的文 ...

  8. 写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!

    文章目录 前言 分析 理想状态 实际分析 爬虫实现 其他注意 效果与总结 前言 在我们写文章(博客.公众号.自媒体)的时候,常常觉得自己的文章有些老土,这很大程度是因为配图没有选好. 笔者也是遇到相同 ...

  9. python网易云_[Python] 网易云歌单/歌曲下载

    界面化 可以根据歌单 / 歌曲ID 下载 歌单/歌曲. eg: 歌单ID: https://music.163.com/#/playlist?id=3233380300 中的 3233380300 运 ...

  10. Python爬虫案例教学:批量下载某狗所有热门榜单歌曲(附完整源码)

    环境 Python 3.6 Pycharm 模块使用 import os import requests import parsel import re # 模块安装 ''' 如何安装模块: 1. w ...

最新文章

  1. AI加持的WPS来了:金山开源全球首个办公DL框架KSAI-Lite
  2. JAVA网络编程:TCP/IP数据包结构
  3. 深入浅出的mysql第三版和第二版的区别_读《深入浅出Mysql》第二版,笔记
  4. YUV / RGB 格式及快速转换算法总结(转载)
  5. 区块链技术指南笔记(二):区块链技术
  6. 神经网络与深度学习——TensorFlow2.0实战(笔记)(三)(python运算符和表达式)
  7. LeetCode 1878. 矩阵中最大的三个菱形和(模拟)
  8. 微信小程序来了,你准备好了吗?
  9. CommunityServer 的对象持久化
  10. addeventlistener 清除_科普100秒 | 吃花生能软化血管、清除垃圾?
  11. Distinct去除集合中的重复项GetHashCode方法没有返回obj.GetHashCode()导致出错
  12. 微信小程序:wx.getUserInfo 接口的变动与使用
  13. BZOJ3108 [cqoi2013]图的逆变换
  14. application等对象的使用及监听器过滤器
  15. Houdini地形与流体解算(模拟泥石流)
  16. 自定义系统右键菜单工具-使用说明
  17. oppo r11s鸿蒙固件,OPPO R11s Plust官方固件rom刷机包_R11sPlust系统升级包
  18. 移动铁通宽带上网设置教程
  19. DBCO-C6-NHS ester,1384870-47-6二苯基环辛炔-碳6-琥珀酰亚胺酯仅用于科研,不用于人体和生产
  20. Android实现播放音乐列表

热门文章

  1. 分光器光衰多少?分光器如何选购?分光器如何使用?
  2. 传奇开服技术服务端各文件代表着什么意思
  3. 这是我见过最好的唐诗,而且通俗易懂2
  4. c++面试常见问题总结
  5. HCIE-Routing Switching V3.0 资料分享
  6. Win10 - 注册表获取权限的方法
  7. java面试问题与心得
  8. html5渐变色毛玻璃,基于CSS3实现的毛玻璃渐变效果
  9. 2008'中国地理信息系统优秀工程公示
  10. 首先,打破一切常规 学习笔记 之二