python 表情包下載器,輕鬆下載上萬個表情包、鬥圖不用愁

来源:https://www.cnblogs.com/lwsbc/archive/2022/03/28/16068760.html
-Advertisement-
Play Games

首先將源碼逐級找出來1.HashSet<String> hs=new HashSet<String>(); hs.add("hello"); hs.add("world"); hs.add("java"); hs.add("world");//因為是Set集合所以不帶重覆元素因為調用的是HashSe ...


file

【閱讀全文】

每次和朋友聊天苦於沒有表情包,而別人的表情包似乎是取之不盡、用之不竭。作為一個程式員哪能甘願認輸,於是做了一個表情包下載器供大家鬥圖。

首先,還是介紹一下設計思路吧,和我們之前做的百度圖片下載器2.0一樣,使用pyqt5作為UI界面製作的框架,然後就是找一個表情包網站供我們可以下載很多的表情包。

表情包使用的網站是下麵這個,大家也可以使用自己發現的表情包網站做下載。

https://www.fabiaoqing.com/biaoqing/

話不多說,我們先說明一下使用到的python庫有哪些。

UI界面使用到的pyqt5模塊是下麵這幾個,之前也是一直使用這幾個庫做UI界面開發的。

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
import os

下麵是在下載(也可以說是爬蟲)表情包時使用到的python應用庫。

import requests
import re
from urllib.request import urlretrieve
from fake_useragent import UserAgent

將使用到的標準或非標準庫準備好,先來編寫UI界面,下麵就開始我們的表演了。

class Emoji(QWidget):
    def __init__(self):
        super(Emoji, self).__init__()
        self.init_ui()

    def init_ui(self):
        '''
        初始化UI界面佈局
        :return:
        '''
        self.setWindowTitle('表情包下載器   公眾號:[Python 集中營]')
        self.setWindowIcon(QIcon('表情包圖標.png'))
        self.setFixedSize(500, 300)

        grid = QGridLayout()

        self.page_size = QLabel()
        self.page_size.setText('預設每頁數量:')

        self.page_size_text = QLineEdit()
        self.page_size_text.setText('45')
        self.page_size_text.setReadOnly(True)

        self.page_num = QLabel()
        self.page_num.setText('設置下載頁數:')

        self.page_num_text = QLineEdit()
        self.page_num_text.setPlaceholderText('請輸入整數 1~200')
        self.page_num_text.setValidator(QIntValidator(1, 200))

        self.save_dir = QLineEdit()
        self.save_dir.setReadOnly(True)
        self.save_dir.setPlaceholderText('圖片存儲路徑')

        self.save_dir_btn = QPushButton()
        self.save_dir_btn.setText('設置存儲路徑')
        self.save_dir_btn.clicked.connect(self.save_dir_btn_click)

        self.brower = QTextBrowser()
        self.brower.setPlaceholderText('下載進度結果展示區域...')

        self.start_btn = QPushButton()
        self.start_btn.setText('開始下載表情包')
        self.start_btn.clicked.connect(self.start_btn_click)

        grid.addWidget(self.page_size, 0, 0, 1, 1)
        grid.addWidget(self.page_size_text, 0, 1, 1, 1)
        grid.addWidget(self.page_num, 1, 0, 1, 1)
        grid.addWidget(self.page_num_text, 1, 1, 1, 1)
        grid.addWidget(self.save_dir, 2, 0, 1, 1)
        grid.addWidget(self.save_dir_btn, 2, 1, 1, 1)
        grid.addWidget(self.brower, 3, 0, 1, 2)
        grid.addWidget(self.start_btn, 4, 0, 1, 2)

        self.thread_ = DownloadThread(self)
        self.thread_.finished.connect(self.finished)
        self.thread_.log.connect(self.set_log)

        self.setLayout(grid)

    def save_dir_btn_click(self):
        '''
        設置存儲文件路徑
        :return:
        '''
        dir = QFileDialog.getExistingDirectory(self, "選擇文件夾", os.getcwd())
        self.save_dir.setText(dir)

    def start_btn_click(self):
        '''
        啟動子線程下載表情包
        :return:
        '''
        self.start_btn.setEnabled(False)
        self.thread_.start()
        self.set_log('下載線程已經啟動...')

    def set_log(self, text):
        '''
        更新文本瀏覽器內日誌信息
        :param text:
        :return:
        '''
        cursor = self.brower.textCursor()
        cursor.movePosition(QTextCursor.End)
        self.brower.append(text)
        self.brower.setTextCursor(cursor)
        self.brower.ensureCursorVisible()

    def finished(self, finished):
        if finished is True:
            self.start_btn.setEnabled(True)

編寫完UI界面以後開始編寫用於下載表情包的子線程吧,子線程編寫需要繼承pyqt5中的QThread線程來編寫。

class DownloadThread(QThread):
    finished = pyqtSignal(bool)
    log = pyqtSignal(str)

    def __init__(self, parent=None):
        super(DownloadThread, self).__init__(parent)
        self.parent = parent
        self.working = True

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):
        self.download()

    def download(self):
        user_agent = UserAgent()
        page_num = int(self.parent.page_num_text.text())
        save_dir = self.parent.save_dir.text()
        for n in range(1, page_num):
            url = 'https://www.fabiaoqing.com/biaoqing/lists/page/{}.html'.format(n)
            headers = {
                'user-agent': user_agent.random
            }
            response = requests.get(url, headers=headers)
            repx = re.compile('data-original="(.*?)" title="(.*?)"', re.I)
            texts = repx.findall(response.text)
            for text in texts:
                emoji_url = text[0].split('" src="')[0]
                emoji_name = emoji_url.split('/')[-1]
                urlretrieve(emoji_url,
                            save_dir + '/' + emoji_name)
                self.log.emit(emoji_name + ' 下載完成!')
        self.log.emit('子線程下載完成!')
        self.finished.emit(True)

最後,使用main函數將頁面佈局加入到應用的主體迴圈當中,啟動整個應用就大功告成了。

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Emoji()
    main.show()
    sys.exit(app.exec_())

將上面的所有的代碼塊copy到開發工具(我用的是Pycharm)中直接啟動就成了。歡迎大佬到評論區指點~

file

【往期精彩】

Python 自動清理電腦垃圾文件,一鍵啟動即可...

有了jmespath,處理python中的json數據就變成了一種享受...

解鎖一個新技能,如何在Python代碼中使用表情包...

萬能的list列表,python中的堆棧、隊列實現全靠它!

該怎麼用pyqt5來實現數據的增、刪、改、查功能...

介紹一個文本語音神器,幾行代碼就能搞定!

python批量自動整理文件

初學者福利:分享五個免費的 Python 學習網站,抓緊收藏吧!

有趣的控制台玩法:一行代碼繪製控制台圖像!

數據處理小工具:Excel 批量數據文件拆分/整合器...

辦公自動化:PDF文件合併器,將多個PDF文件進行合併...

GUI猜數字游戲,直接開玩...

歡迎關註作者公眾號【Python 集中營】,專註於後端編程,每天更新技術乾貨,不定時分享各類資料!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 華為 AppLinking 服務,是一項支持通過跨平臺使用的深度鏈接,可以支持通過鏈接拉起指定頁面,並且傳遞 DeepLink 數據。更加重要的是,AppLinking 支持在應用未安裝的情況下,自動拉起應用市場的應用詳情頁,可以很好的覆蓋應用未安裝的情況。 本帖主要介紹在 Android 項目中, ...
  • 在移動端閱讀資訊時,人們對高解析度、高質量的圖像要求越來越高。但受限於網路流量、存儲、圖片源等諸多因素,用戶無法便捷獲得高質量圖片。移動端顯示設備的高解析度圖片獲得問題亟待解決。不久前,HMS Core新聞Demo App針對新聞垂域的閱讀體驗做了一系列更新優化,其中就包括圖像超分。 圖像超解析度( ...
  • 3月15日新增“1860+1194”,全國進入了抗疫關鍵時期。響應政策多地採取了社會面清零策略。 3月14日零點,深圳按下了暫停鍵。 應疫情防控要求,深圳全市暫停生產經營活動,嚴格實行7天封閉式管理。消息一經發佈,3.13日當晚,全深圳打工人連夜回公司取電腦。衝上了熱搜。“上班帶棉被,下班帶電腦”深 ...
  • 一、什麼是對象? 對象指一個具體的事物,泛指的不算對象,對像是一組無序的相關屬性和方法的集合;屬性是特征常用名詞來表示,方法是行為常用動詞來表示。 二、為什麼需要對象? 當我們保存一個值時,可以使用變數,保存多個值時,可以使用數組;當我們需要保存很多完整、複雜的信息時,我們就會需要對象。 三、創建對 ...
  • 定義和用法 forEach() 調用數組的每個元素,並將元素傳遞給回調函數。 註意: forEach() 對於空數組是不會執行回調函數的。 用法: array.forEach(function(currentValue, index, arr), thisValue) 1==> currentVal ...
  • FizzBu​​zz 是一道很有意思的題目。我們來看看題目: 如果遇見了 3 的倍數要說 Fizz,5 的倍數就說 Buzz,如果即是 3 的倍數又是 5 的倍數就說 FizzBuzz。 如果是在一些編程語言中,這是一道比較初級的題目,當然,稍微轉換一下,我們就可以把它轉換成一道有關 CSS 選擇器 ...
  • 總有那麼一些時候,我們希望Spring容器能夠根據我們提供的條件決定哪些Bean需要創建,哪些Bean不需要創建。提供的條件不同,Spring容器創建的Bean也不同。創建的Bean不同,軟體實現的功能自然也有所差別。也就是說,我們希望在某些應用場景下無需修改代碼或重新構建項目,只需簡單修改一下條件 ...
  • 本文所解決的問題場景是這樣的:如果給定一個字典,比如一般從json文件或者npz文件中載入出來的數據都是字典的數據結構,如果我們希望把這個字典賦值給一個類,且使得字典的key和value分別作為類的成員變數名和成員變數值,那麼該如何實現呢?對於一個展平的字典而言(沒有嵌套字典),我們直接使用upda... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...