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

来源:https://www.cnblogs.com/zedd/archive/2019/11/29/11953833.html
-Advertisement-
Play Games

由於這個是畢業設計的內容,而且還是跨專業的。爬蟲程式肯定是很簡單的,就是調用Yahoo的API進行爬取圖片。這篇博客主要講的是基礎的界面設計。 放上源碼,然後分部解析一下重要的地方。註:flickrapi需要翻牆 代碼複製的時候可能掉幾個字母或者符號,不建議複製代碼,如需複製請自行檢查是否有拼寫錯誤 ...


  由於這個是畢業設計的內容,而且還是跨專業的。爬蟲程式肯定是很簡單的,就是調用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會更加方便快捷,本人當時沒有時間學這個了,其實本人更推薦使用它,因為這樣更加高效。

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 // 截取兩個字元串之間的子字元串,返回第一個 2 function subStringOne(text, begin, end) { 3 var regex; 4 if (end == '\\n') 5 regex = RegExp(begin + '(.+)?'); 6 else 7 reg ...
  • 基於博主也是個菜鳥,親身體驗後步驟如下: 首先,我們需要安裝node.js, https://www.runoob.com/nodejs/nodejs-install-setup.html 安裝完成後,打開命定行直接輸入node -v 就可以查看到當前安裝的node 版本了 接下來我們需要下載exp ...
  • 引入: //計算兩個數字的和 function f1(x, y) { return x + y; } //計算三個數字的和 function f2(x, y, z) { return x + y + z; } //計算四個數字的和 function f3(x, y, z, k) { return x ...
  • 前言 本篇文章預設您大概瞭解什麼是TypeScript,主要講解如何在React舊項目中安裝並使用TypeScript。 寫這個的目的主要是網上關於TypeScript這塊的講解雖然很多,但都是一些語法概念或者簡單例子,真正改造一個React舊項目使用TypeScript的文章很少。 所以在這裡記錄 ...
  • 單例模式是老生常談的一種設計模式,同時它是最簡單也是最容易被忽視的一種設計模式。單例類應該是密封類,不能被繼承,同時建議在任何情況下都要保證線程安全。 ...
  • 5. 分散式事務解決方案之可靠消息最終一致性 5.1. 什麼是可靠消息最終一致性事務 可靠消息最終一致性方案是指當事務發起執行完全本地事務後併發出一條消息,事務參與方(消息消費者)一定能夠接收消息並處理事務成功,此方案強調的是只要消息發給事務參與方最終事務要達到一致。此方案是利用消息中間件完成,如下 ...
  • 從程式員到架構師的進階過程,就像是用時間精力澆灌培植一棵樹,讓小樹苗逐漸長成參天大樹,先有主幹,後有枝葉,待到枝繁葉茂就能開花結果了,也就是說等到架構師所需技能全都儲備好了,那我們就有信心勝任新崗位工作了。 ...
  • 本文主要學習如何在Windows環境中下載並安裝Tomcat伺服器。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...