Ich bin das Herunterladen einer Datei Python urllib2 verwenden. Wie kann ich überprüfen, wie groß die Dateigröße?

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

  •  06-07-2019
  •  | 
  •  

Frage

Und wenn es groß ist ... dann den Download stoppen? Ich möchte nicht, Dateien herunterladen, die als 12MB größer sind.

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

Lösung

Es gibt keine Notwendigkeit, wie bobince tat und fallen zu httplib. Sie können mit urllib alles tun direkt:

>>> 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'
>>> 

Wenn Sie httplib verwenden, dann können Sie Redirect Behandlung implementieren müssen, Proxy-Unterstützung, und die anderen schönen Dinge, die urllib2 für Sie.

Andere Tipps

Man könnte sagen:

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

aber dann habe gelesen, Sie natürlich noch 12MB von unerwünschten Daten. Wenn Sie das Risiko dafür minimieren geschieht können Sie die HTTP-Content-Length-Header überprüfen, falls vorhanden (es ist nicht sein könnte). Aber das tun, dass Sie bis zu httplib anstelle der allgemeineren urllib fallen müssen.

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

Sie können die Länge überprüfen, bevor er fragte die Datei zu bekommen, wenn Sie es vorziehen. Dies ist im Grunde das gleiche wie oben, nur mit der Methode 'HEAD' statt 'GET'.

können Sie den Inhalt Länge in einer HEAD-Anfrage zunächst prüfen, aber seien Sie gewarnt, nicht dieser Header nicht gesetzt werden müssen - siehe Wie Sie eine HEAD HTTP-Anforderung in Python nicht senden 2?

Das funktioniert, wenn der Content-Length-Header gesetzt ist

import urllib2          
req = urllib2.urlopen("http://example.com/file.zip")
total_size = int(req.info().getheader('Content-Length'))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top