Во-первых, ваш код содержит несколько ошибок:
При каждом запросе getheadersonly
вы устанавливаете новый глобальный urlopener, который затем используется в последующих вызовах urllib2.urlopen
Вы делаете два HTTP-запроса, чтобы получить два разных атрибута ответа.
Реализация urllib2.HTTPRedirectHandler.http_error_302
не так тривиальна, и я непонять, как он может предотвратить перенаправление в первую очередь.
По сути, вы должны понимать, что каждый обработчик установлен в открывателе для обработки определенного типа ответа.urllib2.HTTPRedirectHandler
предназначен для преобразования определенных http-кодов в перенаправления.Если вы не хотите перенаправления, не добавляйте обработчик перенаправления в открыватель.Если вы не хотите открывать FTP-ссылки, не добавляйте FTPHandler
и т. Д.
Все, что вам нужно, - это создать новый открыватель и добавить в него urllib2.HTTPHandler()
, настроить запрос так, чтобыЗапрос "HEAD" и передача экземпляра запроса открывателю, чтение атрибутов и закрытие ответа.
class HeadRequest(urllib2.Request):
def get_method(self):
return 'HEAD'
def getheadersonly(url, redirections=True):
opener = urllib2.OpenerDirector()
opener.add_handler(urllib2.HTTPHandler())
opener.add_handler(urllib2.HTTPDefaultErrorHandler())
if redirections:
# HTTPErrorProcessor makes HTTPRedirectHandler work
opener.add_handler(urllib2.HTTPErrorProcessor())
opener.add_handler(urllib2.HTTPRedirectHandler())
try:
res = opener.open(HeadRequest(url))
except urllib2.HTTPError, res:
pass
res.close()
return dict(code=res.code, headers=res.info(), finalurl=res.geturl())