logo

Vienkāršs daudzpavedienu lejupielādes pārvaldnieks programmā Python

A Lejupielādes pārvaldnieks būtībā ir datorprogramma, kas paredzēta atsevišķu failu lejupielādei no interneta. Šeit mēs izveidosim vienkāršu lejupielādes pārvaldnieku, izmantojot Python pavedienus. Izmantojot vairākus pavedienus, failu var lejupielādēt gabalos vienlaikus no dažādiem pavedieniem. Lai to ieviestu, mēs izveidosim vienkāršu komandrindas rīku, kas pieņem faila URL un pēc tam to lejupielādē.

griešanas rīks ubuntu

Priekšnosacījumi: Windows mašīna ar instalētu Python.



Iestatīšana

Lejupielādējiet tālāk minētās pakotnes no komandu uzvednes.

1. Click pakotne: Click ir Python pakotne skaistu komandrindas saskarņu izveidei ar tik maz koda, cik nepieciešams. Tas ir komandrindas interfeisa izveides komplekts.

pip instalēšanas klikšķis



2. Pieprasījumu pakotne: šajā rīkā mēs lejupielādēsim failu, pamatojoties uz URL (HTTP adreses). Pieprasījumi ir Python rakstīta HTTP bibliotēka, kas ļauj nosūtīt HTTP pieprasījumus. Varat pievienot galvenes vairāku daļu datu failiem un parametriem, izmantojot vienkāršas Python vārdnīcas, un tādā pašā veidā piekļūt atbildes datiem.

pip instalēšanas pieprasījumi

3. Vītņu pakotne: Lai strādātu ar pavedieniem, mums ir nepieciešama vītņu pakotne.



pip instalēt vītņu

Īstenošana

Piezīme:

Programma ir sadalīta daļās, lai to būtu viegli saprast. Pārliecinieties, vai programmas palaišanas laikā netrūkst nevienas koda daļas.

1. darbība: importējiet nepieciešamās pakotnes

Šīs pakotnes nodrošina nepieciešamos rīkus, lai tīmekļa pieprasījumi apstrādātu komandrindas ievadi un izveidotu pavedienus.

Python
import click import requests import threading 

2. darbība. Izveidojiet apdarinātāja funkciju

Katrs pavediens izpildīs šo funkciju, lai lejupielādētu savu konkrēto faila daļu. Šī funkcija ir atbildīga par tikai noteikta baitu diapazona pieprasīšanu un ierakstīšanu pareizajā faila 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. darbība: definējiet galveno funkciju ar klikšķi

Pārvērš funkciju par komandrindas utilītu. Tas nosaka, kā lietotāji mijiedarbojas ar skriptu no komandrindas.

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. darbība: iestatiet faila nosaukumu un nosakiet faila lielumu

Mums ir nepieciešams faila lielums, lai sadalītu lejupielādi pa pavedieniem un nodrošinātu, ka serveris atbalsta diapazona lejupielādes.

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. darbība: iepriekš piešķiriet faila vietu

Iepriekšēja piešķiršana nodrošina, ka failam ir pareizais izmērs, pirms mēs ierakstām gabalus noteiktos baitu diapazonos.

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

6. darbība: izveidojiet pavedienus

Pavedieniem tiek piešķirti konkrēti baitu diapazoni, lai tos lejupielādētu paralēli.

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. darbība. Pievienojieties pavedieniem

Nodrošina visu pavedienu pabeigšanu pirms programmas pabeigšanas.

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

Kods:

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


Mēs esam pabeiguši ar kodēšanas daļu, un tagad izpildiet tālāk norādītās komandas, lai palaistu .py failu.

labākais auto pasaulē
python filename.py –-help

Izvade:

help_output' title=python faila nosaukums.py — palīdzība


Šī komanda parāda klikšķu komandu rīka lietojumu un opcijas, kuras rīks var pieņemt. Zemāk ir komandas paraugs, kurā mēs mēģinām lejupielādēt jpg attēla failu no URL, kā arī norādījām nosaukumu un pavedienu_skaits.

Ekrānuzņēmums-2025-04-07-155058' loading='lazy' title=komandas paraugs, lai lejupielādētu jpg

Pēc tam, kad viss būs veiksmīgs, jūs varēsiet redzēt savu failu (šajā gadījumā flower.webp) savā mapju direktorijā, kā parādīts tālāk:

Ekrānuzņēmums-2025-04-07-155750' loading='lazy' title=direktoriju

Beidzot tas ir veiksmīgi paveikts, un tas ir viens no veidiem, kā Python izveidot vienkāršu daudzpavedienu lejupielādes pārvaldnieku.