给Python3爬虫做一个界面 妹子图网实战 3

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

给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 配置爬虫

在写爬虫之前,我们先来看看妹子图网的首页。页面的主要内容是由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)。

Demo5界面

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

import re, requestsfrom bs4 import BeautifulSoupfrom PyQt5.QtWidgets import QApplication, QCheckBox, QPushButton, QHeaderViewfrom PyQt5.QtGui import QPixmapimport PyQt5.uicui_file = 'Demo5.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)        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 还可以加入浏览数、新增时间以及全选等功能,来完善整个体验。最后相信精明的老司机已经发现,既然获得链接,通过爬虫可以进一步获得链接后面的图片,然后通过筛选就可以将喜欢的图片下载到自己的硬盘里面了。

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_43680030/article/details/84106021
今日推荐