logo

Paprasta kelių gijų atsisiuntimų tvarkyklė Python

A Atsisiuntimų tvarkyklė iš esmės yra kompiuterinė programa, skirta atsisiųsti atskirus failus iš interneto. Čia mes sukursime paprastą atsisiuntimų tvarkyklę naudodami Python gijas. Naudojant kelių gijų failą vienu metu galima atsisiųsti gabalais iš skirtingų gijų. Norėdami tai įgyvendinti, sukursime paprastą komandinės eilutės įrankį, kuris priima failo URL ir tada jį atsisiunčia.

Būtinos sąlygos: Windows mašina su įdiegta Python.



Sąranka

Atsisiųskite toliau nurodytus paketus iš komandinės eilutės.

1. „Click“ paketas: „Click“ yra „Python“ paketas, skirtas sukurti gražias komandų eilutės sąsajas su kuo mažiau kodo. Tai komandų eilutės sąsajos kūrimo rinkinys.

pip diegimo paspaudimas



2. Užklausų paketas: naudodami šį įrankį atsisiųsime failą pagal URL (HTTP adresus). Užklausos yra HTTP biblioteka, parašyta Python, leidžianti siųsti HTTP užklausas. Galite pridėti antraštes į kelių dalių duomenų failus ir parametrus naudodami paprastus Python žodynus ir pasiekti atsakymų duomenis tokiu pačiu būdu.

pip diegimo užklausos

3. Sriegimo paketas: Norėdami dirbti su siūlais, mums reikia sriegimo paketo.



pip install sriegimas

Įgyvendinimas

modifikuoti failą linux

Pastaba:

Programa buvo padalinta į dalis, kad būtų lengviau ją suprasti. Įsitikinkite, kad vykdydami programą nepraleidžiate jokios kodo dalies.

1 veiksmas: importuokite reikiamus paketus

Šiuose paketuose yra būtinų įrankių, kad žiniatinklio užklausos tvarkytų komandų eilutės įvestis ir sukurtų gijas.

Python
import click import requests import threading 

2 veiksmas: sukurkite tvarkyklės funkciją

Kiekviena gija vykdys šią funkciją, kad atsisiųstų tam tikrą failo dalį. Ši funkcija yra atsakinga už tik tam tikro baitų diapazono užklausą ir jų įrašymą į teisingą failo vietą.

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 veiksmas: spustelėdami nustatykite pagrindinę funkciją

Paverčia funkciją komandinės eilutės įrankiu. Tai apibrėžia, kaip vartotojai sąveikauja su scenarijumi iš komandinės eilutės.

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 veiksmas: nustatykite failo pavadinimą ir nustatykite failo dydį

Mums reikia failo dydžio, kad galėtume padalyti atsisiuntimą tarp gijų ir užtikrinti, kad serveris palaikytų įvairius atsisiuntimus.

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 veiksmas: iš anksto paskirkite failo erdvę

Išankstinis paskirstymas užtikrina, kad failas yra tinkamo dydžio prieš įrašant gabalus į konkrečius baitų diapazonus.

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

6 veiksmas: sukurkite gijas

Gijosi priskiriami konkretūs baitų diapazonai, kuriuos reikia atsisiųsti lygiagrečiai.

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 veiksmas: prisijunkite prie gijų

Užtikrina, kad visos gijos būtų užbaigtos prieš pasibaigiant programai.

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

Kodas:

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() 


Baigėme kodavimo dalį ir dabar vykdykite toliau pateiktas komandas, kad paleistumėte .py failą.

python filename.py –-help

Išvestis:

help_output' title=python failo pavadinimas.py – pagalba


Ši komanda rodo spustelėjimo komandų įrankio naudojimą ir parinktis, kurias įrankis gali priimti. Žemiau yra pavyzdinė komanda, kurioje bandome atsisiųsti jpg vaizdo failą iš URL, taip pat nurodėme pavadinimą ir gijų_skaičius.

Ekrano kopija-2025-04-07-155058' loading='lazy' title=komandos pavyzdys atsisiųsti jpg

Po to, kai viskas bus sėkmingai paleista, galėsite matyti savo failą (šiuo atveju flower.webp) savo aplankų kataloge, kaip parodyta toliau:

Ekrano kopija-2025-04-07-155750' loading='lazy' title=katalogas

Pagaliau mes sėkmingai su juo susidorojame ir tai yra vienas iš būdų sukurti paprastą daugiagiją atsisiuntimo tvarkyklę Python.