1. 程式人生 > >給Python3爬蟲做一個介面 妹子圖網實戰 3

給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

這裡寫圖片描述