Jednostavan višenitni upravitelj preuzimanja u Pythonu

Jednostavan višenitni upravitelj preuzimanja u Pythonu

A Upravitelj preuzimanja je u osnovi računalni program posvećen zadatku preuzimanja samostalnih datoteka s interneta. Ovdje ćemo stvoriti jednostavan Download Manager uz pomoć niti u Pythonu. Korištenjem višenitnosti datoteka se može preuzeti u obliku dijelova istovremeno iz različitih niti. Da bismo to implementirali, izradit ćemo jednostavan alat naredbenog retka koji prihvaća URL datoteke i zatim je preuzima.

Preduvjeti: Windows stroj s instaliranim Pythonom.

Postavljanje

Preuzmite dolje navedene pakete iz naredbenog retka.

1. Click paket: Click je Python paket za stvaranje prekrasnih sučelja naredbenog retka sa što manje koda koliko je potrebno. To je Command Line Interface Creation Kit.

pip instalirati klik

2. Paket zahtjeva: u ovom alatu ćemo preuzeti datoteku na temelju URL-a (HTTP adrese). Zahtjevi su HTTP biblioteka napisana u Pythonu koja vam omogućuje slanje HTTP zahtjeva. Možete dodati zaglavlja iz višedijelnih datoteka podataka i parametara s jednostavnim Python rječnicima i pristupiti podacima odgovora na isti način.

pip instalacijski zahtjevi

3. Threading paket: Za rad s nitima potreban nam je Threading paket.

pip instalacija niti

Provedba

Bilješka:

Program je podijeljen u dijelove radi lakšeg razumijevanja. Provjerite da vam ne nedostaje nijedan dio koda tijekom pokretanja programa.

Korak 1: Uvezite potrebne pakete

Ovi paketi pružaju potrebne alate kako bi web zahtjevi mogli rukovati unosima naredbenog retka i stvarati niti.

Python
   import   click   import   requests   import   threading   

Korak 2: Stvorite funkciju rukovatelja

Svaka nit će izvršiti ovu funkciju za preuzimanje svog specifičnog dijela datoteke. Ova je funkcija odgovorna za traženje samo određenog raspona bajtova i njihovo zapisivanje na ispravnu poziciju u datoteci.

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  )   

Korak 3: Definirajte glavnu funkciju klikom

Pretvara funkciju u uslužni program naredbenog retka. Ovo definira kako korisnici komuniciraju sa skriptom iz naredbenog retka.

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

Korak 4: Postavite naziv datoteke i odredite veličinu datoteke

Potrebna nam je veličina datoteke kako bismo podijelili preuzimanje među nitima i osigurali da poslužitelj podržava različita preuzimanja.

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   

Korak 5: Prethodno dodijelite prostor za datoteke

Prethodno dodjeljivanje osigurava da je datoteka ispravne veličine prije nego što zapišemo dijelove u određene raspone bajtova.

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

Korak 6: Stvorite niti

Niti se dodjeljuju određeni rasponi bajtova za paralelno preuzimanje.

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

Korak 7: Pridružite se nitima

Osigurava da su sve niti dovršene prije završetka programa.

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

Kodirati:

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


Završili smo s dijelom kodiranja i sada slijedite naredbe prikazane u nastavku za pokretanje .py datoteke.

 python filename.py –-help  

Izlaz:

pomoć_izlazpython naziv datoteke.py –-pomoć


Ova naredba prikazuje upotrebu alata za naredbu klika i opcije koje alat može prihvatiti. Ispod je primjer naredbe gdje pokušavamo preuzeti jpg slikovnu datoteku s URL-a i također dajemo naziv i broj_niti.

Snimka zaslona-2025-04-07-155058primjer naredbe za preuzimanje jpg

Nakon što sve uspješno pokrenete, moći ćete vidjeti svoju datoteku (flower.webp u ovom slučaju) u direktoriju svoje mape kao što je prikazano u nastavku:

Snimka zaslona-2025-04-07-155750imenik

Napokon smo uspješno završili s tim i ovo je jedan od načina za izgradnju jednostavnog višenitnog upravitelja preuzimanja u Pythonu.


Možda Će Vam Se Svidjeti