Enkel flertrådad nedladdningshanterare i Python

Enkel flertrådad nedladdningshanterare i Python

A Download Manager är i grunden ett datorprogram dedikerat till uppgiften att ladda ner fristående filer från internet. Här ska vi skapa en enkel nedladdningshanterare med hjälp av trådar i Python. Genom att använda multi-threading kan en fil laddas ner i form av bitar samtidigt från olika trådar. För att implementera detta kommer vi att skapa ett enkelt kommandoradsverktyg som accepterar webbadressen till filen och sedan laddar ner den.

Förutsättningar: Windows-maskin med Python installerad.

Inställning

Ladda ner nedanstående paket från kommandotolken.

1. Click package: Click är ett Python-paket för att skapa vackra kommandoradsgränssnitt med så lite kod som behövs. Det är Command Line Interface Creation Kit.

pip installera klicka

2. Requests-paket: I det här verktyget ska vi ladda ner en fil baserad på URL:en (HTTP-adresser). Requests är ett HTTP-bibliotek skrivet i Python som låter dig skicka HTTP-förfrågningar. Du kan lägga till rubriker från flerdelade datafiler och parametrar med enkla Python-ordböcker och få tillgång till svarsdata på samma sätt.

pip-installationsförfrågningar

3. Träningspaket: För att arbeta med trådar behöver vi gängpaket.

pip installera gänga

Genomförande

Notera:

Programmet har delats upp i delar för att göra det lätt att förstå. Se till att du inte saknar någon del av koden när du kör programmet.

Steg 1: Importera nödvändiga paket

Dessa paket tillhandahåller de nödvändiga verktygen för att få webbförfrågningar att hantera kommandoradsinmatningar och skapa trådar.

Python
   import   click   import   requests   import   threading   

Steg 2: Skapa hanterarfunktionen

Varje tråd kommer att köra den här funktionen för att ladda ner sin specifika del av filen. Denna funktion är ansvarig för att endast begära ett specifikt intervall av byte och skriva dem till rätt position i filen.

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  )   

Steg 3: Definiera huvudfunktionen med klick

Förvandlar funktionen till ett kommandoradsverktyg. Detta definierar hur användare interagerar med skriptet från kommandoraden.

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

Steg 4: Ställ in filnamn och bestäm filstorlek

Vi behöver filstorleken för att dela upp nedladdningen mellan trådar och försäkra oss om att servern stöder nedladdningar med intervall.

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   

Steg 5: Förallokera filutrymme

Förallokering säkerställer att filen har rätt storlek innan vi skriver bitar till specifika byteintervall.

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

Steg 6: Skapa trådar

Trådar tilldelas specifika byteintervall att ladda ner parallellt.

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

Steg 7: Gå med i trådar

Säkerställer att alla trådar är klara innan programmet avslutas.

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

Koda:

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


Vi är klara med kodningsdelen och följer nu kommandona som visas nedan för att köra .py-filen.

 python filename.py –-help  

Produktion:

help_outputpython filnamn.py –-hjälp


Detta kommando visar användningen av klickkommandoverktyget och alternativ som verktyget kan acceptera. Nedan är exempelkommandot där vi försöker ladda ner en jpg-bildfil från en URL och även gav ett namn och antal_trådar.

Skärmdump-2025-04-07-155058exempelkommando för att ladda ner en jpg

Efter att allt har körts framgångsrikt kommer du att kunna se din fil ( flower.webp i det här fallet ) i din mappkatalog som visas nedan:

Skärmdump-2025-04-07-155750katalog

Äntligen är vi framgångsrika klara med det och detta är ett sätt att bygga en enkel flertrådad nedladdningshanterare i Python.