給Python爬蟲(chóng)做一個(gè)界面.上

<p>做爬蟲(chóng)做了那么久阱飘,開(kāi)始逐漸不滿(mǎn)足寫(xiě)好程序摘昌,每次只能完成一件事情速妖。開(kāi)始思考如何可以做一個(gè)簡(jiǎn)單界面交互高蜂,再增加爬蟲(chóng)的可操作室聪黎,做交互界面有兩個(gè)思路:</p>

  • 用Django做一個(gè)web界面;
  • 用PyQt做一個(gè)exe程序界面备恤;

<p>事實(shí)上在我寫(xiě)這一篇文章的時(shí)候稿饰,已經(jīng)完成PyQt的demo,再開(kāi)始思考兩種方式的優(yōu)劣露泊。后來(lái)想通了喉镰,web界面可以無(wú)縫隙跨平臺(tái)跨系統(tǒng)進(jìn)行溝通,所以采用html語(yǔ)言的web界面會(huì)是以后的交互主體惭笑÷履罚可是這不妨礙我們先看一看Pyqt生真,這一篇文章先介紹怎么用PyQt來(lái)做exe界面。</p>

<p>這篇文章會(huì)偏向于Pyqt的介紹捺宗,爬蟲(chóng)之前已經(jīng)有比較多的文章介紹了柱蟀,在這里更多的是介紹怎么做Pyqt的界面,以及將我們的爬蟲(chóng)嵌入到界面內(nèi)蚜厉。</p>

先寫(xiě)個(gè)爬蟲(chóng)

<p>這一次我們來(lái)采集點(diǎn)喜聞樂(lè)見(jiàn)的內(nèi)容妹子圖长已,我們目標(biāo)是扒出首頁(yè)所有妹子圖的鏈接。這個(gè)網(wǎng)站的邏輯比較簡(jiǎn)單昼牛,直接首頁(yè)get之后术瓮,再通過(guò)BeautifulSoup的各種find就能扒到所有的鏈接。當(dāng)然贰健,如果比較貪心的胞四,可以在里面再加上翻頁(yè)器的功能,具體就是在鏈接后面加入/page/(page_number)就可以了伶椿,page_number是相應(yīng)的頁(yè)數(shù)撬讽,,</p>

<p>不帶翻頁(yè)器悬垃,寫(xiě)了一個(gè)專(zhuān)門(mén)爬妹子圖的類(lèi)游昼,附帶效果圖,輸出每個(gè)頁(yè)面鏈接的id以及titlte尝蠕,通過(guò)頁(yè)面id我們可以進(jìn)入到title對(duì)應(yīng)的頁(yè)面進(jìn)一步的做我們想做的嘿嘿嘿烘豌。</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 發(fā)布在%s 共瀏覽%s" % (titleword, uploadtime, viewcount)
            linksum[linkid] = title
        return linksum
嗯,效果圖

<p>在之前的Python爬蟲(chóng)項(xiàng)目中看彼,基本就是止于此廊佩,將所有鏈接爬出來(lái)后,再一個(gè)鏈接一個(gè)鏈接的進(jìn)入靖榕,做我們想做的事情标锄。但如果我現(xiàn)在和你說(shuō),我不要所有鏈接都進(jìn)入茁计,進(jìn)入哪些鏈接料皇,我要通過(guò)title或者瀏覽次數(shù),甚至是圖片判斷星压。那這個(gè)時(shí)候践剂,我們就要有一個(gè)交互頁(yè)面給我們的用戶(hù),這個(gè)界面給我們的用戶(hù)篩選他喜歡的鏈接進(jìn)行選擇性的下載娜膘。</p>


先舉個(gè)例子教你做界面

<p>簡(jiǎn)單介紹一下PyQt是個(gè)什么逊脯。PyQt就是Python語(yǔ)言的GUI編程解決方案之一。在PyQt5中竣贪,可通過(guò)自帶的Creator工具生成窗體文件军洼,并通過(guò)內(nèi)置函數(shù)uic轉(zhuǎn)化為Python代碼巩螃。</p>

<p>簡(jiǎn)單來(lái)說(shuō),你可以通過(guò)Qt Creator(PyQt4是叫做Qt Designer匕争,此處只以Qt Creator為例牺六,官網(wǎng)下載度盤(pán)下載)畫(huà)出你想要的任何界面汗捡,再使用內(nèi)置函數(shù)uic或者外部命令pyuic轉(zhuǎn)化為Python代碼淑际,然后將生成的Python代碼和你自身的程序關(guān)聯(lián)就可以。盜用老外的一張流程圖:</p>

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

<p>安裝是很簡(jiǎn)單的扇住,這個(gè)軟件本身是開(kāi)源的春缕,選擇非商業(yè)用途就可以一直使用,一路下一步安裝完畢艘蹋。完成后打開(kāi)界面锄贼,Ctrl+N新開(kāi)一個(gè)文檔之后,依次選擇Qt以及Qt Designer Form之后女阀,選好工作目錄宅荤,就可以進(jìn)入設(shè)計(jì)頁(yè)面。在設(shè)計(jì)頁(yè)面上將左側(cè)的元素浸策,拖拽到中間的設(shè)計(jì)頁(yè)面就擺放好即可冯键,做好后保存就能生成一個(gè).ui后綴名的文件:</p>

使用界面
新建一個(gè)頁(yè)面
設(shè)計(jì)頁(yè)面

<p>假如現(xiàn)在需要做一個(gè)加法器,實(shí)現(xiàn)兩個(gè)數(shù)字a和b的相加庸汗,數(shù)字a和b的通過(guò)數(shù)字輸入惫确。拖拽元素將這個(gè)界面完成,效果如下圖蚯舱。左邊有簡(jiǎn)單的加法輸入以及輸出顯示框改化,點(diǎn)擊下面計(jì)算按鈕開(kāi)始計(jì)算,右邊有一個(gè)輸出歷史計(jì)算的頁(yè)面枉昏。元素列表處可以看到各個(gè)拖拽元素的名稱(chēng)以及對(duì)應(yīng)的類(lèi)陈肛,所有的這些元素都在MainWindow以及centralwidget上面。</p>

<p>記住我們所設(shè)定的元素輸入textEdit兄裂、textEdit_2句旱、元素輸出textEdit_3、歷史記錄輸出textBrowser懦窘、以及計(jì)算按鈕pushButton所對(duì)應(yīng)的元素名稱(chēng)前翎。</p>

計(jì)算器頁(yè)面以及元素列表

<p>保存后稚配,會(huì)在工作目錄上出現(xiàn)一個(gè)以.ui后綴為名的文件畅涂,通過(guò)notepad++打開(kāi)了,可以發(fā)現(xiàn)內(nèi)部就是一個(gè)xml文件〉来ǎ現(xiàn)在需要將這個(gè)窗體文件轉(zhuǎn)化為python文檔午衰,PyQt給我們提供了兩個(gè)方式立宜,一個(gè)是通過(guò)外部命令pyuic5,一個(gè)是內(nèi)置函數(shù)uic臊岸。</p>

mainwindow.ui
外部命令pyuic5

<p>用外部命令pyuic5可以將.ui的文件轉(zhuǎn)化為.py的文件橙数,在.ui所在文件夾空白處按著shift鼠標(biāo)點(diǎn)右鍵,打開(kāi)控制命令行帅戒,輸入:</p>

pyuic5 -x mainwindow.ui -o mainwindow.py

<p>pyuic是一個(gè)轉(zhuǎn)化工具灯帮,通過(guò)查看pyuic.bat的代碼,知道其本質(zhì)是調(diào)用PyQt5.uic.pyuic逻住,點(diǎn)開(kāi)生成的mainwindow.py文件钟哥,點(diǎn)開(kāi)運(yùn)行一下,便可以看到界面瞎访。在上面輸入任何數(shù)字腻贰,但不能計(jì)算,沒(méi)有任何內(nèi)容顯示扒秸。我們需要對(duì)mainwindow.py進(jìn)行修改播演,將元素和函數(shù)關(guān)聯(lián):</p>

計(jì)算器界面

<p>在mainwindow.py里面,setupUI是用來(lái)生成整個(gè)界面的函數(shù)伴奥,里面包括對(duì)元素位置写烤、大小、字體拾徙、對(duì)象名稱(chēng)顶霞、對(duì)象間關(guān)系。retranslateUi應(yīng)該是對(duì)文字的轉(zhuǎn)化锣吼,具體要看QtCore.QCoreApplication.translate的說(shuō)明文檔选浑。最后的主體main函數(shù),是生成窗體對(duì)象玄叠、窗體顯示以及退出古徒,是pyuic5命令中的-x參數(shù)生成。</p>

<p>通過(guò)toPlainText引用textEdit以及textEdit_2的數(shù)字读恃,在addfunction內(nèi)完成加法運(yùn)算隧膘,最后將結(jié)果輸出到textEdit_3里面,并通過(guò)textBrowser.append來(lái)保存計(jì)算過(guò)程寺惫。計(jì)算界面如圖所示:</p>

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        ... ...  ##此處太長(zhǎng)省略了
        self.pushButton.clicked.connect(self.addfunction) ##用來(lái)將pushButton關(guān)聯(lián)加法的函數(shù)
        
    def addfunction(self):  ##用來(lái)實(shí)現(xiàn)加法的函數(shù)
        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", "加法計(jì)算器"))
        self.label_2.setText(_translate("MainWindow", "+"))
        self.label_3.setText(_translate("MainWindow", "="))
        self.pushButton.setText(_translate("MainWindow", "計(jì)算"))

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_())
計(jì)算界面
通過(guò)uic內(nèi)部轉(zhuǎn)化

<p>上面這種方法最好的地方在于疹吃,你可以通過(guò)更改代碼的方式對(duì)界面進(jìn)行更改。但事實(shí)上西雀,對(duì)于一個(gè)爬蟲(chóng)界面而言萨驶,需求復(fù)雜的還是比較少,并且不熟悉編程的人會(huì)更依賴(lài)在Qt Creator上做更改艇肴,那這樣每次都需要通過(guò)外部命令去更新界面程序文件就會(huì)顯得有點(diǎn)繁瑣腔呜∪拢可以考慮采用內(nèi)部命令uic,直接加載.ui文件進(jìn)行操作:</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該函數(shù)輸出兩個(gè)類(lèi)核畴,一個(gè)是form class膝但,一個(gè)是Qt base class。根據(jù)鏈接的說(shuō)明文件谤草,form class 僅僅是一個(gè)類(lèi)跟束,衍生自Python object type,Qt base class是一個(gè)ui的框架類(lèi)丑孩,這個(gè)框架就類(lèi)似于QDialog泳炉、QWidget以及QMainWindow。(但是這兩個(gè)類(lèi)的具體情況還是沒(méi)有弄清楚嚎杨,ui的基本特征是哪個(gè)class提供花鹅,通過(guò)super繼承是如何使這兩個(gè)類(lèi)運(yùn)行起來(lái)的,等等)枫浙。</p>

<p>后一個(gè)方法相對(duì)會(huì)更加方便刨肃,更改ui之后,不需要經(jīng)過(guò)外部命令就可以直接調(diào)用箩帚,適合前提調(diào)試真友;如果是ui已經(jīng)成熟了,用第一個(gè)方法的一致性會(huì)更好紧帕。</p>


小結(jié)

<p>通過(guò)這一篇文章盔然,我們已經(jīng)將所有的素材備齊了,下一篇文章是嗜,需要將這兩者結(jié)合起來(lái)愈案。我們要對(duì)爬下來(lái)的內(nèi)容做一個(gè)篩選界面,然后爬蟲(chóng)最終根據(jù)我們的篩選來(lái)輸出鏈接鹅搪。</p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末站绪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丽柿,更是在濱河造成了極大的恐慌恢准,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甫题,死亡現(xiàn)場(chǎng)離奇詭異馁筐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)坠非,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)敏沉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事赦抖〔湛ǎ” “怎么了辅肾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵队萤,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我矫钓,道長(zhǎng)要尔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任新娜,我火速辦了婚禮赵辕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘概龄。我一直安慰自己还惠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布私杜。 她就那樣靜靜地躺著蚕键,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衰粹。 梳的紋絲不亂的頭發(fā)上锣光,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音铝耻,去河邊找鬼誊爹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瓢捉,可吹牛的內(nèi)容都是我干的频丘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼泡态,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼椎镣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起兽赁,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤状答,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后刀崖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體惊科,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年亮钦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馆截。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜡娶,靈堂內(nèi)的尸體忽然破棺而出混卵,到底是詐尸還是另有隱情,我是刑警寧澤窖张,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布幕随,位于F島的核電站,受9級(jí)特大地震影響宿接,放射性物質(zhì)發(fā)生泄漏赘淮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一睦霎、第九天 我趴在偏房一處隱蔽的房頂上張望梢卸。 院中可真熱鬧,春花似錦副女、人聲如沸蛤高。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)戴陡。三九已至,卻和暖如春枕赵,著一層夾襖步出監(jiān)牢的瞬間猜欺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工拷窜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留开皿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓篮昧,卻偏偏與公主長(zhǎng)得像赋荆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子懊昨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,777評(píng)論 25 707
  • 我們的人生會(huì)和無(wú)數(shù)的人打交道窄潭,但是卻只會(huì)和少數(shù)的人長(zhǎng)久的保持熱度,我們大多數(shù)能夠長(zhǎng)久保持熱度的關(guān)系酵颁,是肯定需要一個(gè)...
    善行無(wú)痕閱讀 220評(píng)論 0 0
  • 運(yùn)行Shell腳本有兩種方法: 1嫉你、作為可執(zhí)行程序?qū)⑸厦娴拇a保存為test.sh,并cd到相應(yīng)目錄: 注意躏惋,一定...
    EnjoyWT閱讀 374評(píng)論 0 0
  • 文/家函 面對(duì)抉擇幽污,總想逃避。獨(dú)坐家中簿姨,亦難平靜距误。忽然想起常常散步的岸堤簸搞,一路風(fēng)景秀麗,不知如今是何景致准潭,便起身想...
    家函閱讀 610評(píng)論 0 1
  • 我上學(xué)晚刑然,所以17歲那年我還是初三寺擂。本以為我是萬(wàn)年鐵樹(shù)不開(kāi)花,結(jié)果17歲那年還是被人表白了闰集。 他不...
    蘭陵竹馬閱讀 225評(píng)論 0 2