1. 程式人生 > >給Python爬蟲做一個介面.上

給Python爬蟲做一個介面.上

<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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。