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

1.起因

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

在这里插入图片描述

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

2.分析网页结构

首先按照惯例先分析网页结构
在这里插入图片描述

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


image.png

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


image.png

现在我们的思路其实还是这个,但是大家发现了没有这次有我们能够直接请求的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'))

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

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

image.png

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

print(response.json())

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


image.png

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.效果演示

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容