Pregunta

Actualmente estoy tratando de iniciar sesión en un sitio usando Python sin embargo, el sitio parece estar enviando una galleta y una declaración de redirección en la misma página. Python parece ser que redirigen siguiente evitando así que me de la lectura de la cookie de enviar por la página de inicio de sesión. ¿Cómo evito que urllib de Python (o urllib2) urlopen de seguir el redireccionamiento?

¿Fue útil?

Solución

Se podría hacer un par de cosas:

  1. Construir su propia HTTPRedirectHandler que intercepta cada redireccionamiento
  2. Crea una instancia de HTTPCookieProcessor e instalar que el abridor para que tenga acceso a la CookieJar.

Esta es una pequeña cosa rápida que muestra tanto

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

Otros consejos

Si todo lo que necesita es detener la redirección, entonces hay una forma sencilla de hacerlo. Por ejemplo yo sólo quiero conseguir las cookies y para un mejor rendimiento que no quiero ser redirigido a cualquier otra página. También espero que el código se mantiene como 3xx. vamos a utilizar 302 por ejemplo.

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)

De esta manera, usted ni siquiera necesita para entrar en urllib2.HTTPRedirectHandler.http_error_302 ()

Sin embargo, el caso más común es que simplemente queremos dejar de redirección (según sea necesario):

class NoRedirection(urllib2.HTTPErrorProcessor):

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

    https_response = http_response

Y normalmente usarlo de esta manera:

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']

urllib2.urlopen llama build_opener() que utiliza esta lista de clases de controlador:

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

Se podría intentar llamar urllib2.build_opener(handlers) a sí mismo con una lista que omite HTTPRedirectHandler, a continuación, llamar al método open() en el resultado de abrir su dirección URL. Si realmente desagrada redirecciones, incluso se podría llamar urllib2.install_opener(opener) a su propio abridor no redireccionamiento.

Parece que su verdadero problema es que urllib2 no está haciendo galletas de la forma en que desea. Ver también Cómo utilizar Python para acceder a una página web y recuperar las cookies para un uso posterior?

Esta pregunta se hizo antes de aquí .

editar Si usted tiene que hacer frente a las aplicaciones web extravagantes probablemente debería probar mecanizar . Es una gran biblioteca que simula un navegador web. Puede controlar redireccionamiento, galletas, página se actualiza ... Si la página web no se basa [en gran medida] en JavaScript, que obtendrá a lo largo muy bien con mecanizar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top