python爬虫

您所在的位置:网站首页 爬虫收费 python爬虫

python爬虫

2024-07-16 16:01:20| 来源: 网络整理| 查看: 265

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

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需要你的支持。 如果有什么疑问或者想要源码的话,可以私聊博主哦。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭