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

מנהל הורדות מרובה-הליכים פשוט ב-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_outputpython filename.py –-help


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

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

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

צילום מסך-2025-04-07-155750מַדרִיך

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