logo

Прост многонишков мениджър за изтегляне в Python

А Мениджър за изтегляне е основно компютърна програма, посветена на задачата за изтегляне на самостоятелни файлове от интернет. Тук ще създадем прост мениджър за изтегляне с помощта на нишки в Python. При използване на многонишков файл може да бъде изтеглен под формата на парчета едновременно от различни нишки. За да реализираме това, ще създадем прост инструмент за команден ред, който приема URL адреса на файла и след това го изтегля.

Необходими условия: Windows машина с инсталиран Python.



Настройка

Изтеглете посочените по-долу пакети от командния ред.

конвертиране на низ в json обект

1. Click package: Click е пакет на Python за създаване на красиви интерфейси на командния ред с възможно най-малко код. Това е комплектът за създаване на интерфейс на командния ред.

pip инсталирайте щракване



2. Пакет заявки: В този инструмент ще изтеглим файл въз основа на URL (HTTP адреси). Requests е HTTP библиотека, написана на Python, която ви позволява да изпращате HTTP заявки. Можете да добавяте заглавки към файлове с много части на данни и параметри с прости речници на Python и да осъществявате достъп до данните за отговор по същия начин.

заявки за инсталиране на pip

3. Пакет Threading: За да работим с нишки, се нуждаем от пакет Threading.



pip инсталирате нишки

Внедряване

Забележка:

123 филм

Програмата е разделена на части, за да бъде лесна за разбиране. Уверете се, че не пропускате нито една част от кода, докато изпълнявате програмата.

Стъпка 1: Импортирайте необходимите пакети

Тези пакети предоставят необходимите инструменти, за да накарате уеб заявките да обработват входове от командния ред и да създават нишки.

филтриращ питон
Python
import click import requests import threading 

Стъпка 2: Създайте функцията за обработка

Всяка нишка ще изпълни тази функция, за да изтегли своята конкретна част от файла. Тази функция е отговорна за изискването само на определен диапазон от байтове и записването им на правилната позиция във файла.

Python
def Handler(start end url filename): headers = {'Range': f'bytes={start}-{end}'} r = requests.get(url headers=headers stream=True) with open(filename 'r+b') as fp: fp.seek(start) fp.write(r.content) 

Стъпка 3: Дефинирайте основната функция с щракване

Превръща функцията в помощна програма от командния ред. Това определя как потребителите взаимодействат със скрипта от командния ред.

Python
#Note: This code will not work on online IDE @click.command(help='Downloads the specified file with given name using multi-threading') @click.option('--number_of_threads' default=4 help='Number of threads to use') @click.option('--name' type=click.Path() help='Name to save the file as (with extension)') @click.argument('url_of_file' type=str) def download_file(url_of_file name number_of_threads): 

Стъпка 4: Задайте име на файл и определете размера на файла

Имаме нужда от размера на файла, за да разделим изтеглянето между нишките и да гарантираме, че сървърът поддържа изтегляния в диапазон.

Python
 r = requests.head(url_of_file) file_name = name if name else url_of_file.split('/')[-1] try: file_size = int(r.headers['Content-Length']) except: print('Invalid URL or missing Content-Length header.') return 

Стъпка 5: Предварително разпределете файлово пространство

Предварителното разпределяне гарантира, че файлът е с правилния размер, преди да запишем парчета в конкретни диапазони от байтове.

Python
 part = file_size // number_of_threads with open(file_name 'wb') as fp: fp.write(b'' * file_size) 

Стъпка 6: Създаване на нишки

На нишките се присвояват специфични диапазони от байтове за паралелно изтегляне.

Python
 threads = [] for i in range(number_of_threads): start = part * i end = file_size - 1 if i == number_of_threads - 1 else (start + part - 1) t = threading.Thread(target=Handler kwargs={ 'start': start 'end': end 'url': url_of_file 'filename': file_name }) threads.append(t) t.start() 

Стъпка 7: Присъединете се към теми

Гарантира, че всички нишки са завършени, преди програмата да приключи.

Python
 for t in threads: t.join() print(f'{file_name} downloaded successfully!') if __name__ == '__main__': download_file() 

Код:

случай на превключване на java
Python
import click import requests import threading def Handler(start end url filename): headers = {'Range': f'bytes={start}-{end}'} r = requests.get(url headers=headers stream=True) with open(filename 'r+b') as fp: fp.seek(start) fp.write(r.content) @click.command(help='Downloads the specified file with given name using multi-threading') @click.option('--number_of_threads' default=4 help='Number of threads to use') @click.option('--name' type=click.Path() help='Name to save the file as (with extension)') @click.argument('url_of_file' type=str) def download_file(url_of_file name number_of_threads): r = requests.head(url_of_file) if name: file_name = name else: file_name = url_of_file.split('/')[-1] try: file_size = int(r.headers['Content-Length']) except: print('Invalid URL or missing Content-Length header.') return part = file_size // number_of_threads with open(file_name 'wb') as fp: fp.write(b'' * file_size) threads = [] for i in range(number_of_threads): start = part * i # Make sure the last part downloads till the end of file end = file_size - 1 if i == number_of_threads - 1 else (start + part - 1) t = threading.Thread(target=Handler kwargs={ 'start': start 'end': end 'url': url_of_file 'filename': file_name }) threads.append(t) t.start() for t in threads: t.join() print(f'{file_name} downloaded successfully!') if __name__ == '__main__': download_file() 


Приключихме с кодиращата част и сега следвайте командите, показани по-долу, за да стартирате .py файла.

python filename.py –-help

Изход:

помощ_изход' title=python filename.py –-помощ


Тази команда показва използването на инструмента за команда за щракване и опциите, които инструментът може да приеме. По-долу е примерната команда, при която се опитваме да изтеглим jpg файл с изображение от URL адрес и също даваме име и number_of_threads.

Екранна снимка-2025-04-07-155058' loading='lazy' title=примерна команда за изтегляне на jpg

След като завършите всичко успешно, ще можете да видите вашия файл (flower.webp в този случай) в директорията на вашата папка, както е показано по-долу:

Екранна снимка-2025-04-07-155750' loading='lazy' title=указател

Най-накрая приключихме успешно с него и това е един от начините за изграждане на прост многонишков мениджър за изтегляне в Python.