كنت أقوم بتحميل ملف باستخدام بيثون urllib2. كيف يمكنني التحقق من مدى ضخامة حجم الملف؟

StackOverflow https://stackoverflow.com/questions/1636637

  •  06-07-2019
  •  | 
  •  

سؤال

وإذا كانت كبيرة ... ثم وقف التحميل؟ أنا لا أريد لتحميل الملفات التي هي أكبر من 12MB.

request = urllib2.Request(ep_url)
request.add_header('User-Agent',random.choice(agents))
thefile = urllib2.urlopen(request).read()
هل كانت مفيدة؟

المحلول

وليس هناك حاجة كما bobince فعل وإسقاط لhttplib. يمكنك أن تفعل كل ذلك مع 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 الحال بالنسبة لك.

نصائح أخرى

هل يمكن القول:

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

ولكن بعد ذلك بالطبع كنت لا يزال يقرأ 12MB من البيانات غير المرغوب فيها. إذا كنت ترغب في تقليل خطر حدوث ذلك يمكنك التحقق من HTTP رأس طول المحتوى، إذا كان موجودا (قد لا تكون). ولكن للقيام بذلك تحتاج إلى ينزل إلى httplib بدلا من ذلك من urllib أعم.

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()

ويمكنك التحقق من طول قبل أن يطلب للحصول على الملف أيضا، إذا كنت تفضل ذلك. هذا هو في الأساس نفسه على النحو الوارد أعلاه، باستثناء باستخدام 'HEAD' طريقة بدلا من 'GET'.

ويمكنك التحقق من طول المحتوى طلب HEAD البداية، ولكن حذر من أن يكون، لا يكون هذا الرأس التي سيتم تحديدها - راجع <لأ href = "https://stackoverflow.com/questions/107405/how- القيام أولا الإرسال واحد في الرأس HTTP-طلب-في بيثون "> كيف تقوم بإرسال طلب HEAD HTTP في بايثون 2؟

وهذا العمل إذا تم تعيين رأس طول المحتوى

import urllib2          
req = urllib2.urlopen("http://example.com/file.zip")
total_size = int(req.info().getheader('Content-Length'))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top