当前位置: 首页 > news >正文

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=&copyright=&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…...

随手记:牛回速归

上周-国庆前&#xff1a;牛回速归 国庆&#xff1a;小心被套住 国庆后&#xff1a;一片迷茫 总结&#xff1a;要是上周到国庆前的基本都能捞到&#xff0c;后面情况不好说 后续持续更新...

UI设计师面试整理-设计过程和方法论

在UI设计师面试中,清晰地阐述你的设计过程和方法论是至关重要的。这不仅可以展示你的专业技能和设计思维,也能让面试官看到你是如何解决实际设计问题的。以下是一个全面的UI设计过程和常用方法论的概述,你可以根据你的经验进行相应调整。 1. 设计过程 a. 研究与发现阶段(Re…...

ACM 纳新每日一题 4329: 三进制

首先我们要学习的是数制转化 这里我找了一篇博客https://blog.csdn.net/weixin_53564801/article/details/123665194 一定要注意0需要单独特判一下&#xff0c;这个点尤其重要 然后关于这道题可以使用递归来实现&#xff0c;如下&#xff1a; 递归的代码比较简洁&#xff0c;但…...

WebGIS包括哪些技术栈?怎么学习?

WebGIS&#xff0c;其实是利用Web开发技术结合地理信息系统&#xff08;GIS&#xff09;的产物&#xff0c;它是一种通过Internet实现GIS交互操作和服务的最佳途径。 WebGIS通过图形化界面直观地呈现地理信息和特定数据&#xff0c;具有可扩展性和跨平台性。 它提供交互性&am…...

无人机之集群控制及应用

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

AV1 Bitstream Decoding Process Specification--[9]:语法结构语义-5

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf 没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码…...

APISIX 联动雷池 WAF 实现 Web 安全防护

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

铭豹扩展坞 USB转网口 突然无法识别解决方法

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

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...