Paprasta kelių gijų atsisiuntimų tvarkyklė Python

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

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_outputpython 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-155058komandos 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-155750katalogas

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