<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>
<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>
<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>
<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>
外部命令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>
<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_())
通過(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>