通过 PyQt 给妹子图网的Python爬虫做一个交互界面,从而对 PyQt 有初步的理解,并学会如何使用 Qt Creater 做界面以及实现基础功能。课程分为三个部分:
这是本课程的第一次实验。在这里先给大家看看,学完这三节课之后,最后我们要完成的效果:
本课程难度属于一般,属于初级级别课程,适合具有 Python 基础的用户,熟悉 Python 基础知识加深巩固。
通过本次实验,学会如何在如何结合 PyQt 以及 Python, 完成图片预览以及元素列表两个Demo。
本实验环境采用带桌面的 Ubuntu Linux 环境,实验中会用到的程序:
进入系统后,如果 Linux 中默认的 python3 为 3.5 版本,可以通过以下指令切换到 3.4:
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.4 70 --slave /usr/bin/python3m python3m /usr/bin/python3.4m
更新 apt-get 的链接:
$ sudo apt-get update
安装 Qt Creater 以及 PyQt5 相关组件:
$ sudo apt-get install qtcreator pyqt5-dev-tools
安装 beautifulsoup(bs4):
$ sudo apt-get install python3-bs4
再以前做命令行爬虫的时候,我们是没有办法预览图片的。现在采用 PyQt,预览图片就可能了。一般而言,我们爬虫都仅仅能获得图片的链接,如果将这个链接转化为界面上的图片,是我们这一节探讨的重点。
例如,我们怎么将这个链接转化为图片:http://i.meizitu.net/thumbs/2017/04/90448_18b47_236.jpg
先新建一个.ui文件,再主页面上简单拖拽一个Push Button以及Label(注意要够大,能放图片)
在PyQt里面,Qlabel可以用来加载jpg图片。Qlabel是一个图片、文字以及数字的浏览组件,另外他也可以作为其他组件的一个标识工具。根据其说明文档,Qlabel只能识别PyQt下面QPixmap格式的图片,故我们整体的逻辑是通过request.get来将图片的数据下载出来,再用Pixmap装载这些数据,最后用Qlabel将Pixmap还原回图片。
import sys, requests
from PyQt5 import QtGui, uic, QtWidgets
(form_class, qtbase_class) = uic.loadUiType('Demo3.ui')
class MainWindow(qtbase_class, form_class):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self._showpic)
def _showpic(self):
url = 'http://i.meizitu.net/thumbs/2017/04/90448_18b47_236.jpg' ##图片链接
pic = requests.get(url).content ##获取图片链接的数据
pixmap = QtGui.QPixmap() ##新建一个QPixmap的类
pixmap.loadFromData(pic) ##pixmap加载图片数据
self.label.setPixmap(pixmap) ##最终在label上显示
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
ui = MainWindow()
ui.show()
sys.exit(app.exec_())
完成后点击pushButton,我们就可以看到链接对应的图片了。
能预览图片,就能直观筛选自己喜欢链接了。同样,也是先作一个小的demo,demo的目的是可以生成的随机十个字母的Check Boxes,最后在Text Browser内显示所勾选的字母。
新建一个ui文件,从界面的左侧拖拽一个Table Widget、Text Browser以及Push Button到主界面上。同样通过pyuic5转为py文件,目的是点击Push Button后,在Table Widget中被勾选的字母将会显示在右侧的Text Browser中。在这里,我们同时增加一个 Check Box,看看他再 Python中是如何生成的。
先用 pyuic5 命令来看看 Push Button 以及 Check Box 在 Python 中的加载机理。
在含有.ui文件的目录下的终端里面,输入:
$ pyuic5 -x Demo4.ui -o Demo2py.py
在前面的setioUI函数里面,我们可以看到其中的 Push Button 以及 Check Box 的生成以及加载方式。首先显示通过 QtWidgets 生成相对应的对象,然后通过 setGeometry 函数来确定该对象的位置以及大小,最后给这个对象设定一个名称,这就是对象的加载过程。
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(170, 280, 85, 27))
self.pushButton.setObjectName("pushButton")
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(440, 290, 65, 18))
self.checkBox.setObjectName("checkBox")
仿照这个过程,我们将需要的 Check Box 对象加到 Table Widget中。Demo4 中 randomalpha 是一个10个随机字母的序列, _addcheckbox 是用于在 Table Widget 中生成 Check Box ,注意最后是用 Table Widget 的 setCellWidget 函数关联起来,而 _printchecked 是用来输出 Check Box 序列中已经选上(isChecked)的字母。
import sys
from PyQt5 import uic, QtWidgets
(form_class, qtbase_class) = uic.loadUiType('select.ui')
class MainWindow(qtbase_class, form_class):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
strings = self.randomalpha()
self.tableWidget.setColumnCount(2)
self.tableWidget.setRowCount(len(strings))
self.checkboxs = [self._addcheckbox(alpha, i) for i, alpha in enumerate(strings)]
self.pushButton.clicked.connect(self._printchecked)
def randomalpha(self):
import random, string
return [random.choice(string.ascii_lowercase) for i in range(10)]
def _addcheckbox(self, alpha, i):
checkbox = QtWidgets.QCheckBox(self.centralwidget)
checkbox.setObjectName(alpha)
checkbox.setText(alpha)
self.tableWidget.setCellWidget(i,0, checkbox)
return checkbox
def _printchecked(self):
printalpha = [cb.objectName() for cb in self.checkboxs if cb.isChecked() == True]
[self.textBrowser.append(alpha) for alpha in printalpha]
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
ui = MainWindow()
ui.show()
sys.exit(app.exec_())
最后实现的效果,如下图所示。对第一列进行勾选。然后点击 PushButton,在右边的 Text Browser 中就可以显示被勾选的字母。
通过这一次实验,我已经将完成我们最终大业的两个秘密武器告诉给你了,剩下的,我们就看如何将这两节课的内容融入到我们的爬虫里面。