Python'da Basit Çok İş Parçalı İndirme Yöneticisi

Python'da Basit Çok İş Parçalı İndirme Yöneticisi

A İndirme Yöneticisi temel olarak internetten bağımsız dosyaları indirme görevine adanmış bir bilgisayar programıdır. Burada Python'daki thread'lerin yardımıyla basit bir İndirme Yöneticisi oluşturacağız. Çoklu iş parçacığı kullanılarak bir dosya, farklı iş parçacıklarından eş zamanlı olarak parçalar halinde indirilebilir. Bunu uygulamak için, dosyanın URL'sini kabul eden ve ardından onu indiren basit bir komut satırı aracı oluşturacağız.

Önkoşullar: Python'un yüklü olduğu Windows makinesi.

Kurmak

Aşağıda belirtilen paketleri komut isteminden indirin.



1. Click paketi: Click, gerektiği kadar az kodla güzel komut satırı arayüzleri oluşturmaya yönelik bir Python paketidir. Bu, Komut Satırı Arayüzü Oluşturma Kitidir.

pip kurulumu tıklayın

2. İstek paketi: Bu araçta URL'ye (HTTP adresleri) dayalı bir dosya indireceğiz. İstekler, Python'da yazılmış ve HTTP istekleri göndermenize olanak tanıyan bir HTTP Kitaplığıdır. Basit Python sözlükleriyle çok parçalı veri dosyalarına ve parametrelere başlıklar ekleyebilir ve yanıt verilerine aynı şekilde erişebilirsiniz.

pip yükleme istekleri

3. Threading paketi: Thread'lerle çalışmak için threading paketine ihtiyacımız var.

pip kurulum iş parçacığı

Uygulama

Not:

Anlaşılmasını kolaylaştırmak için program bölümlere ayrılmıştır. Programı çalıştırırken kodun herhangi bir bölümünü kaçırmadığınızdan emin olun.

Adım 1: Gerekli Paketleri İçe Aktarın

Bu paketler, web isteklerinin komut satırı girişlerini işlemesini ve iş parçacıkları oluşturmasını sağlamak için gerekli araçları sağlar.

Python
   import   click   import   requests   import   threading   

Adım 2: İşleyici İşlevini Oluşturun

Her iş parçacığı, dosyanın kendine ait bölümünü indirmek için bu işlevi yürütür. Bu işlev yalnızca belirli bir bayt aralığı istemekten ve bunları dosyadaki doğru konuma yazmaktan sorumludur.

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  )   

Adım 3: Tıklamayla Ana İşlevi Tanımlayın

İşlevi bir komut satırı yardımcı programına dönüştürür. Bu, kullanıcıların komut satırından komut dosyasıyla nasıl etkileşime gireceğini tanımlar.

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

Adım 4: Dosya Adını Ayarlayın ve Dosya Boyutunu Belirleyin

İndirmeyi iş parçacıkları arasında bölmek ve sunucunun aralıklı indirmeleri desteklediğinden emin olmak için dosya boyutuna ihtiyacımız var.

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   

Adım 5: Dosya Alanını Önceden Tahsis Edin

Önceden ayırma, parçaları belirli bayt aralıklarına yazmadan önce dosyanın doğru boyutta olmasını sağlar.

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

Adım 6: Konu Oluşturun

Konulara paralel olarak indirilmek üzere belirli bayt aralıkları atanır.

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

Adım 7: Konulara Katılın

Program bitmeden tüm iş parçacıklarının tamamlanmasını sağlar.

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

Kod:

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


Kodlama kısmını tamamladık ve şimdi .py dosyasını çalıştırmak için aşağıda gösterilen komutları takip ediyoruz.

 python filename.py –-help  

Çıkış:

help_outputpython dosyaadı.py –-help


Bu komut, tıklama komutu aracının Kullanımını ve aracın kabul edebileceği seçenekleri gösterir. Aşağıda bir URL'den bir jpg resim dosyası indirmeye çalıştığımız ve ayrıca bir ad ve iş parçacığı sayısı verdiğimiz örnek komut verilmiştir.

Ekran görüntüsü-2025-04-07-155058jpg indirmek için örnek komut

Her şeyi başarılı bir şekilde çalıştırdıktan sonra, dosyanızı (bu durumda Flower.webp) aşağıda gösterildiği gibi klasör dizininizde görebileceksiniz:

Ekran görüntüsü-2025-04-07-155750dizin

Sonunda bunu başarıyla tamamladık ve bu, Python'da basit, çok iş parçacıklı bir indirme yöneticisi oluşturmanın yollarından biridir.


En Makaleler

Kategori

Ilginç Haberler