#!/usr/bin/env python3 # -*- coding: utf-8 -*- import tkinter as tk from tkinter import messagebox from tkinter.filedialog import askdirectory, askopenfilename import threading, time, re, os, requests, math from PIL import Image, ImageStat def thread_run(func): def wraper(*args, **kwargs): t = threading.Thread(target=func, args=args, kwargs=kwargs) t.daemon = True t.start() return wraper class ImageManager(): def __init__(self, file=None, io=None, im=None): self.mean = None self.im = None self.path = None if file: if not os.path.exists(file): raise Exception("文件不存在的!") self.path = file self.im = Image.open(file) if im: self.im = im def getMean(self): if not self.mean: self.mean = ImageStat.Stat(self.im.convert('L')).mean[0] return self.mean def resize(self, size=(1, 1)): return self.im.resize(size, Image.ANTIALIAS) # return self.im.resize(size) class BasicFrame(object): """Frame基类,实现grid方法""" def __init__(self, root=None, **args): super(BasicFrame, self).__init__() self.root = None if root: self.root = tk.Frame(root) if args and 'root' in args.keys: self.root = tk.Frame(args.root) if not self.root: raise Exception("no root") def grid(self, row='default', column='default', **args): if row == 'default' or column == 'default': if args: self.root.grid(**args) else: self.root.grid(row=row, column=column) class DownloadFrame(BasicFrame): """docstring for SearchFrame""" def __init__(self, root=None, **args): super(DownloadFrame, self).__init__(root=root, **args) self.entry = tk.StringVar() self.cnt = 0 self.num = tk.StringVar() self.num.set(300) self.name = 0 self.flag = False row = 0 tk.Label(self.root, text='----请输入要下载的免翻地址---').grid(row=row, column=1) row += 1 tk.Label(self.root,width=10, justify='right' ,text='地址').grid(row=row, column=0) tk.Entry(self.root, textvariable=self.entry, width=24).grid(row=row, column=1) tk.Button(self.root, width=9,text='下载图片', command=self.downloadnow).grid(row=row, column=2) row += 1 tk.Label(self.root, text='---代理功能更新中---').grid(row=row, column=1) @thread_run def downloadnow(self): _input = self.entry.get().replace(' ', '') if self.flag: messagebox.showinfo("警告", "尚有后台下载任务进行中") elif _input == '' : messagebox.showinfo("警告", "链接不能为空") else: self.entry.set('') self.prepare(_input) def prepare(self, downloadlinks): self.flag = True self.downloadlinks = downloadlinks self.base_url = self.downloadlinks fail = 0 try: url = self.base_url result = requests.get(url, timeout=10) result.encoding = 'gbk' # pic_url = re.findall('"objURL":"(.*?)",', result.text, re.S) pic_url = re.findall("data-src='(.*?)'", result.text, re.S) if pic_url: pic_url print(pic_url) else: pic_url = re.findall("ess-data='(.*?)'", result.text, re.S) print(pic_url) titles = re.findall('<h4>(.+)</h4>', result.text) print(titles) title = titles[0] print(title) path = "%s\\%s" % (os.path.abspath('.'), title) if not os.path.exists(path): os.mkdir(path) if len(pic_url) == 0: fail += 1 else: self.downloadPic(pic_url, path) except Exception as e: print(e) time.sleep(3) # print("图片下载完成") def downloadPic(self, urls, path): # 每过三秒检查一次当前正在运行的线程数,超标则沉睡等待线程结束 while threading.activeCount() > 5: print("线程超标---%s" % threading.activeCount()) time.sleep(3) for url in urls: if url: print(url) self.download(url, path) @thread_run def download(self, url, path): try: if lock.acquire(): self.name += 1 filename = "%s\\%s.%s" % (path, self.name, url.split('.')[-1]) lock.release() header = { "accept-ranges":"bytes", "age":"8585", "cache-control":"public, max-age=31536000", "cf-cache-status":"HIT", "content-length":"729911", "content-type":"image/jpeg", "server":"cloudflare", "status":"200", "vary":"Accept-Encoding"} print('start down load images') print(url) print(filename) # res = requests.get(url, headers=header ) res = requests.get(url ) with open(filename, 'wb') as f: f.write(res.content) # 下载完后检查是否完成下载 if lock.acquire(): if self.flag: self.flag = False messagebox.showinfo("提示", "下载完成") except Exception as e: print(e) if lock.acquire(): self.cnt -= 1 lock.release() if __name__ == '__main__': lock = threading.Lock() root = tk.Tk() root.title("社区图片下载器[社区定制] -- 正则兮") root.geometry('440x150+600+200') root.resizable(False, False) downloadnow = DownloadFrame(root) downloadnow.grid(0, 0) tk.Label(text="created BY 正则兮").grid(row=2, column=0) root.mainloop()