Python HTTP HEAD - правильная работа с перенаправлениями?

Я могу использовать urllib2 для выполнения таких запросов HEAD:

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

Проблема в том, что, когда это следует за перенаправлениями, он использует GET вместо HEAD.

Цель этого запроса HEAD - проверить размер и тип содержимого URL-адреса, который я собираюсь загрузить, чтобы я мог убедиться, что я не загружаю какой-то огромный документ. (URL-адрес предоставляется случайным пользователем Интернета через IRC).

Как я могу заставить его использовать запросы HEAD при следовании перенаправлениям?


person Krenair    schedule 01.04.2012    source источник
comment
Requests как минимум утверждает, что делает это правильно (по крайней мере, он документирует свое поведение перенаправления как работающее для идемпотентных методов и вызывает HEAD специально в документации).   -  person James Aylett    schedule 01.04.2012
comment
аналогичное решение: http://stackoverflow.com/questions/9890815/python-get-headers-only-using-urllib2/9892207#9892207   -  person newtover    schedule 02.04.2012


Ответы (2)


Хороший вопрос! Если вы настроены на использование urllib2, вам нужно будет посмотреть этот ответ о создании собственного обработчика перенаправления.

Короче (читай: явно украдено из предыдущего ответа):

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

Кроме того, как упоминалось в списке ошибок, вы можете использовать запросы Python.

person MrGomez    schedule 01.04.2012
comment
В итоге я использовал этот обработчик перенаправления, основываясь на том, что вы нашли: pastebin.com/m7aN21A7 Спасибо! - person Krenair; 02.04.2012

Вы можете сделать это с помощью библиотеки 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/'
person jterrace    schedule 01.04.2012