|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
萌新 各种查写了一个批量下载文件的
但是目前有几个问题,
一 线程数量超过200之后 ,下载就会各种失败,下的文件是0KB
已经添加了锁 但是还是不好使。
二 创建的目录有问题,不能自动按下载地址创建,
比如目前的目录这样创建
需要创建6290\webres\anim\player 6290\webres\anim\monster这样的
3 程序假死 点击开始下载的时候 ,程序无响应 实际还在下的的
4 json保存的是下载地址,
如何选择josn后 对每行数据前面加上下载地址头,
import json
import os
import requests
import threading
import tkinter as tk
from tkinter import filedialog
# 定义下载函数
def download_file(download_url, directory, lock):
# 获取下载文件的文件名
filename = os.path.basename(download_url)
print('正在下载文件:', filename)
# 创建目录
os.makedirs(directory, exist_ok=True)
# 下载文件
response = requests.get(download_url)
with open(os.path.join(directory, filename), 'wb') as f:
f.write(response.content)
# 定义选择文件函数
def choose_file():
file_path = filedialog.askopenfilename()
file_path_var.set(file_path)
# 读取本地json文件
with open(file_path, 'r') as f:
data = json.load(f)
# 打印下载地址数量
print('下载地址数量:', len(data))
# 定义下载函数
def download(max_threads):
# 读取本地json文件
with open(file_path_var.get(), 'r') as f:
data = json.load(f)
# 创建线程池
threads = []
# 创建锁对象
lock = threading.Lock()
# 遍历下载地址并下载文件
count = 0
for download_url in data:
# 获取下载文件的目录
directory = os.path.dirname(download_url)
# 去除非法字符
directory = directory.replace(':', '').replace('/', '')
# 创建线程并启动
t = threading.Thread(target=download_file, args=(download_url, directory, lock))
t.start()
threads.append(t)
# 添加延迟
count += 1
if count >= max_threads:
# 等待所有线程结束
for t in threads:
t.join()
# 清空线程池和计数器
threads = []
count = 0
# 等待剩余线程结束
for t in threads:
t.join()
# 创建窗口
window = tk.Tk()
window.title('批量下载')
window.geometry('400x250')
# 创建选择文件按钮
file_path_var = tk.StringVar()
file_path_label = tk.Label(window, textvariable=file_path_var)
file_path_label.pack()
choose_file_button = tk.Button(window, text='选择文件', command=choose_file)
choose_file_button.pack()
# 创建线程数量标签和文本框
thread_label = tk.Label(window, text='线程数量:')
thread_label.pack()
thread_entry = tk.Entry(window)
thread_entry.pack()
# 创建下载按钮
download_button = tk.Button(window, text='下载', command=lambda: download(int(thread_entry.get())))
download_button.pack()
# 运行窗口
window.mainloop()
你可以通过添加一个新的标签和文本框来实现这个功能。首先,你需要在窗口中添加一个新的标签和文本框。然后,你可以在下载函数中获取文本框中的值,并将其添加到下载地址的前面。
下面是如何修改代码来实现这个功能:
# 定义下载函数
def download(max_threads):
# 获取输入框中的地址
base_url = url_entry.get()
# 读取本地json文件
with open(file_path_var.get(), 'r') as f:
data = json.load(f)
# 创建锁对象
lock = threading.Lock()
# 创建线程池
with ThreadPoolExecutor(max_workers=max_threads) as executor:
# 遍历下载地址并下载文件
for download_url in data:
# 在下载地址前面添加输入框中的地址
download_url = base_url + download_url
# 获取下载文件的目录
directory = os.path.join(BASE_DIR, *download_url.split('/')[1:-1])
# 提交任务到线程池
executor.submit(download_file, download_url, directory, lock)
# 创建窗口
window = tk.Tk()
window.title('批量下载')
window.geometry('400x250')
# 创建选择文件按钮
file_path_var = tk.StringVar()
file_path_label = tk.Label(window, textvariable=file_path_var)
file_path_label.pack()
choose_file_button = tk.Button(window, text='选择文件', command=choose_file)
choose_file_button.pack()
# 创建线程数量标签和文本框
thread_label = tk.Label(window, text='线程数量:')
thread_label.pack()
thread_entry = tk.Entry(window)
thread_entry.pack()
# 创建下载地址标签和文本框
url_label = tk.Label(window, text='下载地址:')
url_label.pack()
url_entry = tk.Entry(window)
url_entry.pack()
# 创建下载按钮
download_button = tk.Button(window, text='下载', command=lambda: threading.Thread(target=download, args=(int(thread_entry.get()),)).start())
download_button.pack()
# 运行窗口
window.mainloop()
这样,你就可以在新的文本框中输入下载地址,点击“下载”按钮时,程序会获取文本框中的地址,并将其添加到下载地址的前面。
|
|