2012-04-01 27 views
7

mogę używać urllib2, aby wnioski głową jak tak: Python HTTP HEAD - zajmowanie się poprawnie przekierowaniami?

import urllib2 
request = urllib2.Request('http://example.com') 
request.get_method = lambda: 'HEAD' 
urllib2.urlopen(request) 

Problemem jest to, że wydaje się, że gdy wynika to przekierowania, używa GET zamiast głowy.

Celem tego żądania HEAD jest sprawdzenie rozmiaru i rodzaju zawartości adresu URL, który mam zamiar pobrać, aby upewnić się, że nie pobieram dużego dokumentu. (Adres URL jest dostarczany przez przypadkowego użytkownika internetu przez IRC).

Jak mogę użyć HEAD podczas przekierowań?

+3

[Wnioski] (http://docs.python-requests.org/en/latest/index.html) przynajmniej twierdzi zrobić tego Właściwy sposób (przynajmniej dokumentuje to zachowanie przekierowania jako działające dla idempotentnych metod i wywołuje HEAD specjalnie w dokumentach). –

+0

podobne rozwiązanie: http://stackoverflow.com/questions/9890815/python-get-headers-only-using-urllib2/9892207#9892207 – newtover

Odpowiedz

3

Dobre pytanie! Jeśli używasz urllib2, będziesz chciał spojrzeć na this answer na temat budowy własnego przekierowania.

W skrócie (czytaj: rażąco skradzione z poprzedniej odpowiedzi):

import urllib2 

#redirect_handler = urllib2.HTTPRedirectHandler() 

class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler): 
    def http_error_302(self, req, fp, code, msg, headers): 
     print "Cookie Manip Right Here" 
     return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers) 

    http_error_301 = http_error_303 = http_error_307 = http_error_302 

cookieprocessor = urllib2.HTTPCookieProcessor() 

opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor) 
urllib2.install_opener(opener) 

response =urllib2.urlopen("WHEREEVER") 
print response.read() 

print cookieprocessor.cookiejar 

Ponadto, jak wspomniano w errata, można użyć Python Requests.

+1

Skończyło się na użyciu tego narzędzia obsługi przekierowań, na podstawie tego, co znalazłeś: http://pastebin.com/m7aN21A7 Dzięki! – Krenair

+0

@Krenair Cieszę się, że mogę Ci pomóc! – MrGomez

9

Można to zrobić z biblioteką requests:

>>> import requests 
>>> r = requests.head('http://github.com', allow_redirects=True) 
>>> r 
<Response [200]> 
>>> r.history 
[<Response [301]>] 
>>> r.url 
u'https://github.com/'