Qt版可视化音乐爬虫
1.项目环境准备
在这里我们的开发环境用的是:window10专业版+Python3.6+pycharm社区版
1.先准备好PyQt5模块,一般在pycharm交互模式中输入:pip install PyQt5,就能完成安装。
2.还要准备一些爬虫相关的库。
2.创建项目
在这里我就不分开写了,大概目录结构如下:
image是存主窗口的图片的,按钮也可以设置成图片,各位读友可以自行添加。 下面的Qt_web_reptile.py就是我们的爬虫项目。
3.项目效果
这是我们想要的效果的简单页面。
主体代码功能预览
4.构建主窗口、按钮及文本
导入所需要的模块
import requests
import json
import os
from PyQt5
.Qt
import *
from PyQt5
.QtWidgets
import QWidget
, QLabel
, QTextEdit
from PyQt5
.QtWidgets
import QApplication
import sys
4.1创建主窗口
定义一个window对象来继承Qwidget,设置窗口的大小以及窗口图标和窗口背景等样式。
4.2 创建按钮、标签和文本
这段代码块紧跟在主窗口下面,该函数的功能主要是用来创建按钮、标签及文本的。
该函数也定义了每个按钮和标签对应得槽函数。
def setup_ui(self
):
self
.label_path
= QLabel
(self
)
self
.label_input
= QLabel
(self
)
self
.path_lineedit
= QLineEdit
(self
)
self
.path_lineedit
.textChanged
.connect
(self
.text_signal
)
self
.input_lineedit
= QLineEdit
(self
)
self
.input_lineedit
.textChanged
.connect
(self
.input_line
)
self
.label_out
= QTextEdit
(self
)
self
.choose_button
= QPushButton
(self
)
self
.choose_button
.pressed
.connect
(self
.read_path
)
self
.reptile_button
= QPushButton
(self
)
self
.reptile_button
.pressed
.connect
(self
.reptile_web
)
self
.reptile_button
.setEnabled
(False)
4.2 设置按钮位置及文本背景颜色
这个函数定义了按钮的位置、按钮和文本的提示功能。
def resizeEvent(self
, event
):
cyan
= "background-color:cyan;font-size:26px;color:blue"
line
= "background-color:white;font-size:26px;color:blue"
background
= "background-color:#ccffcc;font-size:26px;color:blue"
self
.label_path
.resize
(self
.widget_w
- 38, self
.widget_h
)
self
.label_path
.setText
("保存路径:")
self
.label_path
.setToolTip
("这是一个提示标签")
self
.label_path
.setStyleSheet
(cyan
)
self
.label_input
.resize
(self
.widget_w
- 38, self
.widget_h
)
self
.label_input
.setText
("音乐名称:")
self
.label_input
.setToolTip
("请输入你想要搜索的音乐")
self
.label_input
.setStyleSheet
(cyan
)
self
.label_out
.resize
(300, 100)
self
.label_out
.setToolTip
("任务列表!")
self
.label_out
.setStyleSheet
(line
)
self
.input_lineedit
.resize
(self
.widget_w
, self
.widget_h
)
self
.input_lineedit
.setToolTip
("请输入音乐名称")
self
.input_lineedit
.setStyleSheet
(line
)
self
.path_lineedit
.resize
(self
.widget_w
, self
.widget_h
- 2)
self
.path_lineedit
.setToolTip
("你选择的文件夹")
self
.path_lineedit
.setStyleSheet
(line
)
self
.choose_button
.setText
("选择路径")
self
.choose_button
.setToolTip
("选择一个文件夹")
self
.choose_button
.resize
(self
.widget_w
, self
.widget_h
)
self
.choose_button
.setStyleSheet
(background
)
self
.reptile_button
.setText
("点击爬取")
self
.reptile_button
.setToolTip
("这是开始爬取按钮")
self
.reptile_button
.resize
(self
.widget_w
, self
.widget_h
)
self
.reptile_button
.setStyleSheet
(background
)
x
= (self
.width
() - self
.widget_w
) / 2
y1
= self
.top_margin
y2
= y1
+ self
.widget_h
+ self
.widget_h_margin
y3
= y2
+ self
.widget_h
+ self
.widget_h_margin
self
.label_path
.move
(x
- 130, y1
)
self
.label_input
.move
(x
-130, y1
+60)
self
.path_lineedit
.move
(x
, y1
+ 1)
self
.input_lineedit
.move
(x
, y1
+60)
self
.choose_button
.move
(x
+ 170, y1
)
self
.reptile_button
.move
(x
+170, y1
+ 60)
self
.label_out
.move
(x
-60, y1
+ 120)
self
.i
+= 1
4.3 判断文本框是否有内容
对文本内容进行判断是否存在内容,设置(爬取按钮)是否可用,避免出现闪退的bug。
def text_signal(self
, text
):
print("文本内容发生了改变", text
)
self
.reptile_button
.setEnabled
(len(text
) > 0)
4.4 选择音乐保存路径
在这里我是先定义了保存的路径,如果你觉得不太方便,可以改在后面。
“选取文件”,"G:/"--》是默认查找到 G盘 你可以改为其他的盘。
def read_path(self
):
try:
self
.file1
= QFileDialog
.getExistingDirectory
(self
, "选取文件", "G:/")
self
.data
= ("'" + self
.file1
+ "'")
print(self
.data
)
self
.path_lineedit
.setText
(self
.file1
)
except Ellipsis
as e
:
print(e
)
4.5 输入音乐文本框
这里只是为了获取到你输入的音乐名称,为了方便看写到这里。
可以改为匿名函数实现。
def input_line(self
, text
):
self
.text
= text
4.6 爬取动作
这个函数定义了爬虫的行为,里面还有很多功能可以加。这里爬虫的下载速度有点慢,
你们可以加上多线程或者分开写来提升下载速度。
def reptile_web(self
):
kw
= self
.text
headers
= {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 Edg/84.0.522.63",
"Cookie": "_ga=GA1.2.1083049585.1590317697; _gid=GA1.2.2053211683.1598526974; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1597491567,1598094297,1598096480,1598526974; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1598526974; kw_token=HYZQI4KPK3P",
"Referer": "http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6",
"csrf": "HYZQI4KPK3P",
}
params
= {
"key": kw
,
"pn": "1",
"rn": "1",
"httpsStatus": "1",
"reqId": "cc337fa0-e856-11ea-8e2d-ab61b365fb50",
}
music_list
= []
url
= "http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?"
res
= requests
.get
(url
=url
, headers
=headers
, params
=params
)
res
.encoding
= "utf-8"
text
= res
.text
json_list
= json
.loads
(text
)
datapack
= json_list
["data"]["list"]
for i
in datapack
:
music_name
= i
["name"]
music_singer
= i
["artist"]
rid
= i
["rid"]
api_music
= "http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3" \
"&br=128kmp3&from=web&t=1598528574799&httpsStatus=1" \
"&reqId=72259df1-e85a-11ea-a367-b5a64c5660e5".format(rid
)
api_res
= requests
.get
(url
=api_music
)
music_url
= json
.loads
(api_res
.text
)["url"]
print(music_name
)
print(music_singer
)
print(music_url
)
music_dict
= {}
music_dict
["name"] = music_name
music_dict
["url"] = music_url
music_dict
["singer"] = music_singer
music_list
.append
(music_dict
)
print(len(music_list
))
xiazai
= kw
root
= self
.file1
+ '/'
for i
in range(len(music_list
)):
try:
if xiazai
== music_list
[i
]["name"]:
if not os
.path
.exists
(root
):
os
.mkdir
(root
)
music_content
= requests
.get
(url
=music_list
[i
]["url"]).content
with open(root
+ "{}({}).mp3".format(music_list
[i
]['name'], music_list
[i
]['singer']), "wb") as f
:
f
.write
(music_content
)
self
.label_out
.setPlainText
(music_list
[i
]['name'] + '下载成功')
print("下载成功")
except Exception
as e
:
print("下载失败", e
)
总结:
这个小案列到此就结束了,里面我自己也有很多细节没有完善。总体来讲,通过这个案列,你可以掌握到很多
的小知识点,特别是PyQT5的,希望这个小案列能帮助到你们。
源码链接:
讲解可能不是很详细,源码链接如下,可以自己下载看看哦。 https://download.csdn.net/download/qq_38009449/12804071