logo

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.

dizeyi int java olarak yayınla

pip yükleme istekleri

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



dizede Java int

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.

adına
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:

java dizeyi int'ye aktardı
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_output' title=python 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-155058' loading='lazy' title=jpg 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-155750' loading='lazy' title=dizin

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.