Փրոքսիով ներբեռնումը ֆայլի հոսքային փոխանցում Python urllib-ով
Փրոքսիով ներբեռնումը հոսքով փոխանցեք ժամանակավոր ֆայլի և վերջնական ֆայլի անունը հրապարակեք միայն պատճենումն ավարտվելուց հետո։
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 բացիչը HTTPS նպատակակետի համար օգտագործում է HTTP փրոքսի՝ սերտիֆիկատի սովորական ստուգմամբ։ Այն չի տեղադրում գլոբալ բացիչ. նույնականացումը, անհրաժեշտության դեպքում, պահանջում է իր աջակցվող կարգավորումը։
copyfileobj պատճենում է մասերով։ Ֆայլի կոնտեքստից դուրս գալը փակում է այն և դատարկում բուֆերացված գրառումները, մինչև os.replace կտեղադրի վերջնական անունը։
Եթե հարցումը կամ պատճենումը սխալ է առաջացնում, վերանվանումը բաց է թողնվում։ Մաքրման քաղաքականության համար կարող է մնալ մասնակի ֆայլ, և այս հոսքը այդ ձախողման դեպքում անփոփոխ է թողնում գոյություն ունեցող վերջնական ֆայլը։ Հաջողության դեպքում փոխարինումը կարող է վերագրել այդ վերջնական ֆայլը, ուստի քաղաքականությունն ընտրեք գիտակցաբար։
Զուգահեռ աշխատանքների համար օգտագործեք եզակի ժամանակավոր անուններ։ Առանձին բացիչ օբյեկտները չեն պաշտպանում նույն .part ուղին կիսող աշխատանքները։
20 վայրկյանի կարգավորումը սահմանափակում է աջակցվող socket գործողությունները, ոչ թե ներբեռնման ընդհանուր ժամանակը։ Ամբողջ աշխատանքի ժամկետի համար անհրաժեշտ է առանձին մշակում հավելվածում։ Փոխանցման ավարտը նույնպես առանձին է ներբեռնված ֆայլի ստուգումից։