import os
import shutil
from urllib.request import ProxyHandler, build_opener

proxy = 'http://proxy.example.net:8080'
opener = build_opener(ProxyHandler({
    'http': proxy,
    'https': proxy,
}))

temporary = 'archive.zip.part'
destination = 'archive.zip'

with opener.open('https://downloads.example.net/archive.zip',
                 timeout=20) as response:
    with open(temporary, 'wb') as output:
        shutil.copyfileobj(response, output)

os.replace(temporary, destination)

نشانی‌های URL و نام فایل‌ها را برای برنامه جایگزین کنید. برای دانلود مجاز یک فایل عمومی بدون احراز هویت پروکسی، فهرست پروکسی‌های HTTP می‌تواند نقاط پایانی نامزد را برای URL پروکسی فراهم کند. این بازکننده اختصاصی urllib از یک پروکسی HTTP برای مقصد HTTPS با بررسی معمول گواهی استفاده می‌کند. بازکننده سراسری نصب نمی‌کند؛ احراز هویت، در صورت نیاز، به پیکربندی پشتیبانی‌شده آن نیاز دارد.

copyfileobj به‌صورت تکه‌تکه کپی می‌کند. خروج از بافت فایل آن را می‌بندد و نوشته‌های بافرشده را پیش از آنکه os.replace نام نهایی را بنشاند، تخلیه می‌کند.

اگر درخواست یا کپی خطا بدهد، تغییر نام انجام نمی‌شود. ممکن است فایلی ناقص برای سیاست پاک‌سازی باقی بماند، و این جریان در آن شکست فایل نهایی موجود را دست‌نخورده می‌گذارد. در صورت موفقیت، جای‌گذاری می‌تواند آن فایل نهایی را بازنویسی کند، پس سیاست را آگاهانه انتخاب کنید.

برای کارهای هم‌زمان از نام‌های موقت یکتا استفاده کنید. اشیای بازکننده جداگانه از کارهایی که همان مسیر .part را به اشتراک می‌گذارند محافظت نمی‌کنند.

تنظیم 20 ثانیه‌ای عملیات سوکت پشتیبانی‌شده را محدود می‌کند، نه کل زمان دانلود را. مهلت کل کار به مدیریت جداگانه در برنامه نیاز دارد. تکمیل انتقال نیز از بررسی فایل دانلودشده جداست.

مقالات مرتبط