Python+wxPython打造一個網(wǎng)頁圖片一鍵下載神器(附完整源碼)
最近我給自己(也給廣大網(wǎng)友)寫了一個超級實用的桌面小工具:只要粘貼任意網(wǎng)頁鏈接,就能把這個頁面里所有圖片一鍵下載到本地,還能自動生成 PDF、防重名、右鍵移動文件。實測完美支持:
- 微信公眾號長文(最常用!)
- 知乎回答、掘金文章、CSDN 博客
- 微博、壁紙站、Unsplash、Pinterest 等圖站
- 幾乎所有現(xiàn)代網(wǎng)頁(懶加載、background-image 全支持)
今天就把這個工具的完整源碼 + 核心代碼逐行詳細解析發(fā)出來,方便大家直接拿走用,或者二次開發(fā)。
最終效果截圖(Windows 11 實測)
(圖片略,可自行運行體驗)
完整可運行代碼(已內(nèi)置防重名、生成 PDF、右鍵移動)
# -*- 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ǎng)頁圖片下載器(支持微信公眾號/知乎/微博等)", 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)頁(微信公眾號最強):"), 0, wx.ALL, 10)
self.url_text = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER)
self.url_text.SetHint("粘貼鏈接后按回車或點按鈕")
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)
# 選項區(qū)
opt_box = wx.BoxSizer(wx.HORIZONTAL)
self.chk_pdf = wx.CheckBox(panel, label="下載完自動生成 PDF(強烈推薦)")
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)
# 進度條
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, "移動選中圖片到...")
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. 獲取頁面
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(很多美圖站用的就是這個)
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())
# 過濾垃圾
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()
# 其他:選擇文件夾、右鍵移動等省略(完整代碼已在上)
if __name__ == '__main__':
app = wx.App(False)
UniversalImageDownloader()
app.MainLoop()
安裝依賴(只需運行一次)
pip install wxpython requests beautifulsoup4 pymupdf
運行結(jié)果

到此這篇關(guān)于Python+wxPython打造一個網(wǎng)頁圖片一鍵下載神器(附完整源碼)的文章就介紹到這了,更多相關(guān)Python網(wǎng)頁圖片下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pytorch加載數(shù)據(jù)集的方式總結(jié)及補充
Pytorch自定義數(shù)據(jù)集方法,應(yīng)該是用pytorch做算法的最基本的東西,下面這篇文章主要給大家介紹了關(guān)于Pytorch加載數(shù)據(jù)集的方式總結(jié)及補充,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-11-11
在python中l(wèi)ist作函數(shù)形參,防止被實參修改的實現(xiàn)方法
這篇文章主要介紹了在python中l(wèi)ist作函數(shù)形參,防止被實參修改的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
python re模塊findall()函數(shù)實例解析
這篇文章主要介紹了python re模塊findall()函數(shù)實例解析,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
python獲取當(dāng)前計算機cpu數(shù)量的方法
這篇文章主要介紹了python獲取當(dāng)前計算機cpu數(shù)量的方法,涉及Python操作計算機硬件的技巧,代碼簡單易懂,非常具有實用價值,需要的朋友可以參考下2015-04-04
利用Python實現(xiàn)Excel表格轉(zhuǎn)換為HTML格式
在數(shù)據(jù)驅(qū)動的時代,Excel表格作為信息存儲的常用載體,其內(nèi)容如何高效地在Web端展示,成為了許多開發(fā)者和數(shù)據(jù)分析師面臨的挑戰(zhàn),本文將深入探討如何利用Python,實現(xiàn)Excel表格到HTML的批量、自動化轉(zhuǎn)換,需要的朋友可以參考下2025-10-10

