简单的爬虫程序以及使用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,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
随机推荐
- Python错误 -- try/except/finally 、调用栈、记录错误、抛出错误
Bug:程序编写有问题造成的错误,称之为Bug. debug:调试 注意:bug是程序本身有问题.有缺陷.系统漏洞 异常:完全无法在程序运行中预测的错误,例如写入文件的时候,磁盘满了,写不进去了 ...
- JS的ES6扩展
1.字符串扩展 1. includes(str) : 判断是否包含指定的字符串 2. startsWith(str) : 判断是否以指定字符串开头 3. endsWith(str) : 判断是否以指定 ...
- 6-网页,网站,微信公众号基础入门(PHP学习_1)
https://www.cnblogs.com/yangfengwu/p/11037675.html 安装PhpStrom http://www.jetbrains.com/phpstorm/ 然后百 ...
- luogu P2353 背单词
二次联通门 : luogu P2353 背单词 一眼看过去, 卧槽,AC自动机板子题 写完后T成SB 卧槽10^6 做个篮子啊 重构思路... 恩..Hash + 莫队... 恶心啊.. 找xxy d ...
- nginx之rewrite及防盗链
rewrite示例-自动跳转https 示例1:自动把首页的http转化成https location / { root /data/nginx/pc/html; index index.html; ...
- javaweb利用filter拦截未授权请求
项目上有个小需求,要限制访问者的IP,屏蔽未授权的请求.该场景使用过滤器来做再合适不过了. SecurityFilter.java: public class SecurityFilter imple ...
- 20190815网络与信息安全领域专项赛线上赛misc WriteUp
目录 签到题 题目内容 使用工具 解题步骤 七代目 题目下载地址 使用工具 解题步骤 亚萨西 题目下载链接 使用工具 解题步骤 24word 题目下载链接 使用工具 解题步骤 感想 几星期前报了名却完 ...
- PHP系列 | PDO::prepare(): send of 68 bytes failed with errno=32 Broken pipe
设计场景 1.开启Redis的键空间过期事件(键过期发布任务),创建订单创建一个过期的key,按照订单号为key,设置过期时间. 2.通过Redis的订阅模式(持久阻塞),获取到订单号进行组装. 3. ...
- JS实现统一社会信用代码的效验(组织机构代码效验)
参考原文https://blog.csdn.net/hdhxby/article/details/56015370 部分错误,修改整合了下 想查询数据的,请点击:统一信用代码查询地址 查看效验规则点击 ...
- vue---将json导出Excel的方法
在做数据表格渲染的时候,经常遇到的需求的就是将导出excel,下面是使用vue进行项目数据进行导出的方法. 一.安装依赖 npm i -S file-saver npm i -S xlsx 二.在sr ...