给Python爬虫做一个界面.模块化实验

一、实验简介

1.1 实验内容

通过 PyQt 给妹子图网的Python爬虫做一个交互界面,从而对 PyQt 有初步的理解,并学会如何使用 Qt Creater 做界面以及实现基础功能。课程分为三个部分:

  1. 了解如何将 Qt Creator 生成的界面导入的 Python 的环境中,并完成一个计算器Demo;
  2. 学会再实现 PyQt 中,完成图片预览以及元素列表两个Demo;
  3. 完成妹子图网爬虫的交互界面。

这是本课程的第一次实验。在这里先给大家看看,学完这三节课之后,最后我们要完成的效果:

1.2 实验知识点

  • PyQt 相关知识
  • Python Qt 编程

1.3 实验环境

  • Xfce终端
  • Python 3.x.x

1.4 适合人群

本课程难度属于一般,属于初级级别课程,适合具有 Python 基础的用户,熟悉 Python 基础知识加深巩固。

二、实验目的

通过本次实验,学会如何在如何结合 PyQt 以及 Python, 完成图片预览以及元素列表两个Demo。

三、开始实验

3.1 环境配置

本实验环境采用带桌面的 Ubuntu Linux 环境,实验中会用到的程序:

  1. Qt Creator: 一个轻量级界面开发环境,其设计目标是设计目标是使开发人员能够利用 Qt 这个应用程序框架更加快速及轻易的完成开发任务。
  2. requests:是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库
  3. beautifulsoup: 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。(在第三节课完成爬虫的项目时会用到)

进入系统后,如果 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

3.2 图片预览Demo

再以前做命令行爬虫的时候,我们是没有办法预览图片的。现在采用 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,我们就可以看到链接对应的图片了。

3.3 对象列表Demo

能预览图片,就能直观筛选自己喜欢链接了。同样,也是先作一个小的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 中就可以显示被勾选的字母。

三、实验总结

通过这一次实验,我已经将完成我们最终大业的两个秘密武器告诉给你了,剩下的,我们就看如何将这两节课的内容融入到我们的爬虫里面。