python3爬虫与GUI:一个简易的搜索实用小工具

平时在获取爬虫之后,会不满足于仅仅得到了结果,而是想经过一个交互式的界面来进一步的完善,获取更多的功能,从而可以更好的展示数据。

下面运用了pythonpyqt5库来进行GUI的设计。

pyqt5这个库实现简单的界面化有两种方法:

  • 编写代码(一般为几十行代码足够了)。

  • 结合QT Creator来进行界面设计,加入信号与槽的机制,槽这一方面还是需要编写相应的几行代码。

下面一一进行简单的介绍。

代码编写方式

假设我已经利用爬虫写出来了百度百科维基百科的接口的代码程序,接下来仅仅需要设计好界面,再者之后利用好信号与槽的机制将接口代码与界面相连接即可完成一个简易的搜索实用小工具了。

在此简单理解一下信号与槽机制以及所谓的事件机制:比如我们有一个按钮,点击此按钮便弹出一个写有‘Hello’的窗口,点击到弹出新窗口的这一过程,有个响应的过程,我们可以理解为发送信号(点击按钮),之后有弹出新窗口(响应),而这一系列过程包括弹出的内容我们可称之为事件。

关于学习pyqt5库的中文教程地址:https://maicss.gitbooks.io/pyqt5/content/事件和信号.html

从头开始看一下,之后再看这一篇大概就知道简单的交互式界面是如何生成的了。

简单描述一下思路:先设计布局好界面(包括定义好相关按钮的快捷键),写入爬虫代码,信号与槽机制的连接设定,即完成了此次的任务。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import sys
import urllib.request
from bs4 import BeautifulSoup
import re
from urllib.parse import quote
from PyQt5.QtWidgets import (QPushButton, QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication,
QComboBox)
from PyQt5.QtCore import QCoreApplication
class Example(QWidget):
def __init__(self):
'''
初始化
'''
super().__init__()
self.initUI()
def baidu_baike(self, entry):
'''
百度百科词条内容爬取代码
entry:词条
因为太懒了..所以爬取的代码没有自己写..
'''
url = 'https://baike.baidu.com/item/' + urllib.parse.quote(entry)
html = urllib.request.urlopen(url)
content = html.read().decode('utf-8')
html.close()
# lxml器进行解析
soup = BeautifulSoup(content, "lxml")
text = soup.find('div', class_="lemma-summary").children # 簡介部分
intro_text = ''
# 数据爬取
for x in text:
word = re.sub(re.compile(r"<(.+?)>"), '', str(x))
words = re.sub(re.compile(r"\[(.+?)\]"), '', word)
intro_text += words
return intro_text # 返回文本(str格式)
def intro_final(self, entry):
'''
异常处理
'''
try:
return self.baidu_baike(entry)
except AttributeError:
return "词条定义不够清晰/词条目前未成立!"
def initUI(self):
# GUI布局及控件放置
search_label = QLabel("请输入搜索词条:")
search_item = QLineEdit()
combo = QComboBox(self)
combo.addItem("百度百科")
combo.addItem("维基百科(不可用)")
btn1 = QPushButton("开始搜索", self)
# shortcut快捷键的设置
btn1.setShortcut('return')
btn2 = QPushButton("清空", self)
btn2.setShortcut('esc')
btn3 = QPushButton('退出', self)
btn3.setShortcut('command+q')
btn3.setShortcut('Ctrl+q')
btn3.clicked.connect(QCoreApplication.instance().quit)
search_result = QTextEdit()
grid = QGridLayout()
grid.setSpacing(5)
grid.addWidget(search_label, 1, 0)
grid.addWidget(btn3, 2, 1)
grid.addWidget(search_item, 2, 0)
grid.addWidget(btn1, 3, 0)
grid.addWidget(btn2, 3, 1)
grid.addWidget(search_result, 4, 0, 5 , 0)
self.setLayout(grid)
# 信号机制的设置,定义为一个方法作为反映的对象,这里很好理解
def search():
'''
搜索信号反映的响应
'''
search_result.setText(self.intro_final(search_item.text()))
btn1.clicked.connect(search)
def clear():
'''
清空信号反映的响应
'''
search_result.setText("")
search_item.setText("")
btn2.clicked.connect(clear)
# 设置窗口大小
self.setGeometry(500, 150, 600, 500)
self.setWindowTitle("搜索引擎GUI")
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

以上有不懂的地方均可在pyqt5中文教程中找到思路。

效果图

结合QT Creator的界面设计

结合QT Creator的界面,我们肯定会想到:那当我们进行界面设计完成之后,就算是转化为.pypython脚本,那我们又该如何定义信号与槽的机制以及事件的机制呢?

下面的解说就是解决这个疑惑的。

第一步当然是去官网下载好软件了。

参考此篇文章:https://blog.csdn.net/win_turn/article/details/50465127

话不多说了,下载的时候其实有一个坑,即要记得下载有调试的那个版本,否则在设计界面时无法得到运行。

创建文件并且设计

在这里仅仅是为了达到解说的目的所以简单设计一下就好,说说设计下面的思路:定义一个按钮(名为确定),一个输入框,一个输出框,达到的目的是从输入框输入文字,按下确定按钮,输出框中输出与输入框一致的内容。

创建新的文件过程如图所示:

总之就是如上图一路点击下去即可。

之后会发现有这样的界面出现:

这个mainwindow.ui不说就能轻易知道就是用它来进行界面设计的。双击它即可进入设计界面(如图1),当然可选择Qt Designer进行设计(对其右键可弹出选项,如图2)。

  • 图1

  • 图2

为了尽快达到写完的目的,我简单的来进行一下示范…

先在界面中,设计一个按钮:

然后添加下面两种组件:

定义信号与槽

在这之前先将设计好的转为.pypython脚本文件。cd到相应的文件的目录下(即上面的mainwindow.ui所在的目录。注意,此步非常重要!)利用命令行:pyuic5 -o mainwindow.py mainwindow.ui

关于此命令行具体可参考:https://blog.csdn.net/yingmutongxue/article/details/8487348
(在此需要注意的是,我使用的是pyqt5,所以对应的命令行应当是pyuic5开头,若是pyqt4,则为pyuic4开头了。)

这样在本目录下即可找到转为后的python文件了。

再者,我们需要在这个文件实现上面说的思路,即相应的信号与槽机制的代码。因为时间问题,就不在此实现了(是真的写不下去了…)。

在完成之后,我们直接将此调入eclipse的工程目录下(我用的是eclipse),之后我们直接调用此文件即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
from PyQt5.QtWidgets import QApplication , QMainWindow
from mainwindow import *
if __name__ == '__main__':
# 主函数
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

这样即可完成结合软件设计界面,并在python中运行的一条龙服务了…

其实在Qt creator中就有信号与槽机制以及快捷键的设置了,这个可参考:https://wizardforcel.gitbooks.io/qt-beginning/content/60.html
(全面介绍了)

简单认识一下设计界面上的那些按钮功能(网上的图,出处忘记了…)

最后

唉..突然感觉直接写代码都还要方便多了…结合软件设计搞的时间浪费的还要多…

  • 参考:

https://blog.csdn.net/jclian91/article/details/77407723

https://maicss.gitbooks.io/pyqt5/content/介绍.html
(以上所有内容的拼接均可根据此pyqt5库中文教程来进行理解学习,还是一句话,要多动脑多动手实践。)

https://cuiqingcai.com/5551.html
(pyquery的使用教程)

  • 关于将python文件打包生成app的工具库:

py2app:.py –> .dmg

py2exe:.py –> .exe

  • 关于css选择器等其他内容的快速获取(基于chrome浏览器):

看上方的动图,选择完之后粘贴即可得出对应的内容(可适当删除中间字段而不影响达到目的),当然最好学会一点相关的内容,其实也不难上手。

---------------本文终---------------

文章作者:刘俊

最后更新:2019年01月02日 - 14:01

许可协议: 转载请保留原文链接及作者。