2011-03-14 11 views
7

मुझे पता है कि फ़ाइल डाउनलोड करने के लिए urllib का उपयोग कैसे करें। हालांकि, यह बहुत तेज़ है, अगर सर्वर इसे एक ही फाइल के कई हिस्सों को एक साथ डाउनलोड करने की अनुमति देता है और फिर उन्हें मर्ज करता है।पायथन के साथ एक साथ एक फ़ाइल के कई हिस्सों को डाउनलोड करें?

आप पाइथन में ऐसा कैसे करते हैं? यदि आप इसे मानक lib के साथ आसानी से नहीं कर सकते हैं, तो कोई भी lib जो आपको ऐसा करने देगा?

+7

आमतौर पर, यह समानांतर में फ़ाइल के कई हिस्सों को डाउनलोड करने के लिए तेज़ नहीं है, क्योंकि आप अभी भी अपने नेटवर्क कनेक्शन की बाधा तक सीमित हैं। केवल जब सर्वर केवल सीमित बैंडविड्थ * प्रति कनेक्शन * की अनुमति देता है, तो आपको एक सुधार मिलेगा। –

+0

यदि आप किसी भी तरह से इंप्रेशन के तहत हैं कि यह डाउनलोड गति प्राप्त करेगा जो आपको धार के साथ मिलती है, तो आप यह जानकर निराश होंगे कि एक क्लाइंट, एकल सर्वर केस में आपकी मदद नहीं करेगा। यह * तेज * है * यदि आप एकाधिक स्रोतों से डाउनलोड कर रहे हैं * और * कि आपके कुल डाउनलोड बैंडविड्थ की तुलना में प्रत्येक में कम अपलोड बैंडविड्थ है। आपके डाउनलोड बैंडविड्थ से अधिक या उसके बराबर एक (उपलब्ध) अपलोड बैंडविड्थ के साथ एक सर्वर से सीधे डाउनलोड से कोई डाउनलोड तेज नहीं है। –

+3

@ सेवन: यह झूठा है। वास्तविक दुनिया में, यह आमतौर पर अधिकतर स्ट्रीमों के साथ डाउनलोड करने के लिए अधिकांश सर्वरों के अधिकांश कनेक्शन पर बहुत तेज़ होता है। यह दुर्भाग्यपूर्ण है, और कारणों को ट्रैक करना मुश्किल हो सकता है, लेकिन यह वहां है और बहुत से लोगों के पास इसका सामना करने के अलावा कोई विकल्प नहीं है। ग्लेन के लिए –

उत्तर

6

PycURL ऐसा कर सकता है। PycURL libcurl के लिए एक पायथन इंटरफ़ेस है। इसका उपयोग पाइथन प्रोग्राम से यूआरएल द्वारा पहचाने गए ऑब्जेक्ट्स लाने के लिए किया जा सकता है, जो यूरिलिब पायथन मॉड्यूल के समान है। PycURL परिपक्व, बहुत तेज़ है, और कई सुविधाओं का समर्थन करता है।

+0

ठीक है यह सवाल का जवाब है ?? – pouya

12

हालांकि मैं मौजूदा पुस्तकालय का उपयोग करने के ग्रेगरी के सुझाव से सहमत हूं, यह ध्यान देने योग्य है कि आप Range HTTP शीर्षलेख का उपयोग कर ऐसा कर सकते हैं। यदि सर्वर बाइट-रेंज अनुरोध स्वीकार करता है, तो आप फ़ाइल के कई हिस्सों को समानांतर में डाउनलोड करने के लिए कई थ्रेड शुरू कर सकते हैं। यह टुकड़ा, उदाहरण के लिए, केवल बाइट्स 0..65535 निर्दिष्ट फ़ाइल के डाउनलोड करेगा:

import urllib2 
url = 'http://example.com/test.zip' 
req = urllib2.Request(url, headers={'Range':'bytes=0-65535'}) 
data = urllib2.urlopen(req).read() 

आप दूरस्थ संसाधन आकार निर्धारित और देखो एक HEAD अनुरोध भेजकर कि सर्वर का समर्थन करता है अनुरोध लेकर कर सकते हैं:

import urllib2 

class HeadRequest(urllib2.Request): 
    def get_method(self): 
     return "HEAD" 

url = 'http://sstatic.net/stackoverflow/img/sprites.png' 
req = HeadRequest(url) 
response = urllib2.urlopen(req) 
response.close() 
print respose.headers 

ऊपर प्रिंट:

Cache-Control: max-age=604800 
Content-Length: 16542 
Content-Type: image/png 
Last-Modified: Thu, 10 Mar 2011 06:13:43 GMT 
Accept-Ranges: bytes 
ETag: "c434b24eeadecb1:0" 
Date: Mon, 14 Mar 2011 16:08:02 GMT 
Connection: close 

से हम देख सकते हैं कि फ़ाइल का आकार 16,542 बाइट्स ('Content-Length') है और सर्वर बाइट सीमाओं का समर्थन करता है (012,381,)।

+1

+1 यह समझाने के लिए कि मैन्युअल रूप से ऐसा कैसे करें। –

+0

इसलिए आकार 65535 बाइट्स की फ़ाइल को 5 बफर = 13107 में विभाजित किया जा सकता है क्या इसका मतलब यह है कि प्रत्येक बफर की सीमा 'req = urllib2.Request (url, headers = {'श्रेणी': 'बाइट्स = 0-13107 '}) ' ' req2 = urllib2।अनुरोध (यूआरएल, हेडर = {'रेंज': 'बाइट्स = 13108-26214'}) ' ' req3 = urllib2.Request (url, headers = {'रेंज': 'बाइट्स = 26215-39321'}) ' ' req4 = urllib2.Request (url, headers = {'रेंज': 'बाइट्स = 3 9 322-52429'}) ' ' req5 = urllib2.Request (url, headers = {'रेंज': 'बाइट्स = 52430-65535'}) ' यदि हां, तो मैं उन्हें 'data = urllib2.urlopen (req) .read()' का उपयोग करके एक साथ कैसे रखूं? –

+0

@san, 5 थ्रेड शुरू करने का एक आसान तरीका होगा, प्रत्येक एक यूआरओपेन() को कॉल करेगा() एक श्रेणी के लिए पढ़ें और परिणाम को थ्रेड-सुरक्षित कंटेनर में संग्रहीत करेगा (इस सूची में एक सूची या निर्देश होगा)। फिर उन धागे के लिए मुख्य थ्रेड में प्रतीक्षा करें (जुड़ें()) और भागों को गठबंधन करें। – efotinis

संबंधित मुद्दे