logo

מנהל הורדות מרובה-הליכים פשוט ב-Python

א מנהל הורדות היא בעצם תוכנית מחשב המוקדשת למשימה של הורדת קבצים עצמאיים מהאינטרנט. כאן אנו הולכים ליצור מנהל הורדות פשוט בעזרת שרשורים ב- Python. באמצעות ריבוי שרשורים ניתן להוריד קובץ בצורה של נתחים בו זמנית משרשורים שונים. כדי ליישם זאת, אנו הולכים ליצור כלי שורת פקודה פשוט שמקבל את כתובת האתר של הקובץ ואז מוריד אותו.

דרישות קדם: מכונת Windows עם Python מותקן.



הגדרה

הורד את החבילות המוזכרות למטה משורת הפקודה.

1. חבילת קליק: קליק היא חבילת Python ליצירת ממשקי שורת פקודה יפים עם כמה שפחות קוד לפי הצורך. זוהי ערכת יצירת ממשק שורת הפקודה.

לחץ להתקין pip



2. חבילת בקשות: בכלי זה אנו הולכים להוריד קובץ המבוסס על כתובת ה-URL (כתובות HTTP). Requests היא ספריית HTTP שנכתבה ב- Python המאפשרת לשלוח בקשות HTTP. אתה יכול להוסיף כותרות של קבצים ופרמטרים מרובי חלקים של נתונים באמצעות מילוני Python פשוטים ולגשת לנתוני התגובה באותו אופן.

בקשות להתקנת pip

להמיר מחרוזת למספר שלם

3. חבילת השחלה: כדי לעבוד עם חוטים אנחנו צריכים חבילת השחלה.



הברגה להתקין pip

יישום

פֶּתֶק:

התוכנית פוצלה לחלקים כדי שיהיה קל להבין אותה. ודא שלא חסר לך אף חלק מהקוד בזמן הפעלת התוכנית.

שלב 1: ייבוא ​​חבילות נדרשות

חבילות אלו מספקות את הכלים הדרושים כדי לגרום לבקשות אינטרנט לטפל בקלט שורת הפקודה וליצור שרשורים.

Python
import click import requests import threading 

שלב 2: צור את פונקציית המטפל

כל שרשור יבצע את הפונקציה הזו כדי להוריד את החלק הספציפי שלו מהקובץ. פונקציה זו אחראית לבקש רק טווח מסוים של בתים ולכתוב אותם למיקום הנכון בקובץ.

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: הגדר את הפונקציה הראשית בלחיצה

הופך את הפונקציה לשירות שורת פקודה. זה מגדיר כיצד משתמשים מקיימים אינטראקציה עם הסקריפט משורת הפקודה.

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: הגדר את שם הקובץ וקבע את גודל הקובץ

אנחנו צריכים את גודל הקובץ כדי לחלק את ההורדה בין שרשורים ולהבטיח שהשרת תומך בהורדות מטווחים.

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: הקצאת שטח קבצים מראש

הקצאה מוקדמת מבטיחה שהקובץ יהיה בגודל הנכון לפני שאנחנו כותבים נתחים לטווחי בתים ספציפיים.

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

שלב 6: צור שרשורים

לשרשורים מוקצים טווחי בתים ספציפיים להורדה במקביל.

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: הצטרף לשרשורים

מבטיח שכל השרשורים יסתיימו לפני סיום התוכנית.

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

קוד:

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


סיימנו עם חלק הקידוד ועכשיו בצע את הפקודות המוצגות למטה כדי להפעיל את קובץ ה-.py.

python filename.py –-help

תְפוּקָה:

help_output' title=python filename.py –-help


פקודה זו מציגה את השימוש בכלי פקודת הלחיצה ואפשרויות שהכלי יכול לקבל. להלן הפקודה לדוגמה שבה אנו מנסים להוריד קובץ תמונת jpg מכתובת URL וכן נתנו שם ומספר_חוטים.

צילום מסך-2025-04-07-155058' loading='lazy' title=פקודה לדוגמה להורדת jpg

אחרי הכל הפעלת הכל בהצלחה, תוכל לראות את הקובץ שלך (flower.webp במקרה זה) בספריית התיקיות שלך כפי שמוצג להלן:

צילום מסך-2025-04-07-155750' loading='lazy' title=מַדרִיך

לבסוף סיימנו עם זה בהצלחה וזו אחת הדרכים לבנות מנהל הורדות פשוט עם ריבוי הליכי ב-Python.