Как я могу предотвратить urllib (2) Python от перенаправления - PullRequest
47 голосов
/ 16 февраля 2009

В настоящее время я пытаюсь зайти на сайт с помощью Python, однако сайт, похоже, отправляет cookie и заявление о перенаправлении на той же странице. Похоже, что Python следит за этим перенаправлением, что не позволяет мне читать куки, отправленные со страницы входа в систему. Как запретить urloib (или urllib2) Python следовать за перенаправлением?

Ответы [ 4 ]

33 голосов
/ 17 февраля 2009

Вы можете сделать пару вещей:

  1. Создайте свой собственный HTTPRedirectHandler, который перехватывает каждое перенаправление
  2. Создайте экземпляр HTTPCookieProcessor и установите его, чтобы у вас был доступ к cookiejar.

Это быстрая маленькая вещь, которая показывает оба

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
29 голосов
/ 31 июля 2012

Если все, что вам нужно, это остановить перенаправление, то есть простой способ сделать это. Например, я хочу получать только cookie-файлы и для лучшей производительности не хочу, чтобы меня перенаправляли на любую другую страницу. Также я надеюсь, что код сохраняется как 3xx. давайте использовать, например, 302.

class MyHTTPErrorProcessor(urllib2.HTTPErrorProcessor):

    def http_response(self, request, response):
        code, msg, hdrs = response.code, response.msg, response.info()

        # only add this line to stop 302 redirection.
        if code == 302: return response

        if not (200 <= code < 300):
            response = self.parent.error(
                'http', request, response, code, msg, hdrs)
        return response

    https_response = http_response

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), MyHTTPErrorProcessor)

Таким образом, вам даже не нужно заходить в urllib2.HTTPRedirectHandler.http_error_302 ()

Еще более распространенным случаем является то, что мы просто хотим остановить перенаправление (при необходимости):

class NoRedirection(urllib2.HTTPErrorProcessor):

    def http_response(self, request, response):
        return response

    https_response = http_response

И обычно используйте это так:

cj = cookielib.CookieJar()
opener = urllib2.build_opener(NoRedirection, urllib2.HTTPCookieProcessor(cj))
data = {}
response = opener.open('http://www.example.com', urllib.urlencode(data))
if response.code == 302:
    redirection_target = response.headers['Location']
12 голосов
/ 16 февраля 2009

urllib2.urlopen вызывает build_opener(), который использует этот список классов обработчиков:

handlers = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor]

Вы можете попробовать сами вызвать urllib2.build_opener(handlers) со списком, в котором отсутствует HTTPRedirectHandler, а затем вызвать метод open() в результате, чтобы открыть свой URL. Если вы действительно не любите перенаправления, вы можете даже позвонить urllib2.install_opener(opener) на ваш собственный перенаправитель без перенаправления.

Похоже, ваша настоящая проблема в том, что urllib2 не делает куки так, как вам бы хотелось. См. Также Как использовать Python для входа на веб-страницу и получения файлов cookie для последующего использования?

3 голосов
/ 16 февраля 2009

Этот вопрос задавался раньше здесь .

РЕДАКТИРОВАТЬ: Если вам приходится иметь дело с причудливыми веб-приложениями, вам, вероятно, стоит попробовать mechanize . Это отличная библиотека, которая имитирует веб-браузер. Вы можете контролировать перенаправление, файлы cookie, обновления страниц ... Если веб-сайт не [сильно] полагается на JavaScript, вы очень хорошо справитесь с механизацией.

...