<p>做爬蟲做了那么久,開始逐漸不滿足寫好程序,每次只能完成一件事情。開始思考如何可以做一個簡單界面交互,再增加爬蟲的可操作室,做交互界面有兩個思路:</p>
- 用Django做一個web界面;
- 用PyQt做一個exe程序界面;
<p>事實上在我寫這一篇文章的時候,已經完成PyQt的demo,再開始思考兩種方式的優(yōu)劣。后來想通了,web界面可以無縫隙跨平臺跨系統(tǒng)進行溝通,所以采用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 發(fā)布在%s 共瀏覽%s" % (titleword, uploadtime, viewcount)
linksum[linkid] = title
return linksum

<p>在之前的Python爬蟲項目中,基本就是止于此,將所有鏈接爬出來后,再一個鏈接一個鏈接的進入,做我們想做的事情。但如果我現(xiàn)在和你說,我不要所有鏈接都進入,進入哪些鏈接,我要通過title或者瀏覽次數,甚至是圖片判斷。那這個時候,我們就要有一個交互頁面給我們的用戶,這個界面給我們的用戶篩選他喜歡的鏈接進行選擇性的下載。</p>
先舉個例子教你做界面
<p>簡單介紹一下PyQt是個什么。PyQt就是Python語言的GUI編程解決方案之一。在PyQt5中,可通過自帶的Creator工具生成窗體文件,并通過內置函數uic轉化為Python代碼。</p>
<p>簡單來說,你可以通過Qt Creator(PyQt4是叫做Qt Designer,此處只以Qt Creator為例,官網下載,度盤下載)畫出你想要的任何界面,再使用內置函數uic或者外部命令pyuic轉化為Python代碼,然后將生成的Python代碼和你自身的程序關聯(lián)就可以。盜用老外的一張流程圖:</p>

<p>安裝是很簡單的,這個軟件本身是開源的,選擇非商業(yè)用途就可以一直使用,一路下一步安裝完畢。完成后打開界面,Ctrl+N新開一個文檔之后,依次選擇Qt以及Qt Designer Form之后,選好工作目錄,就可以進入設計頁面。在設計頁面上將左側的元素,拖拽到中間的設計頁面就擺放好即可,做好后保存就能生成一個.ui后綴名的文件:</p>



<p>假如現(xiàn)在需要做一個加法器,實現(xiàn)兩個數字a和b的相加,數字a和b的通過數字輸入。拖拽元素將這個界面完成,效果如下圖。左邊有簡單的加法輸入以及輸出顯示框,點擊下面計算按鈕開始計算,右邊有一個輸出歷史計算的頁面。元素列表處可以看到各個拖拽元素的名稱以及對應的類,所有的這些元素都在MainWindow以及centralwidget上面。</p>
<p>記住我們所設定的元素輸入textEdit、textEdit_2、元素輸出textEdit_3、歷史記錄輸出textBrowser、以及計算按鈕pushButton所對應的元素名稱。</p>

<p>保存后,會在工作目錄上出現(xiàn)一個以.ui后綴為名的文件,通過notepad++打開了,可以發(fā)現(xiàn)內部就是一個xml文件?,F(xiàn)在需要將這個窗體文件轉化為python文檔,PyQt給我們提供了兩個方式,一個是通過外部命令pyuic5,一個是內置函數uic。</p>

外部命令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進行修改,將元素和函數關聯(lián):</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關聯(lián)加法的函數
def addfunction(self): ##用來實現(xiàn)加法的函數
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>