簡單的爬蟲程序以及使用PYQT進行界面設計(包含源碼解析)


  由於這個是畢業設計的內容,而且還是跨專業的。爬蟲程序肯定是很簡單的,就是調用Yahoo的API進行爬取圖片。這篇博客主要講的是基礎的界面設計。

放上源碼,然后分部解析一下重要的地方。注:flickrapi需要翻牆

  代碼復制的時候可能掉幾個字母或者符號,不建議復制代碼,如需復制請自行檢查是否有拼寫錯誤

  可以使用pip install  來安裝flickrapi和pyqt5pyqt5-tools

  總體界面如圖所示:

  下面是源碼:

import sys
import os
from PyQt5.QtWidgets import QWidget, 
QPushButton,QGroupBox,
QApplication,QLabel,QLineEdit,QToolTip, QMessageBox,QFileDialog,QTextEdit,QProgressBar,QVBoxLayout
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import QFont
from PyQt5.QtGui import QPixmap    
import time
import flickrapi
import urllib.request             #導入相應的模塊
stop=0                        #設置一個全局變量用於停止程序
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()     
    def initUI(self):                             #設計界面
        self.setGeometry(300, 200, 580, 400)        #設置窗體尺寸
        self.setWindowTitle('DeepLearn Lab')       #命名窗體的標題
        
        QToolTip.setFont(QFont('SansSerif', 10))    #設置控件提示信息的字體格式及大小
        self.btn = QPushButton('開始', self)         #設計開始按鈕
        self.btn.setToolTip('單擊開始來下載圖片')   #設置按鈕的提示信息
        self.btn.clicked.connect(self.doAction)       #建立信號和槽的聯系,將單擊信號與下面的doacion進行鏈接
        self.pbar = QProgressBar(self)              #設計一個進度條
        self.textEdit=QTextEdit(self)                   #設計一個文本輸出框
        self.textEdit.setPlaceholderText("幫助文檔:\n1.輸入搜索圖片的關鍵字\n2.選擇圖片儲存路徑,如不選擇默認使用程序所在路徑\n3.單擊開始進行下載")
        self.textEdit.resize(400,200)                   #設置文本輸出框大小
        self.btn3 = QPushButton('停止', self)           #設計停止按鈕
        self.btn3.setToolTip('單擊來結束下載圖片')
        self.btn3.clicked.connect(self.stopxz)          #建立信號和槽的聯系,將單擊信號與下面的stopxz進行鏈接
        self.lineEdit = QLineEdit(self)                 #設計輸入框
        self.lineEdit.setPlaceholderText("輸入搜索關鍵字")
        self.lineEdit.setToolTip('請輸入需要搜索的圖片的關鍵字,請用英文輸入')
        self.lineEdit2 = QLineEdit(self)
        self.btn2 = QPushButton('選擇保存路徑', self)   #設計保存下載路徑的按鈕
        self.btn2.setToolTip('請輸入儲存圖片的磁盤地址')
        self.btn2.clicked.connect(self.filepath)        #建立信號和槽的聯系,將單擊信號與下面的filepath進行鏈接
        self.groupBox = QGroupBox(self)                 #設置QT容器
        self.groupBox.move(450, 105)                    #移動容器的位置
        self.groupBox.resize(120,280)                   #設置容器的尺寸
        self.groupBox.setTitle('菜單欄')                #設置容器的標題
        self.groupBox.setAlignment(4)                   #4為ALignHCenter為居中的意思
        layout = QVBoxLayout()                          #新建一個垂直布局
        layout.addWidget(self.lineEdit)                 #往該布局中添加各種控件
        layout.addWidget(self.btn2)
        layout.addWidget(self.btn)
        layout.addWidget(self.btn3)
        self.groupBox.setLayout(layout)                 #顯示該布局
        self.groupBox2 = QGroupBox(self)                #設置QT容器2
        self.groupBox2.move(10, 10)
        self.groupBox2.resize(420,300)
        self.groupBox2.setTitle('程序運行信息反饋')
        self.groupBox2.setAlignment(4)                  #4為ALignHCenter為居中的意思
        layout2 = QVBoxLayout()
        layout2.addWidget(self.textEdit)
        self.groupBox2.setLayout(layout2)
        self.groupBox3 = QGroupBox(self)                 #設置QT容器3
        self.groupBox3.move(310, 330)
        self.groupBox3.resize(120,55)
        self.groupBox3.setTitle('已下載圖片數量')
        layout3 = QVBoxLayout()
        layout3.addWidget(self.lineEdit2)
        self.groupBox3.setLayout(layout3)
        self.groupBox4 = QGroupBox(self)                 #設置QT容器4
        self.groupBox4.move(10, 330)
        self.groupBox4.resize(280,55)
        self.groupBox4.setTitle('進度條顯示')
        layout4 = QVBoxLayout()
        layout4.addWidget(self.pbar)
        self.groupBox4.setLayout(layout4)
        self.groupBox5 = QGroupBox(self)                #設置QT容器5
        self.groupBox5.setStyleSheet("border:none")     #隱藏容器的邊框
        self.groupBox5.move(442, 8)
        self.groupBox5.resize(136,95)
        self.lbl = QLabel (self)                        #新建一個控件來顯示圖片
        layout5 = QVBoxLayout()
        pixmap = QPixmap (r"C:\Users\Administrator\Desktop\svchost.exe\logo2.jpg")  # 按指定路徑找到圖片
        self.lbl.setPixmap (pixmap)  # 在label上顯示圖片  
        self.lbl.setScaledContents (True)  # 讓圖片自適應label大小
        layout5.addWidget(self.lbl)
        self.groupBox5.setLayout(layout5)
        self.show()                                     #顯示主窗口
    def filepath(self):                                 #用於修改下載路徑的函數
        self.textEdit.append('當前儲存路徑為 '+str(os.getcwd()))   
        file_path=QFileDialog.getExistingDirectory(self)
        os.chdir(file_path)
        self.textEdit.append('修改后的儲存路徑為 '+str(os.getcwd()))
    def doAction(self):                                 #主函數,用於下載圖片
        QMessageBox.question(self, '提示',
            "單擊yes下載圖片,下載過程請耐心等待", QMessageBox.Yes, QMessageBox.Yes) #最后一個QMessageBox.No的意思是默認為no
        shuru=self.lineEdit.text()                      #獲取輸入的內容
        api_key='c5dd68f9ba0895eb6fba771e963784f9'      #在Yahoo上申請的API賬戶和密碼
        api_secret='d11363e44eb2b2e0'
        flickr=flickrapi.FlickrAPI(api_key,api_secret,cache=True)  #生成flickr對象
        count=1                                         #初始化一個計數器
        try:
            #爬取text為'cross the road'的照片,這里可以根據自己的需要設置其它的參數
            photos=flickr.walk(text=str(shuru),extras='url_c',tag_mode='all',tags='street')#使用walk方法獲得圖片的url
        except Exception as e:
            print('Error')
        for photo in photos:           
            url=photo.get('url_c')
            self.textEdit.append('當前訪問的URL為: '+str(url))
            if count>0:
                if str(url)!='None':
                    response=urllib.request.urlopen(url)   #獲得數據
                    cat_jpg=response.read(url)
                    with open ('photo'+str(count)+'.jpg','wb') as f:  #下載圖片
                        f.write(cat_jpg)
            QString='已下載'+str(count)                 #顯示已下載數量
            jishu=count/2
            self.pbar.setValue(jishu)
            count=count+1
            self.lineEdit2.setText(QString)
            QApplication.processEvents()                #刷新窗口防止卡死
            if stop==1:
                break 
        self.textEdit.append('停止下載 ')
    def stopxz(self):                                   #當停止按鈕按下時改變全局變量值來間接停止爬取圖片
        global stop
        stop=1
    def closeEvent(self, event):                        #重寫關閉事件
        reply = QMessageBox.question(self, '提示',      #設計一個提示框
            "確定要退出搜索程序嗎?", QMessageBox.Yes |
               QMessageBox.No, QMessageBox.No)          #最后一個QMessageBox.No的意思是默認為no
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore() 
if __name__ == '__main__':
   
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

  首先是爬蟲部分,由於是利用了flickrapi,所以只需要按規則使用就可以了。

  具體分析如下

 

 

     api_key='c5dd68f9ba0895eb6fba771e963784f9'      #在Yahoo上申請的API賬戶和密碼
        api_secret='d11363e44eb2b2e0'
        flickr=flickrapi.FlickrAPI(api_key,api_secret,cache=True)  #生成flickr對象
        count=1                                         #初始化一個計數器
        try:
            #爬取text為'cross the road'的照片,這里可以根據自己的需要設置其它的參數
            photos=flickr.walk(text=str(shuru),extras='url_c',tag_mode='all',tags='street')#使用walk方法獲得圖片的url
        except Exception as e:
            print('Error')
        for photo in photos:                 #遍歷所有的url         
            url=photo.get('url_c')if count>0:
                if str(url)!='None':           #url 有兩種形式,一種為正確的url 一種為none,防止因為none而導致訪問錯誤這里直接排除none
                    response=urllib.request.urlopen(url)   #獲得數據
                    cat_jpg=response.read(url)
                    with open ('photo'+str(count)+'.jpg','wb') as f:  #下載圖片
                        f.write(cat_jpg)
            QString='已下載'+str(count)                 #顯示已下載數量
            count=count+1                  #累加,使得文件名字不重復

 

  

首先創建一個窗體。

把該導入的都導入進去

import sys
from PyQt5.QtWidgets import QWidget, 
QPushButton,QGroupBox,
QApplication,QLabel,QLineEdit,QToolTip, QMessageBox,QFileDialog,QTextEdit,QProgressBar,QVBoxLayout
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import QFont
from PyQt5.QtGui import QPixmap    

class Example(QWidget):
    def __init__(self):                #沒記錯的話是構造器,與之相對應的是析構器(c++中的稱呼)
        super().__init__()
        self.initUI()     
    def initUI(self):                             #設計界面
        self.setGeometry(300, 200, 580, 400)        #設置窗體尺寸
        self.setWindowTitle('DeepLearn Lab')       #命名窗體的標題
   def closeEvent(self, event):                        #重寫關閉事件
        reply = QMessageBox.question(self, '提示',      #設計一個提示框
            "確定要退出搜索程序嗎?", QMessageBox.Yes |
               QMessageBox.No, QMessageBox.No)          #最后一個QMessageBox.No的意思是默認為no
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore() 
if __name__ == '__main__':
   
    app = QApplication(sys.argv)       #這三個是必不可少的部分
    ex = Example()
    sys.exit(app.exec_())

這樣就創建了一個空白的窗口,點擊×會出來提示,因為把closeevent這個函數重寫了。

 

---------------------------------然后創建控件並鏈接相關的函數

---------------------------------舉一個例子,該例子用於更改圖片下載的路徑

     self.btn2 = QPushButton('選擇保存路徑', self)   #設計保存下載路徑的按鈕
        self.btn2.setToolTip('請輸入儲存圖片的磁盤地址')
        self.btn2.clicked.connect(self.filepath)        #建立信號和槽的聯系,將單擊信號與下面的filepath進行鏈接
def filepath(self):                                 #用於修改下載路徑的函數
        file_path=QFileDialog.getExistingDirectory(self)   #獲取選擇的路徑
        os.chdir(file_path)                    #更改當前的工作路徑

 

接下來創建一個容器把控件放進去(不放也可以,這僅僅只是為了好看)

-------------------------例子:

     self.groupBox = QGroupBox(self)                 #設置QT容器
        self.groupBox.move(450, 105)                    #移動容器的位置
        self.groupBox.resize(120,280)                   #設置容器的尺寸
        self.groupBox.setTitle('菜單欄')                #設置容器的標題
        self.groupBox.setAlignment(4)    #4為ALignHCenter為居中的意思(僅僅對上述的“菜單欄”有效) 
                        這里的參數可以給0-4還是1-4我忘記了,不同的數字對應不同的對齊方式,可以挨個試試

layout = QVBoxLayout() #新建一個垂直布局 layout.addWidget(self.lineEdit) #往該布局中添加各種控件 layout.addWidget(self.btn2) layout.addWidget(self.btn) layout.addWidget(self.btn3) self.groupBox.setLayout(layout) #顯示該布局 一定要有這一步,不然容器不顯示

剩下的就是一些控件的基本用法,可以參考代碼,里面寫的自認比較清楚簡單。

用到的功能就下面這幾個功能,使用方法和上述一樣,就不一一贅述了。

from PyQt5.QtWidgets import QWidget, 
QPushButton,QGroupBox,
QApplication,QLabel,QLineEdit,QToolTip, QMessageBox,QFileDialog,QTextEdit,QProgressBar,QVBoxLayout
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtGui import QFont
from PyQt5.QtGui import QPixmap 

其實用QT Designer會更加方便快捷,本人當時沒有時間學這個了,其實本人更推薦使用它,因為這樣更加高效。

有什么問題可以評論留言,看見了會第一時間回復。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM