Python получает заголовки только с помощью urllib2

Я должен реализовать функцию, чтобы получить только заголовки (без выполнения GET или POST), используя urllib2. Вот моя функция:

def getheadersonly(url, redirections = True):
    if not redirections:
        class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
            def http_error_302(self, req, fp, code, msg, headers):
                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)

    class HeadRequest(urllib2.Request):
        def get_method(self):
            return "HEAD"

    info = {}
    info['headers'] = dict(urllib2.urlopen(HeadRequest(url)).info()) 
    info['finalurl'] = urllib2.urlopen(HeadRequest(url)).geturl() 
    return info

Использует код из ответаэто а такжеэто, Однако этоделается перенаправление, даже когда флагFalse, Я попробовал код с:

print getheadersonly("http://ms.com", redirections = False)['finalurl']
print getheadersonly("http://ms.com")['finalurl']

Это дает morganstanley.com в обоих случаях. Что здесь не так?

 bernie27 мар. 2012 г., 18:59

Ответы на вопрос(2)

Запрос HEAD с использованием httplib,ГОЛОВА запрос такой же, как запрос GET, но сервер не отправляет тело сообщения.

 jerrymouse27 мар. 2012 г., 15:55
И я уже ссылался на эту ссылку в моем вопросе.
 jerrymouse27 мар. 2012 г., 15:54
Я уже делаю это, проверьте 5-ую строку с конца. Однако проблема заключается в перенаправлении. Иногда я не хочу следовать перенаправлению, тогда как его перенаправление всегда.
Решение Вопроса

По каждому запросу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())
 jerrymouse28 мар. 2012 г., 13:59
спасибо за редактирование :)
 jerrymouse27 мар. 2012 г., 17:08
+1 Это сработало .. Спасибо @newtover
 newtover28 мар. 2012 г., 13:22
@ jerrymouse, я немного обновил код, чтобы правильно обрабатывать ошибки 40x и 50x.

Ваш ответ на вопрос