精华内容
下载资源
问答
  • Python爬虫做一个界面.上

    千次阅读 2018-10-17 01:38:06
    开始思考如何可以做一个简单界面交互,再增加爬虫的可操作室,做交互界面有两个思路:</p> 用Django做一个web界面; 用PyQt做一个exe程序界面; <p>事实上在我写这一篇文章的时候,...

    <p>做爬虫做了那么久,开始逐渐不满足写好程序,每次只能完成一件事情。开始思考如何可以做一个简单界面交互,再增加爬虫的可操作室,做交互界面有两个思路:</p>

    • 用Django做一个web界面;
    • 用PyQt做一个exe程序界面;

    <p>事实上在我写这一篇文章的时候,已经完成PyQt的demo,再开始思考两种方式的优劣。后来想通了,web界面可以无缝隙跨平台跨系统进行沟通,所以采用html语言的web界面会是以后的交互主体。可是这不妨碍我们先看一看Pyqt,这一篇文章先介绍怎么用PyQt来做exe界面。</p>

    <p>这篇文章会偏向于Pyqt的介绍,爬虫之前已经有比较多的文章介绍了,在这里更多的是介绍怎么做Pyqt的界面,以及将我们的爬虫嵌入到界面内。</p>

    先写个爬虫

    <p>这一次我们来采集点喜闻乐见的内容妹子图,我们目标是扒出首页所有妹子图的链接。这个网站的逻辑比较简单,直接首页get之后,再通过BeautifulSoup的各种find就能扒到所有的链接。当然,如果比较贪心的,可以在里面再加上翻页器的功能,具体就是在链接后面加入/page/(page_number)就可以了,page_number是相应的页数,,</p>

    <p>不带翻页器,写了一个专门爬妹子图的类,附带效果图,输出每个页面链接的id以及titlte,通过页面id我们可以进入到title对应的页面进一步的做我们想做的嘿嘿嘿。</p>

    class Mzitu():
        
        def __init__(self):
            url = "http://www.mzitu.com/"
            headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
                       'Host': 'www.mzitu.com'}
            response = requests.get(url, headers = headers)
            content = BeautifulSoup(response.text, 'lxml')
            linkblock = content.find('div', class_="postlist")
            self.linklist = linkblock.find_all('li')
        
        def getli(self):
            linklist = self.linklist
            linksum = dict()
            
            for link in linklist:
                url = link.a.get('href')
                linkid = re.search(r'(\d+)', url).group()
                firstspan = link.span
                titleword = firstspan.get_text()
                secondspan = firstspan.find_next_sibling('span')
                uploadtime = secondspan.get_text()
                thirdspan = secondspan.find_next_sibling('span')
                viewcount = thirdspan.get_text()
                title = "%s 发布在%s 共浏览%s" % (titleword, uploadtime, viewcount)
                linksum[linkid] = title
            return linksum
    

    嗯,效果图

    <p>在之前的Python爬虫项目中,基本就是止于此,将所有链接爬出来后,再一个链接一个链接的进入,做我们想做的事情。但如果我现在和你说,我不要所有链接都进入,进入哪些链接,我要通过title或者浏览次数,甚至是图片判断。那这个时候,我们就要有一个交互页面给我们的用户,这个界面给我们的用户筛选他喜欢的链接进行选择性的下载。</p>


    先举个例子教你做界面

    <p>简单介绍一下PyQt是个什么。PyQt就是Python语言的GUI编程解决方案之一。在PyQt5中,可通过自带的Creator工具生成窗体文件,并通过内置函数uic转化为Python代码。</p>

    <p>简单来说,你可以通过Qt Creator(PyQt4是叫做Qt Designer,此处只以Qt Creator为例,官网下载度盘下载)画出你想要的任何界面,再使用内置函数uic或者外部命令pyuic转化为Python代码,然后将生成的Python代码和你自身的程序关联就可以。盗用老外的一张流程图:</p>

    [流程图](http://projects.skylogic.ca/blog/how-to-install-pyqt5-and-build-your-first-gui-in-python-3-4/)

    <p>安装是很简单的,这个软件本身是开源的,选择非商业用途就可以一直使用,一路下一步安装完毕。完成后打开界面,Ctrl+N新开一个文档之后,依次选择Qt以及Qt Designer Form之后,选好工作目录,就可以进入设计页面。在设计页面上将左侧的元素,拖拽到中间的设计页面就摆放好即可,做好后保存就能生成一个.ui后缀名的文件:</p>

    使用界面

    新建一个页面

    设计页面

    <p>假如现在需要做一个加法器,实现两个数字a和b的相加,数字a和b的通过数字输入。拖拽元素将这个界面完成,效果如下图。左边有简单的加法输入以及输出显示框,点击下面计算按钮开始计算,右边有一个输出历史计算的页面。元素列表处可以看到各个拖拽元素的名称以及对应的类,所有的这些元素都在MainWindow以及centralwidget上面。</p>

    <p>记住我们所设定的元素输入textEdit、textEdit_2、元素输出textEdit_3、历史记录输出textBrowser、以及计算按钮pushButton所对应的元素名称。</p>

    计算器页面以及元素列表

    <p>保存后,会在工作目录上出现一个以.ui后缀为名的文件,通过notepad++打开了,可以发现内部就是一个xml文件。现在需要将这个窗体文件转化为python文档,PyQt给我们提供了两个方式,一个是通过外部命令pyuic5,一个是内置函数uic。</p>

    mainwindow.ui

    外部命令pyuic5

    <p>用外部命令pyuic5可以将.ui的文件转化为.py的文件,在.ui所在文件夹空白处按着shift鼠标点右键,打开控制命令行,输入:</p>

    pyuic5 -x mainwindow.ui -o mainwindow.py
    

    <p>pyuic是一个转化工具,通过查看pyuic.bat的代码,知道其本质是调用PyQt5.uic.pyuic,点开生成的mainwindow.py文件,点开运行一下,便可以看到界面。在上面输入任何数字,但不能计算,没有任何内容显示。我们需要对mainwindow.py进行修改,将元素和函数关联:</p>

    计算器界面

    <p>在mainwindow.py里面,setupUI是用来生成整个界面的函数,里面包括对元素位置、大小、字体、对象名称、对象间关系。retranslateUi应该是对文字的转化,具体要看QtCore.QCoreApplication.translate的说明文档。最后的主体main函数,是生成窗体对象、窗体显示以及退出,是pyuic5命令中的-x参数生成。</p>

    <p>通过toPlainText引用textEdit以及textEdit_2的数字,在addfunction内完成加法运算,最后将结果输出到textEdit_3里面,并通过textBrowser.append来保存计算过程。计算界面如图所示:</p>

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            ... ...  ##此处太长省略了
            self.pushButton.clicked.connect(self.addfunction) ##用来将pushButton关联加法的函数
            
        def addfunction(self):  ##用来实现加法的函数
            a = float(self.textEdit.toPlainText())
            b = float(self.textEdit_2.toPlainText())
            c = a + b
            self.textEdit_3.setText(str(c))
            self.textBrowser.append("%.2f + %.2f = %.2f" % (a, b, c))
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.label.setText(_translate("MainWindow", "加法计算器"))
            self.label_2.setText(_translate("MainWindow", "+"))
            self.label_3.setText(_translate("MainWindow", "="))
            self.pushButton.setText(_translate("MainWindow", "计算"))
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

    计算界面

    通过uic内部转化

    <p>上面这种方法最好的地方在于,你可以通过更改代码的方式对界面进行更改。但事实上,对于一个爬虫界面而言,需求复杂的还是比较少,并且不熟悉编程的人会更依赖在Qt Creator上做更改,那这样每次都需要通过外部命令去更新界面程序文件就会显得有点繁琐。可以考虑采用内部命令uic,直接加载.ui文件进行操作:</p>

    import sys
    from PyQt5 import uic, QtWidgets
    
    (form_class, qtbase_class) = uic.loadUiType('mainwindow.ui')
    
    class MainWindow(qtbase_class, form_class):
        def __init__(self):
            super(MainWindow, self).__init__()
            self.setupUi(self)
            self.pushButton.clicked.connect(self.addfunction)
        
        def addfunction(self):
            a = float(self.textEdit.toPlainText())
            b = float(self.textEdit_2.toPlainText())
            c = a + b
            self.textEdit_3.setText(str(c))
            self.textBrowser.append("%.2f + %.2f = %.2f" % (a, b, c))
           
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        ui = MainWindow()
        ui.show()
        sys.exit(app.exec_())
    

    <p>uic.lodUiType该函数输出两个类,一个是form class,一个是Qt base class。根据链接的说明文件,form class 仅仅是一个类,衍生自Python object type,Qt base class是一个ui的框架类,这个框架就类似于QDialog、QWidget以及QMainWindow。(但是这两个类的具体情况还是没有弄清楚,ui的基本特征是哪个class提供,通过super继承是如何使这两个类运行起来的,等等)。</p>

    <p>后一个方法相对会更加方便,更改ui之后,不需要经过外部命令就可以直接调用,适合前提调试;如果是ui已经成熟了,用第一个方法的一致性会更好。</p>


    小结

    <p>通过这一篇文章,我们已经将所有的素材备齐了,下一篇文章,需要将这两者结合起来。我们要对爬下来的内容做一个筛选界面,然后爬虫最终根据我们的筛选来输出链接。</p>

    小礼物走一走,来简书关注我



    作者:Garfield_Liang
    链接:https://www.jianshu.com/p/f28d1c1e2dfd
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • Python爬虫做一个界面.概述 一、实验简介 1.1 实验内容 通过 PyQt 给妹子图网的Python爬虫做一个交互界面,从而对 PyQt 有初步的理解,并学会如何使用 Qt Creater 做界面以及实现基础功能。课程分为三个部分...

    给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 环境配置

    本实验环境采用win10环境,实验中会用到的程序:

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

    前面的文章已经介绍过如何使用pyqt5,以及如何搭配环境,此处便不再重复。

    3.2 Qt Creator第一次实践——完成计算器Demo

    我们打开 Qt Creator ,按照 File - New File or Project - Qt - Qt Designer Form - Main Window,然后更改文件名以及路径,就可以看到新建的界面了(如果感觉界面太窄,可以通过命令 xrandr 命令来更改页面分辨率,具体可以看这里

    保存后,会在工作目录上出现一个以.ui后缀为名的文件,打开可以发现内部就是一个xml文件。现在我们需要通过 python 来对其中的元素进行关联,从而实现最终的显示、按键动作的实现。

    import sys
    from PyQt5 import uic, QtWidgets
    
    (form_class, qtbase_class) = uic.loadUiType('demo.ui')
    
    class MainWindow(form_class, qtbase_class):
        def __init__(self):
            super(MainWindow, self).__init__()
            self.setupUi(self)
            self.pushButton.clicked.connect(self.addfunction)
    
        def addfunction(self):
            a = float(self.textEdit.toPlainText())
            b = float(self.textEdit_2.toPlainText())
            c = a + b
            self.textEdit_3.setText(str(c))
            self.textBrowser.append("%.2f + %.2f = %.2f" % (a, b, c))
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        ui = MainWindow()
        ui.show()
        sys.exit(app.exec_())

    首先是一些包的加载,然后就是加载我们的 .ui 文件,通过 uic.lodUiType 函数可以输出两个类,一个是 form class,一个是 Qt base class。根据链接的说明文件,form class 仅是一个类,衍生自 Python object type,Qt base class是一个ui的框架类,这个框架就类似于 QDialog 、 QWidget 以及 QMainWindow 。(但是这两个类的具体情况还是没有弄清楚,例如:ui 的基本特征是哪个 class 提供,通过 super 继承是如何使这两个类运行起来的,等等)。

    后面的 MainWindow 的类就是我们用来实现界面中数字的输入输出、以及函数加载功能:

    通过 toPlainText 可以获得 textEdit 以及 textEdit_2 中输入的数字数字,并在 addfunction 内完成加法运算,最后将结果输出到 textEdit_3 里面。通过 textBrowser.append 将 生成计算的算式显示在 textBrowser 中。

    最后的主函数为固定写法,最终显示的效果如附图所示:

     

    三、实验总结

    通过这一次实验,相信大家对如何通过PyQt以及Python做一个交互界面,已经有一个初步的了解,这样后面的课程就比较好开展了。

    课后各位有兴趣可以想想,如果再现在这个Demo的基础上,再增加一个pushButton,完成减法运算。

    四、扩展阅读

    给Python爬虫做一个界面.上

    展开全文
  • Python爬虫做一个界面.概述 一、实验简介 1.1 实验内容 通过 PyQt 给妹子图网的Python爬虫做一个交互界面,从而对 PyQt 有初步的理解,并学会如何使用 Qt Creater 做界面以及实现基础功能。课程分为三个部分...

    给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 环境配置

    本实验环境采用win10环境,实验中会用到的程序:

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

    前面的文章已经介绍过如何使用pyqt5,以及如何搭配环境,此处便不再重复。

    3.2 配置爬虫

    在写爬虫之前,我们先来看看妹子图网的首页。页面的主要内容是由24个图框组成,查看页面的源代码(View page source),我们可以轻易知道其网页的构造,每一个li节点里面包含每一个链接里面包含:标题、原图链接、跳转链接、发布时间以及浏览次数。如果要翻下一页,只需要更改网址后缀,即在链接后面加入/page/(page_number)就可以了,page_number是相应的页数,妹子图的详细爬虫教程可以参考这个大大的文章

    class Mzitu():
    
        def __init__(self, url):
            self.url = url
            headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
                       'Host': 'www.mzitu.com'}
            response = requests.get(self.url, headers = headers)
            content = BeautifulSoup(response.text, 'lxml')
            linkblock = content.find('div', class_="postlist")
            self.linklist = linkblock.find_all('li')
    
        def printli(self):
            linklist = self.linklist
            linksum = list()
    
            for link in linklist:
                url = link.a.get('href')
                picurl = link.img.get('data-original')
                linkid = re.search(r'(\d+)', url).group()
                firstspan = link.span
                titleword = firstspan.get_text()
                secondspan = firstspan.find_next_sibling('span')
                uploadtime = secondspan.get_text()
                thirdspan = secondspan.find_next_sibling('span')
                viewcount = thirdspan.get_text()
                linksum.append((linkid, titleword, uploadtime, viewcount, picurl))
            return linksum

    3.3 配置PyQt界面

    首先是制作ui界面,拖曳3个Push Button 分别作为翻页的上页(pushButton_uppage)和下页(pushButton_nextpage)以及获得链接的开关(pushButton),拖曳Table Widget作为我们放置页面内容(tableWidget),拖曳2个Label分别作为页数显示(label_pagenum)以及图片输出(label),拖曳Text Browser作为我们链接输出(textBrowser)。

    保存后好,对ui文件的进行加载:

    import re, requests
    from bs4 import BeautifulSoup
    from PyQt5.QtWidgets import QApplication, QCheckBox, QPushButton, QHeaderView
    from PyQt5.QtGui import QPixmap
    import PyQt5.uic
    
    ui_file = 'Demo.ui'
    (class_ui, class_basic_class) = PyQt5.uic.loadUiType(ui_file)
    
     

    主类先继承 form class 以及 qt base class ,然后调用爬虫的 class 来生成首页内容的列表,根据首页的内容数量来确定 Table Widget 的行数,并设定相应列宽以及行高,最后是将 Check Box 以及 Push Button 放置在 Table Widget 中,并且对其中的 Push Button 与相应的功能函数进行关联:

    class Window(class_basic_class, class_ui):
    
        def __init__(self):
            super(Window, self).__init__() 
            self.url = "http://www.mzitu.com/"
            self.setupUi(self)
            totlist = Mzitu(self.url).printli()
            self.tableWidget.setRowCount(len(totlist))
            self.tableWidget.setColumnCount(2)
            self.tableWidget.setColumnWidth(0, 435)
            verticalHeader = self.tableWidget.verticalHeader()
            verticalHeader.setSectionResizeMode(QHeaderView.Fixed)
            verticalHeader.setDefaultSectionSize(30)
            self.textBrowser.setOpenExternalLinks(True)  ##隐藏列表头
            self.page = 1  ##设定初始的页面数,为后面做翻页器做准备
            self.label_pagenum.setNum(self.page)  
            self.checkBoxs = [self._addCheckbox(index, item[0], item[1]) for index, item in enumerate(totlist)]
            self.pushButtons = [self._addpushButtonpic(index, item[0], item[4]) for index, item in enumerate(totlist)]
            self.pushButton.clicked.connect(self.getSelList)
            self.pushButton_nextpage.clicked.connect(lambda: self._nextPage(1))
            self.pushButton_uppage.clicked.connect(lambda: self._nextPage(-1))
    
     

    _addCheckbox 用于生成 Check Box 单元,并将单元通过 setCellWidget 关联到 Table Widget 对应位置中。每一个 Check Box 最终都用 isChecked() 函数来判断是否有被勾选上,getSelList 是用来在 textBrowser 中输出对应内容的名称以及链接,注意链接这里我为了可以直接点开,而不需要复制到浏览器里面才能打开,所以采用 html 文本书写,以达到超级链接的效果:

        def _addCheckbox(self, index, idd, boxtitle):
            checkBox = QCheckBox()
            checkBox.setObjectName(idd)
            checkBox.setText(boxtitle)
            self.tableWidget.setCellWidget(index, 0, checkBox) ##setCellWidget前面两个数字分别代表行和列,最后是需要关联的元素
            return checkBox
    
        def getSelList(self):
            selList = [(item.objectName(), item.text()) for item in self.checkBoxs if item.isChecked() == True]
            for item in selList:
                url = 'http://www.mzitu.com/'+item[0]
                self.textBrowser.append(item[1])
                self.textBrowser.append('<a href = %s>%s</a>' % (url, url))  ##此处输出超级链接
            return selList
    
     

    _addpushButton 是用于在 Table Widget 中关联 Push Button,方法和上述 Check Box 类似。注意 Push Button 关联函数那里,我使用了 Lambda 表达式。_showpic 就是一个在 Label 中输出图片的功能,具体在之前 Demo 那里已经做过叙述:

        def _addpushButtonpic(self, index, idd, href):
            pushButton = QPushButton()
            pushButton.setObjectName(idd)
            pushButton.setText(idd)
            self.tableWidget.setCellWidget(index, 1, pushButton)
            self.pushButton.clicked.connect(lambda: self._showpic(idd, href))
            return pushButton
    
        def _showpic(self, idd, href):
            pic = requests.get(href).content
            pixmap = QPixmap()
            pixmap.loadFromData(pic)
            self.label.setPixmap(pixmap)
    
     

    _nextPage 是实现翻页器功能,一开始是考虑只做下一页的,但使用中发现不方便。所以需要增加向上翻的功能,这是通过将翻页数分别设定为+1改成-1来实现的。更换了页码之后,需要重新通过爬虫 class 获得新页面的内容,并重新用 _addCheckbox 以及 _addpushButto n函数来更新 Check Box 以及 Push Button 的内容,最后输出新的 self.checkboxs 以及 self.pushButtons:

        def _nextPage(self, page):
            self.page += page
            self.label_pagenum.setNum(self.page)
            url = self.url + '/page/' + str(self.page)
            totlist = Mzitu(url).printli()
            newcheckBoxs = []
            newpushButtons = []
            for index, item in enumerate(totlist):
                newcheckbox = self._addCheckbox(index, item[0], item[1])
                newpushbutton = self._addpushButtonpic(index, item[0], item[4])
                newcheckBoxs.append(newcheckbox)
                newpushButtons.append(newpushbutton)
            self.checkBoxs = newcheckBoxs
            self.pushButtons = newpushButtons
    
     

    最后我们来看看最终效果图。

    三、实验总结

    最后,我们完整的程序就完成了,后面可以通过py2exe转化是window实际可以操作的执行程序,限于篇幅这里没有写道,整个 Table Widget 还可以加入浏览数、新增时间以及全选等功能,来完善整个体验。最后相信精明的老司机已经发现,既然获得链接,通过爬虫可以进一步获得链接后面的图片,然后通过筛选就可以将喜欢的图片下载到自己的硬盘里面了。

     

    展开全文
  • Python爬虫做一个界面.概述 一、实验简介 1.1 实验内容 通过 PyQt 给妹子图网的Python爬虫做一个交互界面,从而对 PyQt 有初步的理解,并学会如何使用 Qt Creater 做界面以及实现基础功能。课程分为三个部分...

    给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 环境配置

    本实验环境采用win10环境,实验中会用到的程序:

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

    前面的文章已经介绍过如何使用pyqt5,以及如何搭配环境,此处便不再重复。

    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('demo1.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('demo1.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()
            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 中就可以显示被勾选的字母。

    三、实验总结

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

    展开全文
  • python爬虫:做一个界面爬虫小软件

    千次阅读 2019-10-12 15:46:57
    2.编写一个GUI界面爬虫程序,打包成exe重新文件 3.遇到的难点 1.分析如何抓取不同类型的图片 首先打开网站,可以看到有如下6个类型的菜单 点击不同菜单,发现URL显示如下 大胸妹:...
  • 如何使用python做GUI界面?输入一个数据,然后将结果输出。</p>
  • 1为了方便管理者添加和删除商品,用了滚动条来...3这里我认为有点难的是每个商品都有+-号表示增加减少购买商品的数量,如何弄清点的是哪个商品,并用一个字典实时记录客户购买每个商品的数量,方便后来结账 ...
  • 如何使用pyQT做pythonGUI界面

    万次阅读 2016-02-25 02:58:11
    如何使用pyQT做python界面这里我们不妨找一个例子做说明,假设我们现在要做一个登录个人信息平台的界面如下: 其中输入的内容可应用到程序中去。那么我们该如何进行呢?步骤如下: 在开始菜单所有应用中找到PyQt...
  • 1 ui设计 使用qt designer ,按装anaconda后,在如下路径找到: conda3.05\Library\bin designer.exe文件,双击启动: ...比如,其中一个用于计算器显示的对象:lcdNumber,对象的类型为:LCD Number。右侧为
  • 却道天凉好个秋~pyqt5+python+qtdesigner+pycharm制作一个可视化的GUI爬虫工具前言:最近闲来无聊又开始了py之路,这次需要的是制作一个贴吧的关键词搜索相关帖子的工具,开始以为百度贴吧没有“全吧搜索”这样的...
  • Python支持多种图形界面的第三方库,包括:TkwxWidgetsQtGTK等等。但是Python自带的库是支持Tk的Tkinter,使用Tkinter,无需安装任何包,就可以直接使用。...Tk是一个图形库,支持多个操作系统,使...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 312
精华内容 124
关键字:

python如何做一个界面

python 订阅