Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1|回复: 0

今日要闻PyQt5整合爬虫制作图片爬取器:界面、功能现与打包教程 - 幽络源

[复制链接]

36万

主题

0

回帖

110万

积分

超级版主

Rank: 8Rank: 8

积分
1104390
发表于 3 天前 | 显示全部楼层 |阅读模式
前言
本篇教程适合对Python爬虫和Python软件制作感兴趣的小伙伴阅读,看完本篇教程,你将能更深入了解PyQt5与际功能的整合方式。

如果你只需要软件点击链接获取=幽络源爬图器

1界面
首先在pycharm中创建一个新目录,这里我建立的目录为爬图片,然后按如图打开Qt器(?如果你的ExternalTools没有QtDesigner和PyUIC则说明没有为PyCharm配置QT相关工具,可按照此教程先配置=PyQT5篇-1环境配置与初步使用(图文超详细)_toolsettings里的workingdirectory-CSDN博客)



我们直接拖拽出一个简单的软件界面,注意:在ComboBox中我添加了百度图片、必应图片、搜狗图片、360图片,因为我们要做一个能够爬取各大搜索引擎的图片爬取器,而且我这里给PushButton控件重命为btn_catch



界面拖拽完成后,使用捷键ctlr+s保存到当前目录,会出现一个untitledui文件,同样的对此文件右键然后ExternalTools-PyUIC,就会产生一个untitledpy文件,此文件中含有两个函数setupUi和retranslateUi,我们这里将其重命为Windowpy,毕竟是个GUI窗口嘛,如图



2启动界面
新建文件Mainpy,然后复制如下代码,一定要看注释,否则比较后打包软件到时候会出问题

importsys
fromPyQt5QtWidgetsimportQ脚本lication,QMainWindow

#这个Windowpy文件在为'爬图片'的目录,我们不要用'from爬图片importWindow'的方式引入,否则后面打包的软件会报错找不到目录(当然你也可以打包目录,但这里为了方便,去掉目录,简化打包命令)
importWindow

if__name__=='__main__':
脚本=Q脚本lication(sysargv)
mainWindow=QMainWindow()
ui=WindowUi_MainWindow()#这里的Window便是我们Windowpy文件的字
uisetupUi(mainWindow)
mainWindowshow()
sysexit(脚本exec_())
然后启动Mainpy,看看是否能启动界面,若成功,则显示如图(若失败则大概率是你的QT库有问题,可卸载重装pyQT,若还不行则降低python版本为310及以下,我之前就是这样)



3完善控件
在正式写爬图片的功能前,我们还需要对此窗口文件添加相关控件的功能,比如ListView控件(就是大白框)、PushButton(就是按钮)、Progress(就是进度条),因为在爬取图片时会和这些控件进行交互。

首:初始化ListView
我们直接在Windowpy文件的函数setupUi比较下面加入如下代码即可,如图

#ListView要展示的数据存放区
selfmessageList=
#ListView的数据模型对象初始化
selflistMode=QStringListModel()
#将数据放入模型中,此时数据为空
selflistModesetStringList(selfmessageList)
#使listew生效
selflistViewsetModel(selflistMode)


然后创建一个专门用来操作ListView的函数(这里专业术语叫做插槽函数),如图:

#定义一个操作ListView的插槽函数
defcontroListView(self,msg):
#追加数据
selfmessageList脚本end(msg+"\n")
#更新模型
selflistModesetStringList(selfmessageList)
ifmsg=="爬取结束":
selfbtn_catchsetEnabled(True)


第二:初始化进度条
同样的在setupUi函数比较后加入如下代码,如图

#pv作为给进度条传值的中间变量
selfpv=0
#设定进度条比较小值
selfprogressBarsetMinimum(0)
#设置当前进度条的值
selfprogressBarsetValue(selfpv)


然后为进度条也添加个插槽函数,如图:

#定义一个操作进度条的插槽函数
defcontrolProgress(self,addVal,MaxVal):
selfpv+=addVal#进度条变量自加
selfprogressBarsetMaximum(MaxVal)#设置进度条比较大值
selfprogressBarsetValue(selfpv)#设置进度条的值


第:初始化按钮
我这里的按钮在界面时,为按钮重命为了btn_catch(默认是叫做pushButton)在Windowpy添加一个函数供按钮调用,然后在setupUi比较后添加如下代码与函数绑定,如图:

#按钮点击后
selfbtn_catchclickedconnect(selfbtn_click)

#按钮点击后执行的函数
defbtn_click(self):
#获取ComboBox中当前的选项
chosseItem=selfcomboBox_sourcecurrentText()
#如果选项为百度图片
ifchosseItem=="百度图片":
pass


4功能分析

控件功能初始化好了,然后是写爬图片的功能了,既然要爬图片,那我们就先搞个爬取百度图片的QT线程,为什么要用线程呢因为这GUI界面你不用其他线程去处理耗时的功能,放在和GUI界面一个主线程中就会卡住。分析:爬取图片说白了就是请求百度图片页获取图片链接并下载图片,那么这个线程应当接收参数关键字和图片数量,当然百度图片这里我们按照轮次去爬,他一轮约30张,至于为什么按照轮次可以看这里分析爬取百度图片:

Python爬取百度图片(包括分析原理),所以这里需接收两个参数关键词keyword、轮次rangeCount


5爬图功能
新建QT线程文件为BaiDuThreadpy,填写如下代码

importjson
importospath
importtime
importrequests

fromPyQt5QtCoreimportQThread,pyqtSignal


classBaiDuThread(QThread):

#消息信号,用于传递消息给ListView控件
msgSign=pyqtSignal(str)
#进度条信号
progressSign=pyqtSignal(int,int)

def__init__(self,keyword,rangeCount):
super(BaiDuThread,self)__init__()
selfkeyword=keyword
selfrangeCount=rangeCount

defrun(self):
keyword=selfkeyword#关键词
rangeCount=selfrangeCount#轮次

ifnotospathexists(keyword):
osmkdir(keyword)
#为了简单,这里直接将轮次作为进度条比较大值
MaxVal=rangeCount
selfprogressSignemit(0,MaxVal)

selfmsgSignemit("正在从百度搜索引擎爬取和"+keyword+"相关的图片")
forcountinrange(rangeCount):
pn=count*30
url="imagesbaiducomsearchacjson?tn=resultjson_comlogid=14788725054802565ipn=rjct=202226592is=fp=resultfr=word="+str(keyword)+"queryWord="+str(
keyword)+"cl=2lm=-1ie=utf-8oe=utf-8adpicid=st=-1z=ic=0hd=latest=copyright=s=se=tab=width=height=face=0istype=2qc=nc=expermode=nojc=isAsync=pn="+str(
pn)+"rn=30gsm=1e1717479169689="
headers={
'User-Agent':'Mozilla50(WindowsNT100;Win64;x64)脚本leWebKit53736(KHTML,likeGecko)Chrome930457763Safari53736'}
res=requestsget(url,headers=headers)
iflen(resjson()["data"])==1:
selfmsgSignemit("图片可获取了,爬取结束")
break

json_data=resjson()["data"]#获取json数据
json_str=jsondumps(json_data,indent=2)#json转json字符串
list_data=jsonloads(json_str)#json字符串转listdict
forobjinlist_data:
try:
pic_url=obj["thumbURL"]#图像链接
except:
continue
r=requestsget(pic_url,headers=headers)
withopen(str(keyword)+"\\"+str(timetime())+"jpg",mode="wb")asf:
fwrite(rcontent)
selfprogressSignemit(1,MaxVal)
selfmsgSignemit("爬取结束")
6完善按钮
回到Windowpy文件,我们继续完善btn_click函数为如下:

#按钮点击后执行的函数
defbtn_click(self):
selfprogressBarsetValue(0)
selfpv=0
#获取ComboBox中当前的选项
chosseItem=selfcomboBox_sourcecurrentText()
#获取关键字
keyword=selflineEdit_keywordtext()
ifkeyword=="":
selfcontroListView("关键字不可为空")
return
#获取轮次
ifnotselflineEdit_counttext()isdigit():
selfcontroListView("轮次必须为正整数")
return
rangeCount=int(selflineEdit_counttext())
#如果选项为百度图片
ifchosseItem=="百度图片":
selfbtn_catchsetEnabled(False)
selfbaiduThread=BaiDuThread(keyword,rangeCount)
selfbaiduThreadmsgSignconnect(lambdamsg:selfcontroListView(msg))#连接消息信号
selfbaiduThreadprogressSignconnect(lambdaaddVal,maxVal:selfcontrolProgress(addVal,maxVal))#连接进度条信号
selfbaiduThreadstart()
7测试功能
到此处,爬百度图片的功能就集成到GUI界面了,打开Mainpy,开始使用,结果如下



8打包软件
比较后是打包为软件,其一条命令即可,没上那些低质量教程说的那么复杂。打包前先检查每个文件比较上边引入其他文件时是否有带目录,若带目录将其去掉即,如图我的Windowpy中就带有”爬图片”目录字,去掉后再打包(当然你也可以打包目录,但这里为了方便,去掉目录,简化打包命令)



方式1:直接打包
在当前目录下CMD的控制台直接执行命令打包为exe:


pyinstaller-F-wMainpy-pWindowpy-pBaiDuThreadpy



如果你是在PyCharm控制台打包则需要加上”\”:


pyinstaller-F-w\Mainpy-p\BaiDuThreadpy-p\Windowpy



打包完后在目录会生成个dist目录,里边便是软件,如图:



方式2:虚拟环境打包

原因:python打包会把所有自己下载的包都加入进去,会造成软件体积很大,如下图是笔者昨天未使用虚拟环境打包后的软件,打包时我说时间怎么这么久,出门一趟回来一看25个G,给??整麻了




1新建Python项目创建虚拟环境,如图点点点就完事:



2对虚拟环境目录右键打开控制台,用命令piplist查看当前虚拟环境的库的数量(看环境是否正常),如图





3新的虚拟环境肯定是缺少你项目需要的包,下载就完事,比较后打包命令和直接打包是一样的,如图可以看到虚拟环境打包后体积就不再冗余了





9总结


总结:本教程将际功能与PyQt5进行整合,希望本篇教程对初学PyQt5的同学有帮助,虽然本教程只提供了百度图片的爬取教程,但其他搜索引擎的爬取方式大同小异,可自行下来添加功能。





于是源码网也得到了很多的关注,也想加入到这个行列当中。提供经过严格测试的免费源码、各种线上兼职和网络兼职的网创教程、编程及网络相关的技术教程分享,助您轻松获取资源和技术支持。https://www.youluoyuan.com/

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|足球新闻网

GMT+8, 2025-4-24 03:57 , Processed in 0.084155 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表