简单的爬虫程序以及使用PYQT进行界面设计(包含源码解析)
由于这个是毕业设计的内容,而且还是跨专业的。爬虫程序肯定是很简单的,就是调用Yahoo的API进行爬取图片。这篇博客主要讲的是基础的界面设计。
放上源码,然后分部解析一下重要的地方。注:flickrapi需要翻墙
代码复制的时候可能掉几个字母或者符号,不建议复制代码,如需复制请自行检查是否有拼写错误
  可以使用pip install  来安装flickrapi和pyqt5和pyqt5-tools
总体界面如图所示:

下面是源码:
import sys
import os
from PyQt5.QtWidgets import QWidget,
QPushButton,QGroupBox,
QApplication,QLabel,QLineEdit,QToolTip, QMessageBox,QFileDialog,QTextEdit,QProgressBar,QVBoxLayout
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import QFont
from PyQt5.QtGui import QPixmap
import time
import flickrapi
import urllib.request #导入相应的模块
stop=0 #设置一个全局变量用于停止程序
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self): #设计界面
self.setGeometry(300, 200, 580, 400) #设置窗体尺寸
self.setWindowTitle('DeepLearn Lab') #命名窗体的标题 QToolTip.setFont(QFont('SansSerif', 10)) #设置控件提示信息的字体格式及大小
self.btn = QPushButton('开始', self) #设计开始按钮
self.btn.setToolTip('单击开始来下载图片') #设置按钮的提示信息
self.btn.clicked.connect(self.doAction) #建立信号和槽的联系,将单击信号与下面的doacion进行链接
self.pbar = QProgressBar(self) #设计一个进度条
self.textEdit=QTextEdit(self) #设计一个文本输出框
self.textEdit.setPlaceholderText("帮助文档:\n1.输入搜索图片的关键字\n2.选择图片储存路径,如不选择默认使用程序所在路径\n3.单击开始进行下载")
self.textEdit.resize(400,200) #设置文本输出框大小
self.btn3 = QPushButton('停止', self) #设计停止按钮
self.btn3.setToolTip('单击来结束下载图片')
self.btn3.clicked.connect(self.stopxz) #建立信号和槽的联系,将单击信号与下面的stopxz进行链接
self.lineEdit = QLineEdit(self) #设计输入框
self.lineEdit.setPlaceholderText("输入搜索关键字")
self.lineEdit.setToolTip('请输入需要搜索的图片的关键字,请用英文输入')
self.lineEdit2 = QLineEdit(self)
self.btn2 = QPushButton('选择保存路径', self) #设计保存下载路径的按钮
self.btn2.setToolTip('请输入储存图片的磁盘地址')
self.btn2.clicked.connect(self.filepath) #建立信号和槽的联系,将单击信号与下面的filepath进行链接
self.groupBox = QGroupBox(self) #设置QT容器
self.groupBox.move(450, 105) #移动容器的位置
self.groupBox.resize(120,280) #设置容器的尺寸
self.groupBox.setTitle('菜单栏') #设置容器的标题
self.groupBox.setAlignment(4) #4为ALignHCenter为居中的意思
layout = QVBoxLayout() #新建一个垂直布局
layout.addWidget(self.lineEdit) #往该布局中添加各种控件
layout.addWidget(self.btn2)
layout.addWidget(self.btn)
layout.addWidget(self.btn3)
self.groupBox.setLayout(layout) #显示该布局
self.groupBox2 = QGroupBox(self) #设置QT容器2
self.groupBox2.move(10, 10)
self.groupBox2.resize(420,300)
self.groupBox2.setTitle('程序运行信息反馈')
self.groupBox2.setAlignment(4) #4为ALignHCenter为居中的意思
layout2 = QVBoxLayout()
layout2.addWidget(self.textEdit)
self.groupBox2.setLayout(layout2)
self.groupBox3 = QGroupBox(self) #设置QT容器3
self.groupBox3.move(310, 330)
self.groupBox3.resize(120,55)
self.groupBox3.setTitle('已下载图片数量')
layout3 = QVBoxLayout()
layout3.addWidget(self.lineEdit2)
self.groupBox3.setLayout(layout3)
self.groupBox4 = QGroupBox(self) #设置QT容器4
self.groupBox4.move(10, 330)
self.groupBox4.resize(280,55)
self.groupBox4.setTitle('进度条显示')
layout4 = QVBoxLayout()
layout4.addWidget(self.pbar)
self.groupBox4.setLayout(layout4)
self.groupBox5 = QGroupBox(self) #设置QT容器5
self.groupBox5.setStyleSheet("border:none") #隐藏容器的边框
self.groupBox5.move(442, 8)
self.groupBox5.resize(136,95)
self.lbl = QLabel (self) #新建一个控件来显示图片
layout5 = QVBoxLayout()
pixmap = QPixmap (r"C:\Users\Administrator\Desktop\svchost.exe\logo2.jpg") # 按指定路径找到图片
self.lbl.setPixmap (pixmap) # 在label上显示图片
self.lbl.setScaledContents (True) # 让图片自适应label大小
layout5.addWidget(self.lbl)
self.groupBox5.setLayout(layout5)
self.show() #显示主窗口
def filepath(self): #用于修改下载路径的函数
self.textEdit.append('当前储存路径为 '+str(os.getcwd()))
file_path=QFileDialog.getExistingDirectory(self)
os.chdir(file_path)
self.textEdit.append('修改后的储存路径为 '+str(os.getcwd()))
def doAction(self): #主函数,用于下载图片
QMessageBox.question(self, '提示',
"单击yes下载图片,下载过程请耐心等待", QMessageBox.Yes, QMessageBox.Yes) #最后一个QMessageBox.No的意思是默认为no
shuru=self.lineEdit.text() #获取输入的内容
api_key='c5dd68f9ba0895eb6fba771e963784f9' #在Yahoo上申请的API账户和密码
api_secret='d11363e44eb2b2e0'
flickr=flickrapi.FlickrAPI(api_key,api_secret,cache=True) #生成flickr对象
count=1 #初始化一个计数器
try:
#爬取text为'cross the road'的照片,这里可以根据自己的需要设置其它的参数
photos=flickr.walk(text=str(shuru),extras='url_c',tag_mode='all',tags='street')#使用walk方法获得图片的url
except Exception as e:
print('Error')
for photo in photos:
url=photo.get('url_c')
self.textEdit.append('当前访问的URL为: '+str(url))
if count>0:
if str(url)!='None':
response=urllib.request.urlopen(url) #获得数据
cat_jpg=response.read(url)
with open ('photo'+str(count)+'.jpg','wb') as f: #下载图片
f.write(cat_jpg)
QString='已下载'+str(count) #显示已下载数量
jishu=count/2
self.pbar.setValue(jishu)
count=count+1
self.lineEdit2.setText(QString)
QApplication.processEvents() #刷新窗口防止卡死
if stop==1:
break
self.textEdit.append('停止下载 ')
def stopxz(self): #当停止按钮按下时改变全局变量值来间接停止爬取图片
global stop
stop=1
def closeEvent(self, event): #重写关闭事件
reply = QMessageBox.question(self, '提示', #设计一个提示框
"确定要退出搜索程序吗?", QMessageBox.Yes |
QMessageBox.No, QMessageBox.No) #最后一个QMessageBox.No的意思是默认为no
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__': app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
首先是爬虫部分,由于是利用了flickrapi,所以只需要按规则使用就可以了。
具体分析如下
api_key='c5dd68f9ba0895eb6fba771e963784f9' #在Yahoo上申请的API账户和密码
api_secret='d11363e44eb2b2e0'
flickr=flickrapi.FlickrAPI(api_key,api_secret,cache=True) #生成flickr对象
count=1 #初始化一个计数器
try:
#爬取text为'cross the road'的照片,这里可以根据自己的需要设置其它的参数
photos=flickr.walk(text=str(shuru),extras='url_c',tag_mode='all',tags='street')#使用walk方法获得图片的url
except Exception as e:
print('Error')
for photo in photos: #遍历所有的url
url=photo.get('url_c')if count>0:
if str(url)!='None': #url 有两种形式,一种为正确的url 一种为none,防止因为none而导致访问错误这里直接排除none
response=urllib.request.urlopen(url) #获得数据
cat_jpg=response.read(url)
with open ('photo'+str(count)+'.jpg','wb') as f: #下载图片
f.write(cat_jpg)
QString='已下载'+str(count) #显示已下载数量
count=count+1 #累加,使得文件名字不重复
首先创建一个窗体。
把该导入的都导入进去
import sys
from PyQt5.QtWidgets import QWidget,
QPushButton,QGroupBox,
QApplication,QLabel,QLineEdit,QToolTip, QMessageBox,QFileDialog,QTextEdit,QProgressBar,QVBoxLayout
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import QFont
from PyQt5.QtGui import QPixmap class Example(QWidget):
def __init__(self): #没记错的话是构造器,与之相对应的是析构器(c++中的称呼)
super().__init__()
self.initUI()
def initUI(self): #设计界面
self.setGeometry(300, 200, 580, 400) #设置窗体尺寸
self.setWindowTitle('DeepLearn Lab') #命名窗体的标题
def closeEvent(self, event): #重写关闭事件
reply = QMessageBox.question(self, '提示', #设计一个提示框
"确定要退出搜索程序吗?", QMessageBox.Yes |
QMessageBox.No, QMessageBox.No) #最后一个QMessageBox.No的意思是默认为no
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__': app = QApplication(sys.argv) #这三个是必不可少的部分
ex = Example()
sys.exit(app.exec_())
这样就创建了一个空白的窗口,点击×会出来提示,因为把closeevent这个函数重写了。
---------------------------------然后创建控件并链接相关的函数
---------------------------------举一个例子,该例子用于更改图片下载的路径
     self.btn2 = QPushButton('选择保存路径', self)   #设计保存下载路径的按钮
        self.btn2.setToolTip('请输入储存图片的磁盘地址')
        self.btn2.clicked.connect(self.filepath)        #建立信号和槽的联系,将单击信号与下面的filepath进行链接
def filepath(self):                                 #用于修改下载路径的函数
        file_path=QFileDialog.getExistingDirectory(self)   #获取选择的路径
        os.chdir(file_path)                    #更改当前的工作路径
接下来创建一个容器把控件放进去(不放也可以,这仅仅只是为了好看)
-------------------------例子:
self.groupBox = QGroupBox(self) #设置QT容器
self.groupBox.move(450, 105) #移动容器的位置
self.groupBox.resize(120,280) #设置容器的尺寸
self.groupBox.setTitle('菜单栏') #设置容器的标题
self.groupBox.setAlignment(4) #4为ALignHCenter为居中的意思(仅仅对上述的“菜单栏”有效)
这里的参数可以给0-4还是1-4我忘记了,不同的数字对应不同的对齐方式,可以挨个试试 layout = QVBoxLayout() #新建一个垂直布局
layout.addWidget(self.lineEdit) #往该布局中添加各种控件
layout.addWidget(self.btn2)
layout.addWidget(self.btn)
layout.addWidget(self.btn3)
self.groupBox.setLayout(layout) #显示该布局 一定要有这一步,不然容器不显示
剩下的就是一些控件的基本用法,可以参考代码,里面写的自认比较清楚简单。
用到的功能就下面这几个功能,使用方法和上述一样,就不一一赘述了。
from PyQt5.QtWidgets import QWidget,
QPushButton,QGroupBox,
QApplication,QLabel,QLineEdit,QToolTip, QMessageBox,QFileDialog,QTextEdit,QProgressBar,QVBoxLayout
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import QFont
from PyQt5.QtGui import QPixmap
其实用QT Designer会更加方便快捷,本人当时没有时间学这个了,其实本人更推荐使用它,因为这样更加高效。
有什么问题可以评论留言,看见了会第一时间回复。
简单的爬虫程序以及使用PYQT进行界面设计(包含源码解析)的更多相关文章
- 简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析
		
简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析 虽然经常用 OAuth 2.0,但是原理却不曾了解,印象里觉得很简单,请求跳来跳去,今天看完相关介绍,就来捋一捋 ...
 - QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
		
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
 - Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战
		
Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战 说明:Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战,优惠券是一种常见的促销方式,在规定的周期内购买对应商品类型和额度的商品 ...
 - java画图程序_图片用字母画出来_源码发布_版本二
		
在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中. 项目结构: 运行效果1: 原图:http://imag ...
 - 设计模式-简单工厂Coding+jdk源码解析
		
感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...
 - 爬虫浅谈一:一个简单c#爬虫程序
		
这篇文章只是简单展示一个基于HTTP请求如何抓取数据的文章,如觉得简单的朋友,后续我们再慢慢深入研究探讨. 图1: 如图1,我们工作过程中,无论平台网站还是企业官网,总少不了新闻展示.如某天产品经理跟 ...
 - python爬虫-淘宝商品密码(图文教程附源码)
		
今天闲着没事,不想像书上介绍的那样,我相信所有的数据都是有规律可以寻找的,然后去分析了一下淘宝的商品数据的规律和加密方式,用了最简单的知识去解析了需要的数据. 这个也让我学到了,解决问题的方法不止一个 ...
 - Spring源码解析-AOP简单分析
		
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等,不需要去修改业务相关的代码. 对于这部分内容,同样采用一个简单的例子和源码来说明. 接口 public ...
 - 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
		
前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
 
随机推荐
- Centos 或者 Redhat修改系统时间
			
使用Redhat,打开电脑,系统时间比本地时间快一个小时 直接敲命令:date -s "2019-4-2 09:14:00"是立即生效了,但是重启后,系统时间还是原来的. 修改了其 ...
 - Oncomine 数据库
			
网址 https://www.oncomine.org/resource/login.html Oncomine 是目前世界上最大的癌基因芯片数据库和整合数据挖掘平台,旨在挖掘癌症基因信息.Onco ...
 - Python-DDT框架
			
Install pip install ddt 实例 import unittest from ddt import ddt, data, unpack @ddt class MyTestCase(u ...
 - 【Beta】Scrum meeting 4
			
目录 写在前面 进度情况 任务进度表 Beta-1阶段燃尽图 遇到的困难 照片 commit记录截图 小程序前端仓库 技术博客 写在前面 例会时间:5.8 22:30-23:00 例会地点:微信群语音 ...
 - 一口气讲完 LSA — PlSA —LDA在自然语言处理中的使用
			
自然语言处理之LSA LSA(Latent Semantic Analysis), 潜在语义分析.试图利用文档中隐藏的潜在的概念来进行文档分析与检索,能够达到比直接的关键词匹配获得更好的效果. LSA ...
 - RocketMQ常用命令【转】
			
首先进入 RocketMQ 工程,进入/RocketMQ/bin 在该目录下有个 mqadmin 脚本 . 查看帮助: 在 mqadmin 下可以查看有哪些命令 a: 查看具体命令的使用 : ...
 - PHP系列 | PHPexcel导入xls格式 ,提示错误:iconv(): Wrong charset, conversion from `CP936' to `UTF-8' is not allowed
			
导入xls格式(2003版本)时会报错提示错误信息 iconv(): Wrong charset, conversion from `CP936' to `UTF-8' is not allowed[ ...
 - Kibana启动后外网访问不了
			
问题 Kibana启动后,使用外网访问 http://ip地址:5601 访问不了日志中最后显示 "statusCode":302 ,在控制台 curl http://localh ...
 - MYSQL报错:1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
			
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'rpa ...
 - django入门6引入验证码插件 django-simple-captcha
			
Django的验证码插件 https://github.com/mbi/django-simple-captcha 安装 (mxonline) C:\Users\ws>pip install ...