2009-10-28 7 views

Odpowiedz

19

Nie ma potrzeby, ponieważ bobince zrobiłeś i upuściłeś na httplib. Można zrobić wszystko, z urllib bezpośrednio:

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

Jeśli używasz httplib następnie można zaimplementować obsługę przekierowania, wsparcie proxy i inne miłe rzeczy, które urllib2 robi dla Ciebie.

1

można sprawdzić Content-Length w żądaniu HEAD pierwszy, ale ostrzegamy, to nagłówek nie musi być ustawiony - patrz How do you send a HEAD HTTP request in Python 2?

+0

Jak mogę sprawdzić Content-Length w żądaniu głowie? Czy to jest uważane za pobieranie nagłówków? – TIMEX

+0

Wykonanie żądania HEAD jest w najlepszym wypadku teoretyczne, jeśli chcesz użyć urllib/urllib2. Moduły obsługują tylko żądania GET i POST. –

7

można powiedzieć:

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

, ale oczywiście nadal czytasz 12 MB niechcianych danych. Jeśli chcesz zminimalizować ryzyko takiego zdarzenia, możesz sprawdzić nagłówek HTTP Content-Length, jeśli jest obecny (może nie być). Ale aby to zrobić, musisz przejść do httplib zamiast do bardziej ogólnego adresu URL.

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

Możesz sprawdzić długość przed pytaniem, aby pobrać plik, jeśli wolisz. Jest to zasadniczo takie samo jak powyżej, z wyjątkiem metody 'HEAD' zamiast z .

+0

wielkie dzięki. ssdf – TIMEX

+1

To jest lepsze rozwiązanie, ponieważ długość zawartości nie jest niezawodna (ktoś może nieprawidłowo ustawić). –

+0

Idealne rozwiązanie - powinno być akceptowane! –

1

To będzie działać, jeśli nagłówek Content-Length jest ustawiony

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

Nie potrzebujesz '.strip()': 1. 'getheader()' już zwraca wersję usuniętą 2. 'int()' nie dba o wiodące/końcowe spacje. – jfs

+0

Ponadto nie ma sensu używać 'int (info(). Getheader())' jeśli nie ustawisz wartości domyślnej: 'ValueError' od' int' jest mniej odpowiednie niż 'KeyError' od' req.headers '(uwaga:' req.info() is req.headers') – jfs

+0

@Gourneau - Czy to nadal działa, jeśli podany adres URL to ftp: // url? –

Powiązane problemy