2009-10-28 4 views
9

और यदि यह बड़ा है ... तो डाउनलोड को रोकें? मैं 12 एमबी से बड़ी फ़ाइलों को डाउनलोड नहीं करना चाहता हूं।मैं पायथन urllib2 का उपयोग कर एक फ़ाइल डाउनलोड कर रहा हूँ। मैं कैसे जांचूं कि फाइल का आकार कितना बड़ा है?

request = urllib2.Request(ep_url) 
request.add_header('User-Agent',random.choice(agents)) 
thefile = urllib2.urlopen(request).read() 

उत्तर

19

bobince की आवश्यकता नहीं है और प्रेजेंटप्लिब पर जाएं। आप urllib सीधे के साथ सभी ऐसा कर सकते हैं:

>>> import urllib2 
>>> f = urllib2.urlopen("http://dalkescientific.com") 
>>> f.headers.items() 
[('content-length', '7535'), ('accept-ranges', 'bytes'), ('server', 'Apache/2.2.14'), 
('last-modified', 'Sun, 09 Mar 2008 00:27:43 GMT'), ('connection', 'close'), 
('etag', '"19fa87-1d6f-447f627da7dc0"'), ('date', 'Wed, 28 Oct 2009 19:59:10 GMT'), 
('content-type', 'text/html')] 
>>> f.headers["Content-Length"] 
'7535' 
>>> 

आप httplib का उपयोग करते हैं तो आपको इस रीडायरेक्ट हैंडलिंग, प्रॉक्सी समर्थन, और कहा कि urllib2 आप के लिए करता है अन्य अच्छा चीजों को लागू करने के लिए हो सकता है।

1

आप एक HEAD अनुरोध में सामग्री-लंबाई की जांच कर सकते हैं पहले, लेकिन चेतावनी दी, इस शीर्ष लेख सेट करने की आवश्यकता नहीं है - देखना How do you send a HEAD HTTP request in Python 2?

+0

सेट किया गया है मैं कैसे HEAD अनुरोध में सामग्री-लंबाई की जांच करते हैं काम करेंगे? क्या यह हेडर डाउनलोड करने पर विचार किया जाता है? – TIMEX

+0

यदि आप urllib/urllib2 का उपयोग करना चाहते हैं तो एक हेड अनुरोध करना सर्वोत्तम सैद्धांतिक है। वे मॉड्यूल केवल जीईटी और POST अनुरोधों का समर्थन करते हैं। –

7

आप कह सकते हैं:

maxlength= 12*1024*1024 
thefile= urllib2.urlopen(request).read(maxlength+1) 
if len(thefile)==maxlength+1: 
    raise ThrowToysOutOfPramException() 

लेकिन फिर भी आपने अभी भी 12 एमबी अनचाहे डेटा पढ़ा है। यदि आप इस घटना के जोखिम को कम करना चाहते हैं तो आप HTTP सामग्री-लंबाई शीर्षलेख की जांच कर सकते हैं, यदि मौजूद है (यह नहीं हो सकता है)। लेकिन ऐसा करने के लिए आपको अधिक सामान्य urllib के बजाय httplib पर ड्रॉप करने की आवश्यकता है।

u= urlparse.urlparse(ep_url) 
cn= httplib.HTTPConnection(u.netloc) 
cn.request('GET', u.path, headers= {'User-Agent': ua}) 
r= cn.getresponse() 

try: 
    l= int(r.getheader('Content-Length', '0')) 
except ValueError: 
    l= 0 
if l>maxlength: 
    raise IAmCrossException() 

thefile= r.read(maxlength+1) 
if len(thefile)==maxlength+1: 
    raise IAmStillCrossException() 

यदि आप चाहें तो फ़ाइल प्राप्त करने के लिए पूछने से पहले आप लंबाई की जांच कर सकते हैं। 'GET' के बजाय विधि 'HEAD' का उपयोग करने के अलावा, यह मूल रूप से उपरोक्त जैसा ही है।

+0

बहुत बहुत धन्यवाद। एसएसडीएफ – TIMEX

+1

यह एक बेहतर समाधान है, क्योंकि सामग्री-लंबाई विश्वसनीय नहीं है (कोई इसे गलत तरीके से सेट कर सकता है) –

+0

सही समाधान - स्वीकार्य होना चाहिए! –

1

यह अगर सामग्री-लंबाई हेडर

import urllib2   
req = urllib2.urlopen("http://example.com/file.zip") 
total_size = int(req.info().getheader('Content-Length')) 
+0

आपको '.strip() ': 1 की आवश्यकता नहीं है। 1. getheader()' पहले से ही छीन लिया संस्करण 2 लौटाता है।' Int() 'अग्रणी/पिछला सफेद स्थान के बारे में परवाह नहीं करता है। – jfs

+0

इसके अलावा, 'int (info()। Getheader()) का उपयोग करने का कोई मतलब नहीं है,' यदि आप डिफ़ॉल्ट मान सेट नहीं करते हैं: 'int' से ValueError'' req.headers से 'KeyError' से कम उपयुक्त है '(नोट:' req.info() req.headers') – jfs

+0

@ गोरनेउ - क्या यह अभी भी काम करेगा यदि निर्दिष्ट यूआरएल ftp: // url है? –

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

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