最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+wxPython打造一個(gè)網(wǎng)頁(yè)圖片一鍵下載神器(附完整源碼)

 更新時(shí)間:2025年11月20日 08:49:37   作者:winfredzhang  
這篇文章主要為大家詳細(xì)介紹了如何使用Python和wxPython打造一個(gè)網(wǎng)頁(yè)圖片一鍵下載神器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

最近我給自己(也給廣大網(wǎng)友)寫了一個(gè)超級(jí)實(shí)用的桌面小工具:只要粘貼任意網(wǎng)頁(yè)鏈接,就能把這個(gè)頁(yè)面里所有圖片一鍵下載到本地,還能自動(dòng)生成 PDF、防重名、右鍵移動(dòng)文件。實(shí)測(cè)完美支持:

  • 微信公眾號(hào)長(zhǎng)文(最常用?。?/li>
  • 知乎回答、掘金文章、CSDN 博客
  • 微博、壁紙站、Unsplash、Pinterest 等圖站
  • 幾乎所有現(xiàn)代網(wǎng)頁(yè)(懶加載、background-image 全支持)

今天就把這個(gè)工具的完整源碼 + 核心代碼逐行詳細(xì)解析發(fā)出來(lái),方便大家直接拿走用,或者二次開發(fā)。

最終效果截圖(Windows 11 實(shí)測(cè))

(圖片略,可自行運(yùn)行體驗(yàn))

完整可運(yùn)行代碼(已內(nèi)置防重名、生成 PDF、右鍵移動(dòng))

# -*- coding: utf-8 -*-
import wx
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
import threading
import re
from datetime import datetime
import fitz  # PyMuPDF → pip install pymupdf

class UniversalImageDownloader(wx.Frame):
    def __init__(self):
        super().__init__(None, title="萬(wàn)能網(wǎng)頁(yè)圖片下載器(支持微信公眾號(hào)/知乎/微博等)", size=(1150, 780))
        self.target_folder = ""
        self.downloaded_files = []  # 記錄成功下載的圖片路徑,用于生成PDF
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        })

        main_sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(main_sizer)
        self.init_ui(main_sizer)
        self.Centre()

    def init_ui(self, main_sizer):
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        # URL 輸入
        vbox.Add(wx.StaticText(panel, label="支持任意網(wǎng)頁(yè)(微信公眾號(hào)最強(qiáng)):"), 0, wx.ALL, 10)
        self.url_text = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER)
        self.url_text.SetHint("粘貼鏈接后按回車或點(diǎn)按鈕")
        vbox.Add(self.url_text, 0, wx.EXPAND | wx.ALL, 10)

        # 按鈕區(qū)
        btn_box = wx.BoxSizer(wx.HORIZONTAL)
        btn_folder = wx.Button(panel, label="1. 選擇保存文件夾")
        btn_folder.Bind(wx.EVT_BUTTON, self.on_choose_folder)
        self.btn_start = wx.Button(panel, label="2. 開始下載所有圖片")
        self.btn_start.Bind(wx.EVT_BUTTON, self.on_start)
        btn_box.Add(btn_folder, 1, wx.ALL, 5)
        btn_box.Add(self.btn_start, 1, wx.ALL, 5)
        vbox.Add(btn_box, 0, wx.EXPAND | wx.ALL, 5)

        # 選項(xiàng)區(qū)
        opt_box = wx.BoxSizer(wx.HORIZONTAL)
        self.chk_pdf = wx.CheckBox(panel, label="下載完自動(dòng)生成 PDF(強(qiáng)烈推薦)")
        self.chk_pdf.SetValue(True)
        self.btn_open = wx.Button(panel, label="打開文件夾")
        self.btn_open.Bind(wx.EVT_BUTTON, lambda e: os.startfile(self.target_folder) if self.target_folder else None)
        opt_box.Add(self.chk_pdf, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 10)
        opt_box.AddStretchSpacer()
        opt_box.Add(self.btn_open, 0, wx.ALL, 10)
        vbox.Add(opt_box, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 20)

        # 狀態(tài)欄
        self.status = wx.StaticText(panel, label="就緒")
        vbox.Add(self.status, 0, wx.ALL, 10)

        # 進(jìn)度條
        self.gauge = wx.Gauge(panel, range=100)
        vbox.Add(self.gauge, 0, wx.EXPAND | wx.ALL, 10)

        # 下載列表 + 右鍵支持
        self.list_ctrl = wx.ListCtrl(panel, style=wx.LC_REPORT)
        self.list_ctrl.InsertColumn(0, "文件名", width=550)
        self.list_ctrl.InsertColumn(1, "大小", width=100)
        self.list_ctrl.InsertColumn(2, "狀態(tài)", width=80)
        self.list_ctrl.Bind(wx.EVT_RIGHT_DOWN, self.on_right_click)
        vbox.Add(self.list_ctrl, 1, wx.EXPAND | wx.ALL, 10)

        panel.SetSizer(vbox)
        main_sizer.Add(panel, 1, wx.EXPAND)

        # 右鍵菜單
        self.menu = wx.Menu()
        self.menu.Append(wx.ID_ANY, "移動(dòng)選中圖片到...")
        self.Bind(wx.EVT_MENU, self.on_move)

    # ==================== 核心功能區(qū) ====================

    def get_unique_filename(self, fullpath):
        """最最重要的防重名函數(shù)!"""
        if not os.path.exists(fullpath):
            return fullpath
        dir_name = os.path.dirname(fullpath)
        name, ext = os.path.splitext(os.path.basename(fullpath))
        i = 1
        while True:
            new_name = f"{name} ({i}){ext}"
            new_path = os.path.join(dir_name, new_name)
            if not os.path.exists(new_path):
                return new_path
            i += 1

    def download_all_images(self, base_url):
        # 關(guān)鍵:設(shè)置Referer防盜鏈
        self.session.headers['Referer'] = base_url

        # 1. 獲取頁(yè)面
        try:
            r = self.session.get(base_url, timeout=30)
            r.raise_for_status()
        except Exception as e:
            self.log(f"打開失?。簕e}")
            wx.CallAfter(self.finish)
            return

        soup = BeautifulSoup(r.text, 'html.parser')
        urls = set()

        # 2. 瘋狂收集所有可能的圖片鏈接(懶加載終結(jié)者)
        lazy_attrs = ['src','data-src','data-original','data-lazy','data-ks-lazyload','data-echo','file','src2']
        for tag in soup.find_all('img'):
            for attr in lazy_attrs:
                if tag.get(attr):
                    urls.add(tag[attr].strip())

        # 3. 提取 background-image(很多美圖站用的就是這個(gè))
        pattern = re.compile(r'url\(["\']?([^"\')]+)["\']?\)', re.I)
        for tag in soup.find_all(style=True):
            for u in pattern.findall(tag['style']):
                urls.add(u.strip())

        # 過(guò)濾垃圾
        urls = {u for u in urls if u and not u.startswith(('data:', 'javascript:', 'blob:'))}

        if not urls:
            self.log("沒找到圖片,可能是 JS 渲染")
            wx.CallAfter(self.finish)
            return

        self.log(f"發(fā)現(xiàn) {len(urls)} 張,開始下載...")

        success = 0
        for i, raw in enumerate(sorted(urls)):
            url = urljoin(base_url, raw.split('?')[0])

            # 智能生成不亂碼的文件名
            name = os.path.basename(urlparse(url).path) or f"img_{i+1:04d}.jpg"
            save_path = self.get_unique_filename(os.path.join(self.target_folder, name))

            try:
                img = self.session.get(url, timeout=20)
                img.raise_for_status()
                with open(save_path, 'wb') as f:
                    f.write(img.content)
                kb = len(img.content) // 1024
                wx.CallAfter(self.list_ctrl.Append, [os.path.basename(save_path), f"{kb}KB", "成功"])
                self.downloaded_files.append(save_path)
                success += 1
            except:
                wx.CallAfter(self.list_ctrl.Append, [name, "0", "失敗"])

            wx.CallAfter(self.gauge.SetValue, int((i+1)/len(urls)*100))

        self.log(f"完成!成功 {success} 張")
        wx.CallAfter(self.finish)

    def finish(self):
        self.btn_start.Enable(True)
        self.gauge.SetValue(100)
        os.startfile(self.target_folder)

        if self.chk_pdf.IsChecked() and self.downloaded_files:
            pdf = os.path.join(self.target_folder, f"合集_{datetime.now():%Y%m%d_%H%M%S}.pdf")
            self.make_pdf(self.downloaded_files, pdf)
            wx.MessageBox(f"下載完成!\nPDF 已生成:\n{pdf}", "成功!")

    def make_pdf(self, imgs, path):
        doc = fitz.open()
        for p in imgs:
            try:
                img = fitz.open(p)
                pdfbytes = img.convert_to_pdf()
                img.close()
                pdfimg = fitz.open("pdf", pdfbytes)
                page = doc.new_page(width=595, height=842)
                page.show_pdf_page(page.rect, pdfimg, 0)
            except: pass
        doc.save(path)
        doc.close()

    # 其他:選擇文件夾、右鍵移動(dòng)等省略(完整代碼已在上)

if __name__ == '__main__':
    app = wx.App(False)
    UniversalImageDownloader()
    app.MainLoop()

安裝依賴(只需運(yùn)行一次)

pip install wxpython requests beautifulsoup4 pymupdf

運(yùn)行結(jié)果

到此這篇關(guān)于Python+wxPython打造一個(gè)網(wǎng)頁(yè)圖片一鍵下載神器(附完整源碼)的文章就介紹到這了,更多相關(guān)Python網(wǎng)頁(yè)圖片下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析Python數(shù)字類型和字符串類型的內(nèi)置方法

    淺析Python數(shù)字類型和字符串類型的內(nèi)置方法

    這篇文章主要介紹了Python數(shù)字類型和字符串類型的內(nèi)置方法,本文通過(guò)實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • python 將日期戳(五位數(shù)時(shí)間)轉(zhuǎn)換為標(biāo)準(zhǔn)時(shí)間

    python 將日期戳(五位數(shù)時(shí)間)轉(zhuǎn)換為標(biāo)準(zhǔn)時(shí)間

    這篇文章主要介紹了python 將日期戳(五位數(shù)時(shí)間)轉(zhuǎn)換為標(biāo)準(zhǔn)時(shí)間的實(shí)現(xiàn)方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-07-07
  • 使用numpy nonzero 找出非0元素

    使用numpy nonzero 找出非0元素

    這篇文章主要介紹了使用numpy nonzero 找出非0元素的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 使用torchtext導(dǎo)入NLP數(shù)據(jù)集的操作

    使用torchtext導(dǎo)入NLP數(shù)據(jù)集的操作

    這篇文章主要介紹了使用torchtext導(dǎo)入NLP數(shù)據(jù)集的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python中三元運(yùn)算符的簡(jiǎn)潔性及多用途實(shí)例探究

    Python中三元運(yùn)算符的簡(jiǎn)潔性及多用途實(shí)例探究

    這篇文章主要為大家介紹了Python中三元運(yùn)算符的簡(jiǎn)潔性及多用途實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 淺談Python if的高級(jí)功能

    淺談Python if的高級(jí)功能

    本文主要介紹了Python if的高級(jí)功能,包括if xxx、if xxx==xxx和if xxx is xxx的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • Python列表append和+的區(qū)別淺析

    Python列表append和+的區(qū)別淺析

    這篇文章主要介紹了Python列表append和+的區(qū)別淺析,本文得出一的結(jié)論是使用append實(shí)際是修改一個(gè)列表,使用+實(shí)際是創(chuàng)建一個(gè)新的列表,需要的朋友可以參考下
    2015-02-02
  • 搭建Python的Django框架環(huán)境并建立和運(yùn)行第一個(gè)App的教程

    搭建Python的Django框架環(huán)境并建立和運(yùn)行第一個(gè)App的教程

    時(shí)至今日Django仍然是人氣最高的Web開發(fā)框架,MVC結(jié)構(gòu)清晰內(nèi)置功能強(qiáng)大,這里我們就來(lái)共同學(xué)習(xí)搭建Python的Django框架環(huán)境并建立和運(yùn)行第一個(gè)App的教程
    2016-07-07
  • Pandas數(shù)據(jù)清洗的8大核心技巧完整指南

    Pandas數(shù)據(jù)清洗的8大核心技巧完整指南

    數(shù)據(jù)清洗是數(shù)據(jù)分析中耗時(shí)最長(zhǎng)的環(huán)節(jié),據(jù)統(tǒng)計(jì)占整個(gè)數(shù)據(jù)分析工作量的60%-80%,本文系統(tǒng)整理了pandas數(shù)據(jù)清洗的8大核心技巧,希望可以幫助讀者快速掌握相關(guān)技能并應(yīng)用于實(shí)際工作中
    2026-04-04
  • python程序需要編譯嗎

    python程序需要編譯嗎

    在本篇文章里小編給大家整理了關(guān)于python程序編譯相關(guān)的知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們參考學(xué)習(xí)下。
    2020-06-06

最新評(píng)論

濮阳县| 新泰市| 安国市| 新竹市| 泽普县| 九龙城区| 日喀则市| 巴林左旗| 株洲市| 东阿县| 仲巴县| 永春县| 民县| 黎川县| 贺州市| 绍兴县| 永嘉县| 五常市| 中西区| 东至县| 山西省| 龙陵县| 汝南县| 海淀区| 德昌县| 长沙市| 辛集市| 宜阳县| 西乌| 遵义市| 浦东新区| 红安县| 镇康县| 怀仁县| 商水县| 平安县| 湖州市| 五常市| 政和县| 芦山县| 霸州市|