PyQt5整合爬虫制作图片爬取器-幽络源
前言
本篇教程适合对Python爬虫和Python软件制作感兴趣的小伙伴阅读,看完本篇教程,你将能更深入了解PyQt5与实际功能的整合方式。
1.设计界面
首先在pycharm中创建一个新目录,这里我建立的目录名为爬图片,然后按如图打开Qt设计器( 如果你的ExternalTools没有QtDesigner和PyUIC则说明没有为PyCharm配置QT相关工具,可按照此教程先配置=>PyQT5篇 -1.环境配置与初步使用(图文超详细)_tool settings里的working directory-CSDN博客)
我们直接拖拽出一个简单的软件界面,注意:在ComboBox中我添加了百度图片、必应图片、搜狗图片、360图片,因为我们要做一个能够爬取各大搜索引擎的图片爬取器,而且我这里给PushButton控件重命名为btn_catch
界面拖拽完成后,使用快捷键ctlr+s保存到当前目录,会出现一个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__':app=QApplication(sys.argv)mainWindow=QMainWindow()ui=Window.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中当前的选项chosseItem=self.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控件msgSign=pyqtSignal(str)#进度条信号progressSign=pyqtSignal(int,int)def __init__(self,keyword,rangeCount):super(BaiDuThread, self).__init__()self.keyword = keywordself.rangeCount = rangeCountdef run(self):keyword=self.keyword #关键词rangeCount=self.rangeCount #轮次if not os.path.exists(keyword):os.mkdir(keyword)#为了简单,这里直接将轮次作为进度条最大值MaxVal=rangeCountself.progressSign.emit(0,MaxVal)self.msgSign.emit("正在从百度搜索引擎爬取和"+keyword+"相关的图片")for count in range(rangeCount):pn = count * 30url = "https://images.baidu.com/search/acjson?tn=resultjson_com&logid=11514788725054802565&ipn=rj&ct=201326592&is=&fp=result&fr=&word=" + str(keyword) + "&queryWord=" + str(keyword) + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=&expermode=&nojc=&isAsync=&pn=" + str(pn) + "&rn=30&gsm=1e&1717479169689="headers = {'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, headers=headers)if len(res.json()["data"]) == 1:self.msgSign.emit("无图片可获取了,爬取结束")breakjson_data = res.json()["data"] # 获取json数据json_str = json.dumps(json_data, indent=2) # 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, headers=headers)with open(str(keyword) + "\\" + str(time.time()) + ".jpg", mode="wb") 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.baiduThread=BaiDuThread(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
相关文章:

PyQt5整合爬虫制作图片爬取器-幽络源
前言 本篇教程适合对Python爬虫和Python软件制作感兴趣的小伙伴阅读,看完本篇教程,你将能更深入了解PyQt5与实际功能的整合方式。 1.设计界面 首先在pycharm中创建一个新目录,这里我建立的目录名为爬图片,然后按如图打开Qt设计…...

DC00023基于jsp+MySQL新生报到管理系统
1、项目功能演示 DC00023基于jsp新生报到管理系统java webMySQL新生管理系统 2、项目功能描述 基于jspMySQL新生报到管理系统项目分为学生、辅导员、财务处和系统管理员四个角色。 2.1 学生功能 1、系统登录 2、校园新闻、报到流程、学校简介、在线留言、校园风光、入校须知…...

AdaptIoT——制造业中使用因果关系的自我标签系统
0.概述 论文地址:https://arxiv.org/abs/2404.05976 在许多制造应用中,机器学习(ML)已被证明可以提高生产率。针对制造业应用提出了一些软件和工业物联网(IIoT)系统,以接收这些 ML 应用。最近&…...
代码随想录算法训练营Day15
654.最大二叉树 力扣题目链接:. - 力扣(LeetCode) 前序递归、循环不变量 class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return findmax(nums,0,nums.length);}public TreeNode findmax(int[] nums,int lefti…...

Thinkphp/Laravel旅游景区预约系统的设计与实现
目录 技术栈和环境说明具体实现截图设计思路关键技术课题的重点和难点:框架介绍数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 技术栈和环境说明 采用PHP语言开发,开发环境为phpstudy 开发工具notepad并使用MYSQL数据库…...

SpringCloud学习记录|day1
学习材料 2024最新SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等) 学redis讲到微服务就停了,nginx也是。 所以嘛,我终于来到微服务了。 复习MyBatisP…...

Elasticsearch讲解
1.Elasticsearch基本知识 1.基本认识和安装 Elasticsearch是由elastic公司开发的一套搜索引擎技术,它是elastic技术栈中的一部分。完整的技术栈包括: Elasticsearch:用于数据存储、计算和搜索 Logstash/Beats:用于数据收集 Kib…...
Linux嵌入式有发展吗,以及对uboot,kernel,rootfs的领悟
工作多年后,对uboot,kernel,rootfs的领悟,总结 上大学时,51单片机,正点原子的stm32,linux arm开发。对uboot,kernel,rootfs的理解云里雾里,感觉自己很懂了 其…...

基于Springboot+Vue的公寓管理系统(含源码+数据库)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…...

多功能声学气膜馆:承载梦想与希望的舞台—轻空间
在9月29日上午,苏州大学应用技术学院的2024级新生开学典礼暨开学第一课在轻空间建造的多功能声学气膜馆内盛大举行。这一盛典不仅见证了2849名新生的入学,也展示了气膜馆的独特魅力与优越功能。 卓越的声学表现 声学气膜馆采用高性能材料,确保…...

【线程】线程池
线程池通过一个线程安全的阻塞任务队列加上一个或一个以上的线程实现,线程池中的线程可以从阻塞队列中获取任务进行任务处理,当线程都处于繁忙状态时可以将任务加入阻塞队列中,等到其它的线程空闲后进行处理。 线程池作用: 1.降…...
输出 / 目录下所有目录文件的大小并排序
使用 du -sh /* 输出 / 目录下所有的目录总大小,看下效果: [rootlocalhost ~]# du -sh /* 0 /bin 110M /boot 0 /dev 32M /etc 12K /home 0 /lib 0 /lib64 0 /media 0 /mnt 0 /opt du: cannot access ‘/proc/2731/task/2731/fd/4’: No such file or …...

【hot100-java】【编辑距离】
多维dp篇 class Solution {public int minDistance(String word1, String word2) {char [] sword1.toCharArray();char [] tword2.toCharArray();int ns.length;int mt.length;int [][] fnew int[n1][m1];for (int j1;j<m;j){f[0][j]j;}for(int i0;i<n;i){f[i1][0]i1;for…...

随手记:牛回速归
上周-国庆前:牛回速归 国庆:小心被套住 国庆后:一片迷茫 总结:要是上周到国庆前的基本都能捞到,后面情况不好说 后续持续更新...
UI设计师面试整理-设计过程和方法论
在UI设计师面试中,清晰地阐述你的设计过程和方法论是至关重要的。这不仅可以展示你的专业技能和设计思维,也能让面试官看到你是如何解决实际设计问题的。以下是一个全面的UI设计过程和常用方法论的概述,你可以根据你的经验进行相应调整。 1. 设计过程 a. 研究与发现阶段(Re…...
ACM 纳新每日一题 4329: 三进制
首先我们要学习的是数制转化 这里我找了一篇博客https://blog.csdn.net/weixin_53564801/article/details/123665194 一定要注意0需要单独特判一下,这个点尤其重要 然后关于这道题可以使用递归来实现,如下: 递归的代码比较简洁,但…...

WebGIS包括哪些技术栈?怎么学习?
WebGIS,其实是利用Web开发技术结合地理信息系统(GIS)的产物,它是一种通过Internet实现GIS交互操作和服务的最佳途径。 WebGIS通过图形化界面直观地呈现地理信息和特定数据,具有可扩展性和跨平台性。 它提供交互性&am…...

无人机之集群控制及应用
一、无人机集群控制 无人机集群控制是指通过先进的通信、导航和控制算法,实现多架无人机之间的协同、协调和高效的任务执行。其关键技术包括: 通信技术:实现无人机之间的实时数据传输和共享,确保集群控制的准确性和稳定性。 路径…...

AV1 Bitstream Decoding Process Specification--[9]:语法结构语义-5
原文地址:https://aomediacodec.github.io/av1-spec/av1-spec.pdf 没有梯子的下载地址:AV1 Bitstream & Decoding Process Specification摘要:这份文档定义了开放媒体联盟(Alliance for Open Media)AV1视频编解码…...

APISIX 联动雷池 WAF 实现 Web 安全防护
Apache APISIX 是一个动态、实时、高性能的云原生 API 网关,提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。 雷池是由长亭科技开发的 WAF 系统,提供对 HTTP 请求的安全请求,提供完整的 API 管理和…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...