站群管理软件,百度推广关键词怎么优化,做平台网站一般有php还是js,西安企业网站建设模板前言
本篇教程适合对Python爬虫和Python软件制作感兴趣的小伙伴阅读#xff0c;看完本篇教程#xff0c;你将能更深入了解PyQt5与实际功能的整合方式。
1.设计界面
首先在pycharm中创建一个新目录#xff0c;这里我建立的目录名为爬图片#xff0c;然后按如图打开Qt设计…前言
本篇教程适合对Python爬虫和Python软件制作感兴趣的小伙伴阅读看完本篇教程你将能更深入了解PyQt5与实际功能的整合方式。
1.设计界面
首先在pycharm中创建一个新目录这里我建立的目录名为爬图片然后按如图打开Qt设计器 如果你的ExternalTools没有QtDesigner和PyUIC则说明没有为PyCharm配置QT相关工具可按照此教程先配置PyQT5篇 -1.环境配置与初步使用(图文超详细)_tool settings里的working directory-CSDN博客 我们直接拖拽出一个简单的软件界面注意在ComboBox中我添加了百度图片、必应图片、搜狗图片、360图片因为我们要做一个能够爬取各大搜索引擎的图片爬取器而且我这里给PushButton控件重命名为btn_catch 界面拖拽完成后使用快捷键ctlrs保存到当前目录会出现一个untitled.ui文件同样的对此文件右键然后ExternalTools-PyUIC就会产生一个untitled.py文件此文件中含有两个函数setupUi和retranslateUi我们这里将其重命名为Window.py毕竟是个GUI窗口嘛如图 2.启动界面
新建文件Main.py然后复制如下代码一定要看注释否则最后打包软件到时候会出问题
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow#这个Window.py文件在名为爬图片的目录我们不要用from 爬图片 import Window的方式引入否则后面打包的软件会报错找不到目录(当然你也可以打包目录但这里为了方便去掉目录简化打包命令)
import Windowif __name____main__:appQApplication(sys.argv)mainWindowQMainWindow()uiWindow.Ui_MainWindow() #这里的Window便是我们Window.py文件的名字ui.setupUi(mainWindow)mainWindow.show()sys.exit(app.exec_())
然后启动Main.py看看是否能启动界面若成功则显示如图若失败则大概率是你的QT库有问题可卸载重装pyQT若还不行则降低python版本为3.10及以下我之前就是这样 3.完善控件
在正式写爬图片的功能前我们还需要对此窗口文件添加相关控件的功能比如ListView控件(就是大白框)、PushButton(就是按钮)、Progress(就是进度条)因为在爬取图片时会和这些控件进行交互。
第一初始化ListView
我们直接在Window.py文件的函数setupUi最下面加入如下代码即可如图
# ListView要展示的数据存放区
self.messageList []
# ListView的数据模型对象初始化
self.listMode QStringListModel()
# 将数据放入模型中此时数据为空
self.listMode.setStringList(self.messageList)
# 使listview生效
self.listView.setModel(self.listMode) 然后创建一个专门用来操作ListView的函数(这里专业术语叫做插槽函数)如图
# 定义一个操作ListView的插槽函数
def controListView(self, msg):# 追加数据self.messageList.append(msg \n)# 更新模型self.listMode.setStringList(self.messageList)if msg爬取结束:self.btn_catch.setEnabled(True) 第二初始化进度条
同样的在setupUi函数最后加入如下代码如图
#pv作为给进度条传值的中间变量
self.pv 0
#设定进度条最小值
self.progressBar.setMinimum(0)
#设置当前进度条的值
self.progressBar.setValue(self.pv) 然后为进度条也添加个插槽函数如图
#定义一个操作进度条的插槽函数
def controlProgress(self,addVal,MaxVal):self.pv addVal #进度条变量自加self.progressBar.setMaximum(MaxVal) #设置进度条最大值self.progressBar.setValue(self.pv) #设置进度条的值 第三初始化按钮
我这里的按钮在设计界面时为按钮重命名为了btn_catch(默认是叫做pushButton) 在Window.py添加一个函数供按钮调用然后在setupUi最后添加如下代码与函数绑定如图
#按钮点击后
self.btn_catch.clicked.connect(self.btn_click)#按钮点击后执行的函数
def btn_click(self):#获取ComboBox中当前的选项chosseItemself.comboBox_source.currentText()#如果选项为百度图片if chosseItem百度图片:pass 4.功能分析 控件功能初始化好了然后是写爬图片的功能了既然要爬图片那我们就先搞个爬取百度图片的QT线程为什么要用线程呢因为这GUI界面你不用其他线程去处理耗时的功能放在和GUI界面一个主线程中就会卡住。 分析爬取图片说白了就是请求百度图片网页获取图片链接并下载图片那么这个线程应当接收参数关键字和图片数量当然百度图片这里我们按照轮次去爬他一轮约30张至于为什么按照轮次可以看这里分析爬取百度图片 Python爬取百度图片(包括分析原理) 所以这里需接收两个参数 关键词keyword、轮次rangeCount 5.爬图功能
新建QT线程文件名为BaiDuThread.py填写如下代码
import json
import os.path
import time
import requestsfrom PyQt5.QtCore import QThread, pyqtSignalclass BaiDuThread(QThread):#消息信号用于传递消息给ListView控件msgSignpyqtSignal(str)#进度条信号progressSignpyqtSignal(int,int)def __init__(self,keyword,rangeCount):super(BaiDuThread, self).__init__()self.keyword keywordself.rangeCount rangeCountdef run(self):keywordself.keyword #关键词rangeCountself.rangeCount #轮次if not os.path.exists(keyword):os.mkdir(keyword)#为了简单这里直接将轮次作为进度条最大值MaxValrangeCountself.progressSign.emit(0,MaxVal)self.msgSign.emit(正在从百度搜索引擎爬取和keyword相关的图片)for count in range(rangeCount):pn count * 30url https://images.baidu.com/search/acjson?tnresultjson_comlogid11514788725054802565ipnrjct201326592isfpresultfrword str(keyword) queryWord str(keyword) cl2lm-1ieutf-8oeutf-8adpicidst-1zic0hdlatestcopyrightssetabwidthheightface0istype2qcncexpermodenojcisAsyncpn str(pn) rn30gsm1e1717479169689headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36}res requests.get(url, headersheaders)if len(res.json()[data]) 1:self.msgSign.emit(无图片可获取了爬取结束)breakjson_data res.json()[data] # 获取json数据json_str json.dumps(json_data, indent2) # json转json字符串list_data json.loads(json_str) # json字符串转list/dictfor obj in list_data:try:pic_url obj[thumbURL] # 图像链接except:continuer requests.get(pic_url, headersheaders)with open(str(keyword) \\ str(time.time()) .jpg, modewb) as f:f.write(r.content)self.progressSign.emit(1,MaxVal)self.msgSign.emit(爬取结束)
6.完善按钮
回到Window.py文件我们继续完善btn_click函数为如下
# 按钮点击后执行的函数def btn_click(self):self.progressBar.setValue(0)self.pv 0# 获取ComboBox中当前的选项chosseItem self.comboBox_source.currentText()# 获取关键字keyword self.lineEdit_keyword.text()if keyword:self.controListView(关键字不可为空)return# 获取轮次if not self.lineEdit_count.text().isdigit():self.controListView(轮次必须为正整数)returnrangeCount int(self.lineEdit_count.text())# 如果选项为百度图片if chosseItem 百度图片:self.btn_catch.setEnabled(False)self.baiduThreadBaiDuThread(keyword,rangeCount)self.baiduThread.msgSign.connect(lambda msg:self.controListView(msg)) #连接消息信号self.baiduThread.progressSign.connect(lambda addVal,maxVal:self.controlProgress(addVal,maxVal)) #连接进度条信号self.baiduThread.start()
7.测试功能
到此处爬百度图片的功能就集成到GUI界面了打开Main.py开始使用结果如下 8.打包软件
最后是打包为软件其实一条命令即可没网上那些低质量教程说的那么复杂。 打包前先检查每个文件最上边引入其他文件时是否有带目录名若带目录名将其去掉即如图我的Window.py中就带有爬图片目录名字去掉后再打包(当然你也可以打包目录但这里为了方便去掉目录简化打包命令) 方式1直接打包
在当前目录下CMD的控制台直接执行命令打包为exe:
pyinstaller -F -w Main.py -p Window.py -p BaiDuThread.py
如果你是在PyCharm控制台打包则需要加上.\
pyinstaller -F -w .\Main.py -p .\BaiDuThread.py -p .\Window.py
打包完后在目录会生成个dist目录里边便是软件如图 方式2虚拟环境打包 原因python打包会把所有自己下载的包都加入进去会造成软件体积很大如下图是笔者昨天未使用虚拟环境打包后的软件打包时我说时间怎么这么久出门一趟回来一看2.5个G.给整麻了 1.新建Python项目创建虚拟环境如图点点点就完事 2.对虚拟环境目录右键打开控制台用命令pip list查看当前虚拟环境的库的数量(看环境是否正常)如图 3.新的虚拟环境肯定是缺少你项目需要的包下载就完事最后打包命令和直接打包是一样的如图可以看到虚拟环境打包后体积就不再冗余了 9.总结 总结本教程将实际功能与PyQt5进行整合希望本篇教程对初学PyQt5的同学有帮助虽然本教程只提供了百度图片的爬取教程但其他搜索引擎的爬取方式大同小异可自行下来添加功能。 原文及软件链接》https://www.youluoyuan.com/215.html
我们的QQ交流群307531422