א מנהל הורדות היא בעצם תוכנית מחשב המוקדשת למשימה של הורדת קבצים עצמאיים מהאינטרנט. כאן אנו הולכים ליצור מנהל הורדות פשוט בעזרת שרשורים ב- Python. באמצעות ריבוי שרשורים ניתן להוריד קובץ בצורה של נתחים בו זמנית משרשורים שונים. כדי ליישם זאת, אנו הולכים ליצור כלי שורת פקודה פשוט שמקבל את כתובת האתר של הקובץ ואז מוריד אותו.
דרישות קדם: מכונת Windows עם Python מותקן.
הגדרה
הורד את החבילות המוזכרות למטה משורת הפקודה.
1. חבילת קליק: קליק היא חבילת Python ליצירת ממשקי שורת פקודה יפים עם כמה שפחות קוד לפי הצורך. זוהי ערכת יצירת ממשק שורת הפקודה.
לחץ להתקין pip
2. חבילת בקשות: בכלי זה אנו הולכים להוריד קובץ המבוסס על כתובת ה-URL (כתובות HTTP). Requests היא ספריית HTTP שנכתבה ב- Python המאפשרת לשלוח בקשות HTTP. אתה יכול להוסיף כותרות של קבצים ופרמטרים מרובי חלקים של נתונים באמצעות מילוני Python פשוטים ולגשת לנתוני התגובה באותו אופן.
בקשות להתקנת pip
להמיר מחרוזת למספר שלם
3. חבילת השחלה: כדי לעבוד עם חוטים אנחנו צריכים חבילת השחלה.
הברגה להתקין pip
יישום
פֶּתֶק:
התוכנית פוצלה לחלקים כדי שיהיה קל להבין אותה. ודא שלא חסר לך אף חלק מהקוד בזמן הפעלת התוכנית.
שלב 1: ייבוא חבילות נדרשות
חבילות אלו מספקות את הכלים הדרושים כדי לגרום לבקשות אינטרנט לטפל בקלט שורת הפקודה וליצור שרשורים.
Pythonimport click import requests import threading
שלב 2: צור את פונקציית המטפל
כל שרשור יבצע את הפונקציה הזו כדי להוריד את החלק הספציפי שלו מהקובץ. פונקציה זו אחראית לבקש רק טווח מסוים של בתים ולכתוב אותם למיקום הנכון בקובץ.
Pythondef 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'